http://www.mesworld.cn/111-4/4708-2.htm
分布式计算将网络服务带到世界的每一个角落,这些服务又大都部署在Web应用系统中。如何保障高质量软件或服务则是个突出的问题,其实软件测试从来就不应该被轻视。对于一个复杂的web应用程序系统需要测试的方面太多了,特别是那些开发周期很长的系统,如果所以测试都通过手工来完成,显然成本太高,且容易出错。通过使用自动化工具,则在某种程度上降低了测试难度,同时节约了成本,但是会有个新的问题:如果提高测试脚本的维护性和移植性。
本文通过对软件测试过程分析,并结合分层思想,提出一个较好的测试架构,并介绍如何通过自动化测试工具Selenium和测试框架TestNG搭建该测试平台。
1 WEB自动化测试
软件测试是确保软件质量的重要手段,然而相对于企业级的系统规模和复杂不断增大,手工测试容易出错,而且枯燥的机械重复性工作对于软件质量保证的人员来说是个不小的挑战。自动化工具的引入则让软件质量保证人员从中解脱出来。
1.1 自动化测试介绍
自动化测试是一种通过自动化工具执行定制好的测试脚本的过程。通过该过程的实施,可以节省人力和时间成本,提高测试效率。自动化测试可以被用于单元测试,功能测试,性能测试,回归测试等等,但是自动化测试不是并不能完全代替人工测试,而且这种程度需要看自动化测试所能覆盖路径的范围,而且最能体现自动化测试优势的应该算是它的复用性,特别是对于开发周期很长的系统。由于以上优点,自动化测试的架构显得尤为重要,好的测试架构将给脚本的维护带来巨大的方便。
1.2 Web自动化测试软件
对于众多的Web自动化测试软件,有商业用途的付费软件,也有开源免费软件,它们功能同样强大,同时优点缺点也很突出。常见的web自动化测工具有:QTP, Winn Runner, Silk Test, Selenium。Selenium虽然是开源软件,但是表现却非常优秀。
1.2.1 开源软件Selenium
Selenium可能是现在使用最为广泛的开源Web自动化测试工具了。Selenium主要产品组件有:Selenium-IDE,Selenium –RC,Selenium-Grid。它们都有各自不同特点,可以结合实际情况选择不同的组合。
Selenium IDE是以Firefox浏览器的插件的形式发布的,通过它可以进行测试脚本的录制,调试,回放和转换。
Selenium RC是Selenium家族中最为重要的产品。通过代理服务器的方式,模拟向目标Web应用系统发送测试请求和接收反馈,从而达到控制模拟自动化测试的过程。
Selenium Grid相当于一个用于控制测试的远程控制器,它显式地将测试请求发送到一个或多个机器上的某个有效的Selenium-RC实例上,这则为自动化测试提供了分布式和并行测试的环境。
以上产品都是以Selenium Core作为基础。Selenium Core其实是一个java script函数库,通过混合测试脚本注入到浏览器中,被主要用来操作Web页面上的元素,从而模拟代替人工手动操作,例如向文本框输入文本,点击按钮提交表单等等。
同时Selenium的另外一个重要优点就是:对各种浏览器,操作系统和脚本编程语言都有广泛的支持。支持的浏览器有IE,Firefox,Safari,Opera,Chrome;支持的操作系统有Windows,Linux,Mac;支持的脚本语言有Java,Python,C#,Ruby等等。正是因为这样一个特性,使得Selenium具有很好的灵活性和扩展性
1.3 软件测试框架
若要搭建一个测试平台,有了Selenium还不够,因为它只提供自动化测试关于浏览器部分的驱动,然而对于测试脚本模块之间的控制还不够,需要像JUnit或TestNG这样的测试框架的辅助。
1.3.1 TestNG
JUnit从过去到现在依然是单元测试的一个标准,是最流行的开源工具。同JUnit一样,TestNG支持包括从单元测试到集成测试,但是TestNG所支持的高级的特性更加吸引我们。对于每天都进行编译来说,重新运行失败的测试的机制对于QA(Quality Assurance)的管理来说是非常有帮助,而TestNG就有这样的特性。TestNG的另一个亮点是支持参数化。在JUnit中如果你要测试不同的参数,你需要写不同的测试用例来覆盖不同参数。而在TestNG中,可以通过使用Testing.xml配置文件做到。这样的做法提高了测试脚本的清晰性。并且它支持三个级别的测试,分别是Test Suite,Test,Test Method,通过结合注释的使用,这样使得测试用例的实现更加灵活。如下实例代码可以看到:
public class TestSample {
public TestSample() {
super();
}
@Test//注释并标记为要测试的方法
public void testPass() {
doTesting();
}
@BeforeTest//在测试方法调用之前执行
public void doBeforeTests() {
doSomethingBeforTesting();
}
@AfterTest//在测试方法调用之后执行
public void doAfterTests() {
doSomethingAfterTesting();
}}
2 分层的软件测试架构
2.1 常见测试架构
模块化测试脚本框架:测试用例的脚本是由树状的独立小的可以描述的测试脚本模块组成,从而实现模块化。
测试库框架:不同于模块化的是把目标应用程序分解为过程和函数而不是脚本。
关键字驱动测试框架:将目标应用程序的功能和测试步骤分别映射为Keyword和Driven驱动表的形式。
数据驱动测试框架:测试驱动模块从数据源中获取测试数据进行测试。
混合测试框架:以上框架的一些结合。
2.2 分层测试框架
Web应用程序主要是以网页的形式提供服务的,Web应用程序的测试除了测试网页功能,往往还需要对网页的GUI(graphical User Interface)进行测试。但是一个完成好的测试脚本会有一些预想不到的失败,而这些问题常常是因为期望的结果与实际自动化测试的结果不一致,而且这种不一致大多是因为页面GUI的问题。例如某个按钮位置改变了或某个链接顺序改变了。对于现在大量使用Ajax技术的时候,这种情况似乎普遍起来,这使得脚本维护起来更加困难起来。
基于以上的一些经历,从某种程度来说网页的功能和页面GUI其实是存在耦合的,而且根据软件开发的经历,如果能将软件开发的分层思想应用到测试上来:如果可以将目标测试网页的GUI和功能分开,那自动化的测试脚本会健壮起来,维护固然也将变得更加轻松。所以结合混合测试框架的各种优点,给出分层的自动化测试框架图。
从图1可以看到在测试脚本中,模块化业务脚本和测试控制脚本,这样好处是提高业务脚本的复用性和维护性,同时将业务脚本交互的页面GUI方面的信息封装起来,并使用数据源的方式提供给业务脚本使用。图中的驱动模块则是控测试数据的载入和测试脚本运行的。
2.3 平台实现
2.3.1 基于Selenium和TestNG的平台实现
首先从Selenium官方网站中分别下载并安装Selenium IDE,Selenium RC,Selenium Grid安装包。从TestNG官方网站下载并安装TestNG安装文件。
软件测试活动是围绕测试用例来进行的,对于Web自动化测试,基本步骤如下:编写测试用例,录制测试脚本,配置测试工程,运行测试脚本,查看测试报告。
对于测试脚本的开发和执行,首先需要在测试用例的基础上,使用Selenium IDE进行脚本录制,调试,回放,再确定测试脚本无误后,则转换为特定语言的脚本代码,例如转换为TestNG框架的Java代码。接着需要重构转换了的测试脚本代码,使其业务脚本和控制脚本分离到不同模块中,同时重构其中的测试数据,包括业务测试数据和界面数据(可以使用XPath来定位界面元素)。在重构过程中,通过使用TestNG的注释标签来对测试脚本进行设置和控制。测试报告是由TestNG在测试中自动生成的,可以直接使用浏览器打开,也可以扩展部署到服务器上,这样相关程序员可以立即获得属于自己那部分的测试结果。
3 结论
软件测试分层架构是在混合测试框架的基础上结合分层的思想设计出来的,通过Selenium 和TestNG搭建起来的平台,可以广泛用于Web应用程序的自动化测试,但是应该根据工程复杂程度选择适当的组合去搭建平台。