刘伟,郭秋月,胡志刚
(1.湖南中医药大学信息科学与工程学院,湖南长沙,410208;2.中南大学软件学院,湖南长沙,410075)
软件自动化测试技术是近年来软件工程的热点研究领域之一。软件自动化测试是通过测试工具和方法,将测试人员的人力劳动从非技术、重复且冗长的测试工作中解放出来的测试行为,包括实现机器执行测试、与预期结果进行对比,最后生成相应的测试报告等自动化的功能。自动化测试以缩短测试周期、节约测试成本、达到更高效地测试和软件质量为目标[1]。
Web自动化测试是软件自动化测试的重要组成部分,目前在业界已经取得了一定的研究成果。Selenium是Thought Works公司开发的一套适用于各种不一样的Web应用的功能测试工具集,主要用于Web应用自动化测试,它不仅能支持多种浏览器和多种开发语言,而且还有很好的扩展性[2]。Selenium为诸多自动化Web测试框架提供了基础,近年来已有一些基于Selenium的Web自动化测试框架的研究工作相继报道[3-6]。
目前很多Web自动化测试框架都是基于Selenium实现的,主要是对Selenium框架的二次封装。已有的基于Selenium实现的Web自动化测试框架存在测试脚本维护成本高、稳定性低、测试脚本不能自动生成等问题。在本文中将对基于Selenium的Web自动化测试框架开展优化,设计并实现了一套名为MultiUI的自动化测试框架,并在真实项目中予以应用,在一定程度上提高自动化测试的效率和稳定性,并进一步提升测试框架的跨平台性。
随着CPU主频的升高和多核计算机的普及,利用多线程来并发执行测试任务,可以更加充分利用计算机资源,进而缩短测试时间。为此,为了提高执行效率,对Selenium进行并发化,将独立的测试用例对象化进行多线程并发执行。使用线程的时候就创建一个线程,这样实现较为方便。但是如果并发的线程数很多,并且每个线程都是在执行一个短时间时的任务被创建,执行结束后就被销毁,这样就会频繁的创建和销毁线程而产生大量的时间消耗,导致系统的效率大大降低。为了使线程执行完任务不被销毁,本自动化测试框架采用线程池达到线程复用的效果。创建线程池后,线程池中没有任何线程,当有任务提交(submit)给线程池后,就会创建线程去执行任务,当线程池中的线程数目达到核心池的大小(corePoolSize)后,就会把到达的任务放到缓存队列(workQueue)中,直到所有任务缓存队列中的任务都执行完后才终止(shutdown)。通过并行化优化可极大提高自动测试效率,缩短测试时间。
为了进一步提升自动化测试的执行效率和稳定性,我们将原框架采用真实浏览器模拟用户操作的方式,改为采用无界面的浏览器实现。通过驱动无界面浏览器PhantomJS来实现自动化测试,PhantomJS 支持JavaScript API的无界面、运行在服务端的WebKit的环境,不需要浏览器支持,速度快,主要用于页面自动化、网络监测、页面截图和无界面测试。采用PhantomJS使Web自动化以无界面的方式运行,解决测试过程中加载浏览器元素导致测试速度慢和受网络不稳定影响的问题;同时由于PhantomJS无界面的实现也扩展了自动化执行的平台,使得自动化测试的执行能在无界面的Linux服务器上运行,并进一步提高了执行效率。PhantomJS重要应用场景之一就是实现对Web产品的无界面测试,它不是自动化测试框架,主要是通过测试脚本驱动相应的测试框架。PhantomJS是运行在WebKit环境中,可以对网页进行截图,除了能将网页转化为HTML、CSS等格式外,还支持GIF、PNG等图片格式,为网页截屏提供了更多的选择。在本文中,基本设计思路为将PhantomJS封装为WebDriver提供给Selenium调用,并且封装PhantomJS实现的网页截图。
为了进一步提高自动化框架测试效率,必须提供更好的服务设施。Linux服务器会比Windows服务器性能优势更大,所以为了使自动化测试框架能在Linux上运行,对自动化测试框架进行打JAR包的操作,在Linux上通过命令的方式运行自动化框架。
在我们的优化工作中采用了Maven Assembly插件打包方法,该方法适用于导入第三方JAR包的项目。Maven Assembly是能创建一个包含所有运行时所依赖外部JAR包、脚本和配置文件JAR包的插件,针对目的包需要包含第三方依赖包的情况,相比mvn package打包命令更简易。Maven Assembly打包方法主要是通过pom.xml文件进行配置。本自动化框架pom.xml打包配置如下:
<artifactId>multiUI</artifactId>
<version>1.0.1.0506</version>
<packaging>JAR</packaging>
<!-- multiUI:为打包项目名;1.0.1.0506为定义的打包版本号,可以由用户自定义;JAR为pom打包类型-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<!-- mainClass:指定打JAR包后运行的主函数类名-->
<mainClass>com.qihoo.webtest.execute.ExecSchedule</mainClass>
</manifest>
</archive>
<descriptorRefs>
<!-- descriptorRef:JAR-with-dependencies 会把第三方依赖的JAR包打进最终的JAR包-->
<descriptorRef>
JAR-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
在pom.xml文件中配置以上信息后,通过cmd在进入项目的根目录下运行mvn assembly:assembly命令打包即可,打包成功后会在项目target目录下生产一个JAR包,如图1所示。
图1 JAR包生成图
将由Maven Assembly插件打好的JAR包上传到Linux服务器,把配置文件、测试数据文件和测试脚本上传到配置文件中指定的目录下。然后通过java命令:
java-JARmultiUI-1.0.1.0506-JAR-withdependencies.JAR-configfilesrcmain esourceconfig. yaml运行即可,后面-configfile需要加上配置文件的存放路径。
通过采用了Maven Assembly插件打包为JAR的形式,可以方便地在Linux系统中使用命令形式运行自动化测试框架,提高了框架的灵活性和跨平台性。
在优化前自动化框架采用的是真实浏览器,并且是单线程运行,但MutilUI采用的是无界面的浏览器和多线程并行的运行方式。为了更好地分析优化后的效果,对MutilUI与原自动化测试框架进行对比。优化前后的自动化测试框架运行在相同的软硬件平台上,运行环境完全一样。优化前后自动化测试框架在测试脚本开发、测试脚本执行、测试脚本维护三方面存在差异。在实验中我们选取一个旅游网站的搜索功能作为测试对象,包括酒店搜索(将用户对酒店搜索的高频词汇作为测试数据,在被测Web应用中进行搜索,对得到的结果类型和内容与预期结果做对比)、景点搜索(将热门景点名称作为测试数据,在被测Web应用中搜索,搜索结果是否有正确分类)、推荐菜搜索(将用户经常搜索的菜名作为测试数据,在被测Web应用中搜索,搜索结果是否有按照应用需求进行分类)。优化前后的具体用时对比如表1所示。
表1 优化前后测试用时对比
根据上面的计算方法得出该测试框架相对原有自动化测试框架的ROI(Return On Investment,投资回报率):
ROI=利益/优化后自动化测试成本=(∑(优化前自动化测试成本)-∑(优化后自动化测试成本))/∑(优化后自动化测试成本)
则自动化测试执行一次的投资回报率是:
ROI(1)=((8+0.15×1+4×1)-(7+0.12×1+2×1))/(7+0.12×1+2×1)=33.22%
同理可以算出多次的投资回报率,具体见表2所示。
表2 测试用时对比
从上面数据可以看出,并且随着回归测试次数越多,投资回报率越高。
下面以测试用例个数为单位,给出MutilUI与原自动化测试框架用时对比,如图2所示。
图2 原自动化测试框架与MutilUI框架测试用时对比
从测试用时对比的柱状图可以看出,在用时增长趋势上原自动化测试框架明显比MutilUI快,由此可得出优化后的MutilUI自动化测试框架相对原自动化测试框架在执行效率上有明显提升。
本文基于Web自动化测试框架Selenium进行合理的优化和改进,设计并实现了一套名为MultiUI的自动化测试框架,在MultiUI框架中采用多线程技术实现测试用例的并发执行,提高了测试效率;同时将PhantomJS封装为WebDriver的方法驱动无界面浏览器,实现了无界面化浏览器的自动化测试,在缩短测试时间的同时还提高了测试框架的稳定性;最后采用Maven Assembly插件打包为JAR的形式,可以方便地在Linux系统中使用命令形式运行自动化测试框架,提高了框架的灵活性和跨平台性。
在真实项目中应用优化后的测试框架并与优化前的框架进行对比分析,结果表明,优化后的框架相对原自动化测试框架在执行效率上有明显提升,本文的研究工作具有良好的应用价值,有助于提高自动化测试框架的执行效率和稳定性。