自动化测试框架

非常认可这句话:
自动化测试是为了提高效率,测试脚本要易维护,不能让测试脚本变成另一种技术债务,不能为了自动化测试而自动化测试。

文章转自:持续集成实践之自动化测试

软件测试

软件测试大概这么分类:

  • 黑盒测试 VS 白盒测试,以及介于黑盒白盒之间的灰盒测试
  • 按测试粒度可分为: unit test, functional test, integration test, system test, acceptance test 等
  • 按测试目的可分为: sanity test(smoke test), build verification test(BVT), regression test, stress test, performance test, usability test, security test, ad hoc test 等
  • 按是否自动化可分为: manual test VS automated test (简称TA)

BVT, regression test, performance test等都应该是automated test, 否则测试效率会很低.
在TA成本可接受的情况下,应该尽可能将测试都做成automated test, 除非某些测试需要人来校验(界面是否美观,音视频质量是否可接受等).

自动化测试

自动化测试就是用程序测试程序。项目需要快速迭代快速交付,或手工测试无法完成(譬如性能测试)时,就需要考虑自动化测试,自动化测试可以简单分为:

  • UI driven testing - 模拟鼠标键盘事件来验证程序行为,或者录制回放(UI通常变化较快,录制脚本不容易维护,因此不推荐)
  • Code driven
    • testingUnit Test - 利用xUnit框架测试类方法,模块接口,库接口的输入输出来验证程序行为
    • API driven testing - 程序常常分层设计,可以测试每一层的API interface来验证程序行为

记住,自动化测试是为了提高效率,测试脚本要易维护,不能让测试脚本变成另一种技术债务,不能为了自动化测试而自动化测试。

自动化测试框架

正如有各种各样的开发框架,自动化测试也有各种各样的框架,这些框架可以帮助我们更快速的实现自动化测试,更方便的写测试脚本,让我们更专注于项目逻辑和测试本身,自动化测试框架非常多,有的开源,有的收费,开源测试框架基本能满足我们的大多数需要,因此我们将主要推荐开源测试框架。
如何选择测试框架?不同框架适用不同测试目的,支持不同平台,支持不同语言等,想明白这几个问题就很容易找到适合自己的框架了。
Unit test, UI driven test, performance test这三种类型是比较常见的自动化测试类型,相应的自动化测试框架也多一些。
下面列出一些比较常见的框架,后面会详细介绍一些框架。

  • STAF/STAX - Software Test Automation Framework (STAF) 是由IBM开发的开源、跨平台、支持多语言的自动化测试框架

  • Robot Framework

    • 由Nokia Networks提供的跨平台、支持Python,Java等语言的开源测试框架,主要代码由Python实现,是一种keyworld driven的测试框架。可以通过XML-RPC插件实现跨机器的testing。Robot Framework + Selenium是比较常见的web UI的测试方案。
    • STAF和Robot Framework都属于管理执行框架,本身不提供基础的自动化测试支持,一般会集成一个其他自动化测试框架,譬如robot可以集成selenium,http://wiki.opensfs.org/Automation_framework_evaluation有STAF vs Robot Framework的比较.
  • TestNG - Java功能测试一般使用这个框架

  • JMeter - Java性能测试一般使用这个框架

  • UI testing framework:

    • QTP(收费) - HP QuickTest Professional
    • calabash-android, calabash-ios - 移动平台的测试框架
    • Selenium/webdriver - web UI测试一般使用这个框架
    • Robotium - android UI测试一般使用这个框架
    • AutoIt - windows UI,基于windows控件消息
    • UI Automation - 微软提供的测试框架,基于MSAA技术
  • LoadRunner(收费) - HP提供,用于性能测试

iOS/Android/OSX等平台都自带了测试自动化的支持,Visual Stadio和Xcode也包含自动化测试工具.

xDD

软件工程界流行各种xDD (x driven developmen),下面介绍几个:

TDD - Test Driven Development
大概的流程是先针对每个功能点抽象出接口代码,然后编写单元测试代码,接下来实现接口,运行单元测试代码,循环此过程,直到整个单元测试都通过。

BDD - Behavior Driven Development
BDD基于TDD,使用Given/When/Then的句式描述一个个use case,描述更接近自然语言和容易理解,方便DEV/QA/PO/stakeholders等人员相互交流。Cucumber是目前流行的BDD框架,由Ruby实现。

其他的xDD还有IDD(Inteface Driven Development), DDD(Domain Driven Development), FDD(Feature Driven Development), MDD(Model Driven Development), ATDD(Acceptance Test-Driven Development)等。
个人认为,程序能做到Interface Driven Design就可以有效的实现模块间的解耦和方便测试代码的编写,IDD也是TDD的基础,因此开发代码时需要先做到IDD,再做到TDD,其他的xDD则未必需要。

单元测试框架 - xUnit/xMock

