老码农眼中的软件测试

冒烟测试 smoke test

冒烟测试是在将代码更改签入到产品的发布版之前对这些更改进行验证的过程。在检查了代码后,冒烟测试是确定和修复软件缺陷的最经济有效的方法。冒烟测试用于确认代码中的更改会按预期运行,且不会破坏整个版本的稳定性。简单地说,冒烟测试是对软件基本的功能进行测试,以确认基本功能正常,保证系统能跑起来,正是进入测试阶段的版本必须首先通过冒烟测试的考验。

回归测试 regression test

回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。回归测试在整个软件测试过程中占有很大的工作量比重,开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中,新版本的连续发布使回归测试进行的更加频繁,而在极限编程等敏捷流程中,更是要求每天都进行若干次回归测试。因此,选择正确的回归测试策略来改进回归测试的效率和有效性是非常有意义的。

压力测试 stress test

压力测试往往被安排在测试流程中相对靠后的阶段,是性能测试和健壮性测试的一部分。压测通过确定一个系统的瓶颈或者不能接受的性能点,来确定产品或服务可以正常服务的最高性能。通过测试系统在资源超负荷情况下的表现,或者在系统资源特别低的情况下软件系统运行情况,找到系统在哪里失效以及如何失效的地方。

其他针对专项的测试还有很多,例如面向配置的容量测试,面向安全的渗透性测试等等。

自动化测试

软件研发敏捷性的一个重要表征就是产品的自动化测试程度。自动化测试一般是使用自动化测试工具来进行的测试,不需要人为的干预。然而,自动化测试不是把手工测试从测试过程中抛弃,也不是要用自动化测试替代掉所有的手工测试。

自动化测试的前提是有充分的测试设计和数据准备,其中测试覆盖度完全是由测试设计来决定的,这就是测试架构师非常难得的原因之一。个人认为,自动测试更适合于相对稳定的功能测试,压力测试,尤其是各种回归测试。

客户端自动化测试工具一瞥

很多客户端平台自带了一些测试工具,例如Android 上的Monkey等,可以编写脚步利用这些工具。

Web 测试: Selenium

Selenium 是一组跨平台的web应用自动化测试工具。通过使用Selenium,开发人员在不需要学习任何测试脚本语言的情况下,可以很容易地使用记录/回放测试工具来编写测试,让我想起了久远的MS-Test。

Selenium 提供对众多编程语言的支持,包括c#、Java、Groovy、Perl、PHP、Python、Ruby和各种流行的测试框架。

APP 测试:Appium

Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台,使用WebDriver的json wire协议,来驱动iOS系统的UIAutomation库和Android系统的UIAutomator框架。

Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure等,也可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架,支持真正的跨平台自动化测试。

Appium采用C/S架构,客户端对webdriver做了封装,读取各种语言编写的测试脚本并转换为测试命令发送给服务端。服务端的两个功能,一是接收从Appium Client发送过来的命令(也就是测试用例),另一个是作为bootstrap客户端,接收client的命令后,通过socket方式,发给目标android机器的bootstrap,驱动Uiautomator执行自动化操作。

类似的还有rebotium 等。

服务端的自动化测试工具一瞥

服务端测试包括两部分:一种是针对web或app的服务端进行测试;另一种是针对后端的数据库,缓存系统,中间件或文件系统等进行的测试, 自动化工具不胜枚举。

请求模拟:postman

postman是Chrome的一个插件,从字面意思理解就是能够发送POST请求的工具,是一个非常卓越的WebAPI接口测试的工具,能够非常方便的构造Web请求并且验证返回的结果信息。如果用浏览器直接请求查看接口返回结果的话,修改参数以及发送post请求时很不方便,postman就提供了这些便利。

Postman请求支持多种格式解析如JSON/XML/文本,支持管理请求包括分组、重命名等,支持导出数据包存为文件或者云存储,而且是跨平台的,通过api 编程接口可以实现基于postman 的自动化测试。

抓包分析:charles

Charles 常用的网络抓包工具,通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络包的截取和分析,配合 SSL 功能,还可以分析Https协议。Charles 支持重发网络请求,修改网络请求参数,支持网络请求的截获并动态修改,更重要的是支持模拟慢速网络。

当然,也可以使用其他sniffer 工具配合wireshark 完成传输链路的自动化测试。

压力测试:AB

压测的工具很多,ab、http_load、webbench、siege等等。ab是apache自带的压力测试工具,是apachebench命令的简称。它非常实用,它不仅可对apache服务器进行访问压测,也可以对其它类型的服务器进行压测,比如nginx、tomcat等。

ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存,却会给目标服务器造成巨大的负载,其原理类似CC攻击。使用时需要注意的是,在刚开始压测的时候,负载不要太大,否则可能造成目标服务器资源耗完,严重时甚至导致死机。

对应更加完备的压测,可以使用LoadRunner 等其他商业工具软件。

面向测试的开发

对于程序员来讲,测试是保证高质量软件的关键手段之一。将质量思维融入开发流程,可以采用测试驱动开发(TDD)的极限编程方法,从业务入手,以测试先行的方法来反向推动代码的实现。 

简单的说,就是每当需要添加一个新功能,或修改现有功能时,首先思考这部分代码期望达到的输入与输出,先把验证该业务的单元测试用例写出来,再去写最简单的实现代码来通过该测试;不断重复此过程直到完成整个功能。 

典型的TDD开发步骤如下: 

  • 1.分析并确定一个目标场景 ;
  • 2.用一个单元测试来验证该场景的输入输出 ;
  • 3.运行该测试,得到失败的测试结果 ;
  • 4.以最简单的功能代码来通过该测试 ;
  • 5.再次运行该测试,测试通过;
  • 6.进行代码重构,包括功能代码和单元测试代码; 
  • 7.重复以上步骤,直至开发完成;

在TDD中遵循一切从简的原则,以业务为导向,隔离目标场景,通过重构改进代码的可读性,可维护性,减少冗余代码等。同时维护一个测试列表 - 在开始开发之前,先列出所有需要的测试,并在开发中不断维护该列表,避免遗忘一些必要的测试。提高效率,不需要另外单独的文档,而是在测试类中对每个测试方法对应的业务场景,输入和期望的输出进行详细的描述。



留言