傅灵丽,代俊秋,刘金河
(1.河北工业大学 计算机与软件学院,天津 300130;2.河北工业大学 科研处,天津 300401;3.河北工业大学 现代化教学中心,天津 300401)
软件测试是用来保证软件质量的关键步骤.对一个严格的软件项目来说,软件测试的时间会占到整个软件开发时间的40%,对于一些可靠性要求非常高的软件,甚至会占到开发时间的60%.而测试中有许多操作是重复性的、非智力性的和非创造性的,尤其是回归性的测试,这时就需要用计算机去代替人工去完成这些测试.软件测试自动化的研究领域主要集中在软件测试流程的自动化管理以及动态测试的自动化(如单元测试、功能测试及性能测试方面).在项目中引入自动化测试,可以保证软件测试的高效、准确[1-2].根据Oppenheimer Funds的调查,在2001年前后的3年中,全球范围内由于采用了测试自动化手段所实现的投资回报率高达1 500%.在近几年更呈增长趋势.
对软件项目实施自动化测试,不是简单的靠录制和回放几个脚本就能实现.项目的自动化测试需要制定一套完整的测试流程、计划,同时还需要包括需求、设计、开发、维护及配置管理等各方面的配合和支持[3].
软件测试不是等到软件开发完成后才开始实施,而是贯穿在整个软件开发生命周期中,如图1所示.越早测试发现问题解决的代价越小,尤其是当软件开发完成后发现重大问题,严重时可能导致整个软件都要推倒重来.正常的软件开发流程为需求分析、系统架构设计、子系统设计、模块设计以及最后的编码[4]过程.
软件测试的生命周期流程与软件开发的流程正好相反,在各个阶段所使用的测试工具和方法也不相同.软件代码编写时开发人员需要做相应的单元测试,即所谓的白盒测试,测试时主要采用JUnit、JTest等单元测试工具进行程序的内部结构和算法的测试.模块测试主要是软件测试人员通过黑盒测试的方法来测试模块的功能,此时测试人员关心的是功能的输入和输出结果是否满足设计需求.子系统测试则需要测试子系统中各个模块之间的集成情况,如模块集成测试、回归测试,同样还需要进行不同子系统之间的集成测试.系统测试主要是所有的功能测试完成后进行的综合性的测试,包括压力测试、安全测试、易用性测试、配置测试以及灾难恢复等.接受性测试(即验收测试)主要用来测试开发的软件功能、性能等是否满足项目制定的需求.
图1 软件测试生命周期模型Fig.1 Software testing life cycle
测试流程包括测试计划的书写、测试用例的设计与维护、缺陷管理系统的整合等.有一些专业的商业软件可以用来做测试流程的管理,如TestDirector,不过由于其价格昂贵,一般都采用开源的管理工具.TestLink是开源的测试管理工具,运行在Tomcat、Apache、PHP环境中,可以用来对测试需求、测试计划、测试用例、测试结果分析等进行维护.由于TestLink本身没有缺陷管理功能,因此需要和其他的缺陷管理系统集成,目前可以与TestLink整合的缺陷管理工具有Jira、Bugzilla、Bugfree、Redm ine等.见图2,采用Redmine作为缺陷管理系统,同时Redm ine也是一个灵活的开源项目管理工具,可以有效地管理项目开发的整个流程,它的运行则需要借助于Ruby on Rails环境.TestLink和Redm ine的运行都可以使用MySQL数据库,通过将TestLink和Redmine两者进行整合,就能实现测试管理的自动化.而且这两个软件都是开源软件,可以在原有基础上进行二次开发,使之更能符合项目的需求.
对于Web应用系统,构建一个完整的自动化测试管理流程主要有以下几个步骤:
1)利用TestLink制定测试需求和测试计划;
2)在Redm ine管理系统中,制定项目的实施计划,包括人员、时间等.Redmine中提供了项目管理的甘特图,可对进度进行评估;
3)在TestLink中根据测试需求和计划来设计测试用例,TestLink中包含了测试用例的不同版本,很好的记录了整个用例的运行流程;
4)对于发现的Bug缺陷,可以在Redm ine中进行管理,Bug的状态直接反映在TestLink中测试用例的执行结果中,方便测试人员对Bug进行跟踪测试;
5)测试用例执行完成后,通过TestLink生成最终的测试报告.
图2 软件测试自动化管理Fig.2 Software testing automated management
Web应用系统中的GUI测试,一般无法用自动化测试来完成,如页面的布局、颜色、字体等这些方面的测试还是用人工测试比较妥当.自动化测试在系统功能中主要体现在常用的、核心功能的测试和维护中.在系统开发过程中,对于已经测试好的核心功能,在每次的Bug跟踪、系统更新、环境移植等情况中都需要重新测试,即回归测试.这时,就需要借助于自动化测试[5-6].
自动化测试的流程如图3所示,自动化测试也是软件测试的一种,因此测试流程可以用TestLink和Redmine来管理.对于功能的自动化测试,主要有3种方法:1)借助于测试工具进行简单的录制、回放.在该方法中,录制时,将输入数据和录入脚本混合在一起,不易维护,通用性不强.2)数据驱动的自动化测试,将输入的参数存储在数据文件中进行统一管理,脚本的通用性高,不过,受页面的影响较大.3)关键字驱动的自动化测试,通过直接操纵页面中的操作对象,如页面元素,可以达到脚本与数据分离、界面元素名与测试内部对象名分离、测试描述与具体实现细节分离.
借助一些自动化测试工具,如QTP、WinRunner、Selenium等,可以实现简单地录制、回放,但灵活性不是很好.自动化测试比较好的方法是采用基于关键字驱动的测试方法,利用自动化测试框架开发灵活的测试脚本.对于用Java语言开发的系统,推荐采用Watij(Web Application Testing in Java)的测试框架,它可以很好的同当前的开发环境集成.
图4为watij框架中常用到的类包,用Watij可以模拟客户端对WEB应用的操作,简单的如登陆、导航、填充表单、验证内容的正确性等,自动化测试代码的设计时,需要先调用watij.runtime.ie包进行对IE浏览器的控制,对HTML元素的获取和控制则通过watij.elements来实现;同样也可以进行一些复杂操作,如模拟文件上传和下载、弹出popup框的处理、屏幕的捕捉等.Watij甚至已经提供了利用XPath方法进行HTML元素的提取,这样可以对于一些很难捕获的HTML元素进行控制,如class.如HTML的一段源代码为:
图3 自动化测试流程Fig.3 Automated testing process
图4 Watij包结构图Fig.4 Watij package structure
由于class这个标记是java语言的保留字段,利用一般的元素捕获则很难取得该标记中的相关值,此时就需要利用AttributeFinder类进行table元素的获取.
在测试脚本的设计时,通常需要加入断言(Assertion),用来评估某个操作或流程是否正确.自动化测试结束后,需要提供测试结果报告和缺陷管理报告,供评估、分析使用.
此外,在进行Watij自动化测试框架的脚本设计时,可以借助java.util.logging.Logger类进行运行日志的记录.例如下面的代码则用来记录登录过程是否成功,登录后,如果页面中出现“欢迎您登录”字样,则说明登录成功.同样可以使用系统的计划任务设定自动化测试自运行的时间和频率.
性能测试涉及的范围较广,容量测试、负载测试、压力测试、稳定性测试等.性能测试则都需要借助于测试工具[7].同样需要进行测试用例的规划和开发,最常用的商业软件有LoadRunner,WAS.一些开源的性能测试工具同样是企业的首选,如JMeter、Tsung.
Tsung是一个用Erlang语言编写的开源、多协议、分布式的性能测试工具.它具有协议无关性,可以测试HTTP、SOAP、Jabber等服务器,Tsung主要采用XML文件来描述复杂的用户行为,同时可以实时的生成测试报告(如:响应时间、CPU和内存使用情况、事务率等).Tsung可以分布在多个客户机中来模拟成千上万的虚拟并发用户,对于基于HTTP协议的WEB应用,在75台计算机组成的集群服务器中,成功模拟过10万人的并发请求,每秒有超过100万的请求.
利用Tsung进行性能测试时,可以根据测试的压力值进行集群测试,如图5所示,客户机和服务器之间的连接需要通过证书(Certificate)授权连接,即无密码的远程连接.测试的主要流程可以通过Tsung的Recorder进行录制,录制后在受控机上的tsung.xm l文件中进行调用即可,同样也可以手动模拟.在tsung.xm l文件中还需定义客户机的地址、每台机器的权重、模拟的用户数量和逐渐的加压情况.在该配置文件中,还可以包括一些可选的配置,如对需要监控的机器进行cpu和ram的消耗情况监控.配置完成后,可以设定自动化测试脚本的运行时间和频率,测试完成后,结果会以图表的形式显示.
本文提出的自动化测试解决方案已在多个Web应用系统中成功使用.Redm ine可以很好的进行各个项目之间的权限控制;通过Testlink对Web系统的测试计划和测试用例进行管理,使我们对项目的测试进度和质量的控制有了全局的了解,极大地提高了测试的效率.
功能和性能测试自动化的解决方案已成功用于某临床数据管理系统中.利用Watij的测试框架,两个测试工程师对自动化脚本进行维护.该项目写成自动化的功能占整个系统的40%左右,测试点大约有500个.系统的每次升级和改进都进行了自动化的回归测试,大量重复、枯燥的工作已大多被自动化所代替.测试工程师根据最终记录的测试的结果对软件的功能有了全局的了解和评估,整个脚本运行一遍只需要不到一个小时,而传统的人工测试则需要一天,甚至更长时间.
该临床数据管理系统在自动化的性能测试方面主要进行了稳定性测试.在进行稳定性测试之前需要对系统进行负载和压力测试,测试时需要不断对系统进行性能调优,直到性能符合要求.稳定性测试时采用了两台测试服务器的Tsung集群,测试时间为7*24小时.经过测试,系统的事务响应时间、吞吐量、并发数等都符合项目需求.经过测试的临床数据管理系统已交客户使用,并取得很好的效果.
构建自动化的软件测试,需要从测试管理、缺陷管理、项目管理、功能及性能多个方面来保证整个测试项目的自动化.此外,自动化的测试是个长期的过程,测试代码的维护也是自动化测试需要面临的一项挑战.实施Web系统的自动化测试尽管可以降低人工测试的工作量,但并不能完全取代手工测试,更不能对所有的测试进行自动化,只有在确保测试质量的情况下,实施自动化测试才有意义.
[1]Gerald M Weinberg.Perfect software and other illusions about testing[M].New York:Dorset House Publishing,2008.
[2]Glenford J M yers.The art of software testing second edition[M].New Jersery:John Wiley&Sons Inc,2004.
[3]Elfriede Dustin.Effective software testing[M].50 specific ways to improve your testing.Boston:Addison-Wesley Professional,2002.
[4]Hung Q Nguyen,Bob Johnson,M ichael Hackett.Testing applications on the web:test planning for mobile and internet-based systems,second edition[M].Indiana,Wiley,2003.
[5]ElfriedeDustin,Thom Garrett,BernieGauf.Implementingautomated software testing:how to save timeand lowercosts while raisingquality[M].Boston,Addison-Wesley Professional,2009.
[6]Gnanasekaran N,Vineet Banga.Automated regretssion testing framework white paper[C].Atlanta,NIIT Technologies Ltd.2007.
[7]ElfriedeDustin,JeffRashaka,John Paul.Automated software testing introduction,management,and performance[M].Boston:Addison-Wesley Professional,1999.