单元测试是最常见的测试类型,一般为xUnit框架,常用的Unit Test框架有:

  • Java - JUnit, TestNG, jMock
  • C++ - Google Test, Google Mock
  • JavaScript - QUnit, JSTestDriver
  • Python - py.test, nose
  • C# - NUnit

更多阅读:

STAF/STAX

Software Test Automation Framework (STAF) 是由IBM开发的开源、跨平台、支持多语言的自动化测试框架,主要代码由C++实现,支持Windows/Linux/Mac/Solaris等平台。

STAF封装了不同平台和不同语言间通信的复杂性,提供了消息、互斥、同步、日志等可复用的服务,使用户可以在此基础上方便快速地构建自动化测试解决方案。

STAFProc

STAF的核心是一个后台程序STAFProc,也叫STAF Daemon,举例,如果你想在你的本地linux机器上驱动实验室里的3台windows test machine和2台mac test machine,那么需要在这6台机器上都装上STAF,也就是说,这6台机器上都运行STAFProc程序,如下图:


STAFProc

从STAF的环境里,并没有客户端/服务器的区别,这6台机器都是平等的,从一个STAF端可以直接调用另一个STAF端提供的服务。

STAF Service

STAF是一个插件架构,这些插件就是Service,STAF的具体功能都是由各种service提供,STAFProc自带了一些service(称为内部service),也有很多外部service,用户还可以开发自己的service,外部Service可以用C++或Java开发,STAF可以加载DLL文件或JAR文件里的Service。


STAF Service

内部Service和STAFProc在一起,这表示内部Service是永远可用的,名字也是固定的,下面是几个常见的内部Service(非完整列表):

  • DIAG - diagnostics, 用于调试
  • DELAY - 延迟等待一段时间
  • FS - file system, 用于文件操作
  • PING - 检查本地或远程服务是否可用
  • PROCESS - 可以启动、停止或者查询进程
  • SHUTDOWN - 用于shutdown STAFProc

外部service一般需要到STAF官网去下载服务组件包,一般服务组件包下完后还需要一些配置,下面是一些常用的外部服务:

  • STAX - 一个基于XML的执行引擎,在XML中定义测试工作流,可以实现并行执行、嵌套测试用例、控制运行时间等,STAX支持Java 和 Python 模块
  • CRON - 定义定时任务,使用Jenkins的话,也可以在Jenkins里定义定时任务
  • EMAIL - 发送邮件
  • HTTP - 发送HTTP请求
  • ZIP - 提供压缩与解压

STAF Requests

STAF实现了跨机器的通讯,用户程序通过发送请求来调用各个服务的功能,每个请求都以字符串的形式发送,这样可以保证 STAF 能够跨平台的运行。每个请求都有三个参数,以“系统-服务-参数”的形式出现,第一个参数表示此请求需要被发送到的哪个机器,第二个参数表示要调用哪个Service,第三个参数传给被调用的Service使用。举例,"STAF local ECHO hello"表示调用本机的ECHO Service,“STAF 1.2.3.4 PING PING”表示调用机器1.2.3.4上的PING服务。

STAF的通讯层基于CORBA,http://www.51testing.com/html/36/n-73836.html详细介绍了STAF的由来和设计细节。

Windows GUI测试 - MSAA与AutoIt

MSAA全称为Microsoft Active Accessibility,基于COM技术,核心接口是IAccessible,MSAA的下一代产品是UI Automation (UIA),核心接口为IAccessibleEx和IRawElementProviderSimple,从 Windows7以来,微软在努力把它的accessibility technologies放进一个framework里面,称之为Windows Automation API。详情参考博客

Windows GUI的自动化测试一般都是基于MSAA技术,被测程序需要支持MSAA/UIA,实现对应的COM接口,然后测试程序就可以通过MSAA接口读取UI元素。

另一个测试windows UI的常用工具是AutoIt,AutoIt基于类似Spy++的窗口技术,可以识别标准的window控件,使用类似basic的自有语言来写test case,AutoIt不仅用于Windows GUI测试,也常用来开发windows平台工具软件来自动执行常见的任务,还常用来开发计算机游戏机器人,用来自动执行游戏中的任务等。
更多阅读: http://en.wikipedia.org/wiki/List_of_GUI_testing_tools

Web UI测试 - Selenium WebDriver

Selenium是由ThoughtWorks公司开发的开源的web自动化测试工具,用于自动化浏览器。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持所有主流浏览器,也支持多种语言来编写测试代码,是应用最广泛的web程序自动化测试工具.

Selenium 2.0(又名 Selenium WebDriver)的主要新功能是集成了 WebDriver。WebDriver 曾经是 Selenium 1(又名 Selenium Remote Control, 简写为Selenium RC)的竞争对手。Selenium RC 在浏览器中运行 JavaScript 应用,而 WebDriver 通过原生浏览器支持或者浏览器扩展直接控制浏览器。

Selenium 1.0 + WebDriver = Selenium 2.0

Selenium 1 是一款流行和完善的测试框架,支持众多浏览器(因其 JavaScript 实现),允许用户通过许多编程语言(从 Java/C# 到 PHP、Erlang...)编写测试脚本,而 WebDriver 则弥补了 Selenium 1 的缺点,跳出了 JavaScript 的沙箱,提供快速、轻量级的浏览器模拟器。之所以合并,原因如下:

  • WebDriver 解决了 Selenium 存在的缺点(比如,绕过 JS 沙箱)
  • Selenium 解决了 WebDriver 存在的问题(例如支持广泛的浏览器)

WebDriver 针对各个浏览器而开发,使用各个浏览器提供的native support操纵浏览器,取代了 Selenium RC 中嵌入到被测 Web 应用中的 JavaScript,与浏览器的紧密集成可以支持创建更高级的测试,且避免了 JavaScript 安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver 还利用操作系统级的调用模拟用户输入。

WebDriver 支持 Firefox (FirefoxDriver)、IE (InternetExplorerDriver)、Opera (OperaDriver) 和 Chrome (ChromeDriver)。它还支持 Android (AndroidDriver) 和 iPhone (IPhoneDriver) 的移动应用测试。此外,还包括一个基于 HtmlUnit 的无界面实现,即 HtmlUnitDriver。WebDriver API 可以通过 Python、Ruby、Java 和 C# 访问,支持开发人员使用他们偏爱的编程语言来创建测试。

Selenium 2.0包含如下几个工具:

  • Selenium IDE - 一个Firefox插件,录制回放用户的基本操作,生成测试用例
  • Selenium WebDriver - 前身为Selenium RC, 包括一组browser driver和不同语言对应的language bindings, 支持多种平台(Windows,Linux,Mac等)和多种浏览器(IE,Firefox,Opera,Safari,Chrome等),可以用多种语言(Java,Ruby,Python,Perl,PHP,C#等)编写测试用例
  • Selenium Server - 单机运行测试脚本时无需这个工具,使用Selenium Grid分发到远程机器上运行Webdriver测试脚本时需要

假设在Mac机器上用Java写测试脚本在Chrome里测试,配置Selenium开发环境可能需要如下几个工具:

  • Selenium Chrome Driver, 用于驱动Chrome浏览器
  • Selenium Client Drivers - Java, 用于支持Java测试脚本
  • Selenium Server, 用于远程机器测试,单机时不需要

另一个简单的方法是使用Maven来配置Java环境的Selenium开发环境,参考官网可以了解更多配置文档.
更多阅读:

Android测试 - Robotium

Robotium用于Android平台上进行黑盒自动化测试,作用类似于web平台的selenium,提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作,适用于测试android native app and hybrid app。

Robotium是 android 自带类 Instrumentation 的一个封装,方便测试人员直接调用封装好的接口,也就是说,实际上我们直接使用Instrumentation 也能够进行自动化测试,但robotium可以简化我们的测试步骤,我们只需要调用某个robotium的API,传几个参数,就等于我们在调用一部分的Instrumentation帮我们实现测试。

Java代码测试 - TestNG

TestNG是类似JUnit/NUnit的测试工具,能够实现unit test, functional test, end-to-end test, integration test等各种测试.

TestNG和JUnit是针对Java语言的两个比较常用的测试框架,两者的相同点:

  1. 使用annotation,且大部分annotation相同。
  2. 都可以进行单元测试(Unit test)。
  3. 都是针对Java测试的工具。

TestNG与JUnit的不同点:

  1. JUnit只能进行单元测试,TestNG可以进行单元测试,功能测试,端到端测试,集成测试等
  2. TestNG需要一个额外的xml配置文件,配置测试的class、method甚至package
  3. TestNG的运行方式更加灵活:命令行、ant和IDE,JUnit只能使用IDE
  4. TestNG的annotation更加丰富,比如@ExpectedExceptions、@DataProvider等

其他工具

自动化测试一般是持续集成的一部分,为了做好持续集成,通常会需要:

  • Jenkins - CI工具

test case fail时,可能会需要自动创建bug跟踪,因此可能需要集成下面的bug管理工具:

  • Jira/Bugzilla - Bug管理工具

为了提高代码质量,可能会用到下面一些工具:

  • 代码静态扫描 -
  • 内存泄漏分析 - valgrind on linux, appverifier on windows
  • 性能分析

为了验证测试coverage,可能需要用到code coverage tool:

  • gcov, c++, gcc only
  • BullseyeCoverage, c++
  • Rational PureCoverage, c++
  • EMMA, java
  • ScriptCover, javascript
  • JSCoverage, javascript

更多阅读:

推荐阅读更多精彩内容