APP下载

基于ANTLR的Web应用测试脚本自动重构方法

2017-10-26周辉钱巨

计算技术与自动化 2017年3期
关键词:软件测试

周辉 钱巨

摘要:Web应用在各个领域得到广泛应用,为保证Web应用程序质量,需要对它进行详尽的测试。基于脚本的自动化测试越来越流行,逐渐的被应用在了Web应用程序测试中。功能测试脚本一般用于Web应用的功能和接口测试,很难发现Web应用中可能存在的缺陷或者性能瓶颈。很多研究人员通过扩展功能测试脚本或者重新编写性能测试脚本来测试Web应用程序的缺陷问题。这种方式效率低下,资源开销大。为此,我们提出了一种基于ANTLR开源库的测试脚本自动重构方法,首先对测试脚本进行优化,加速测试脚本执行速度,然后对测试脚本进行增强,从而构造出一个快速暴露Web应用程序缺陷的性能测试脚本。

关键词:Web应用;软件测试;ANTLR;脚本重构

中图分类号:TP311文献标识码:A

Abstract:

Web applications have been widely used in various fields,in order to guarantee the quality of Web applications,it is necessary to test Web applications in detailScriptbased automated testing is becoming more and more popular,and it has gradually been applied in Web applications testFunctional test scripts usually used to test the functionality and interfaces of Web applicationsIt is difficult to find the memory defects or performance defects that may exist in the Web applicationsSo many researchers test the defect of the Web applications by extending the functional test script or rewriting the performance test script,however it is inefficientIn order to solve this problem,we propose an automatically refactoring approach of test scripts based on ANTLRThe approach was used to optimize the test script and accelerate test script execution speedIt can expose defects of Web applications by executing enhanced the test script.

Key words:web application;software test;ANTLR;script refactoring

1引言

近年來,随着信息技术的飞速发展,基于网络的Web应用软件以及云应用风靡全球,并被广泛的应用到社会的各个领域,成为当前和未来的软件系统开发的主流。Web应用软件具有的异构、分布、并发和平台无关的特性要求测试人员需要对其进行更加详尽和审慎的测试[1]。研究人员从多个角度对Web应用测试进行研究主要包括用例生成[7][8]、结果分析[9]、故障注入[7]等。Lei Xu等[4]提出了一个Web应用测试框架,描述了Web应用测试流程。然而,随着Web应用软件变得越来越复杂,传统的人工测试方法不仅耗时耗力而且效率低下,因此自动化测试方法被越来越多的应用于Web应用程序的测试。Nadia Alshahwan等[5]使用SBST方法对Web应用进行自动化测试和回归测试。基于脚本驱动的自动化测试方法是比较主流的自动化测试方式。通过测试工具录制自动化执行脚本或者测试人员编写测试脚本,并驱动测试脚本运行Web应用。基于脚本的自动化测试方法不仅节约时间,而且可以将测试人员从繁杂的手工测试中解放出来,大大提高Web应用程序的测试效率。但是测试工具录制的测试脚本一般都是功能测试脚本,主要用来测试Web应用程序的功能和接口。因此普通的功能测试脚本很难发现Web应用程序中内存缺陷问题或者性能瓶颈。现阶段,驱动测试脚本来发现和检测Web应用中的缺陷,大部分是通过测试人员的手动循环执行功能测试脚本,或者在测试脚本中添加一些与性能测试相关的脚本语句。手动的循环执行测试脚本需要过多的人工干预,可能会由于人为因素导致测试结果的不稳定。而在测试脚本中手动的添加代码,对于海量测试脚本来说,工作量是巨大的。

本文提出了一种基于ANTLR[3]开源库的Web应用程序测试脚本自动重构方法,对功能测试脚本进行自动重构,通过删除Web应用测试不相关的语句对测试脚本进行优化,加速测试脚本的执行,减少测试时间。可以为功能测试脚本自动添加循环操作、并发操作代码实现对测试脚本的增强。从而将普通的功能测试脚本重构为Web应用性能测试脚本。通过执行重构后的性能测试脚本,可以更快的发现Web应用中可能存在的缺陷和性能瓶颈,并提高测试效率,节约测试资源。

2Web应用测试脚本自动优化方法

测试脚本自动优化是通过将Web应用测试脚本中与Web事件不相关的测试语句移除。主要包括两个步骤:脚本代码状态收集和测试脚本优化处理。我们是通过将测试脚本中的语句划分为Web事件语句和非Web事件语句,所谓Web事件就是真正和Web应用程序执行相关的脚本部分。而非Web事件是那些不用于测试执行的代码例如对测试执行结果进行验证或者将测试执行日志保存等。endprint

21运行时联网状态收集

在测试脚本发起自动化测试执行之前,利用ANTLR工具对测试脚本进行插桩处理。然后再执行插桩后的测试脚本来收集测试脚本中语句联网信息。 首先,我们需要构建一个测试脚本运行时联网状态收集模型,如图1所示。

下面对运行时联网状态信息收集模型的构建步骤进行详细的说明。

1)测试脚本运行时插桩。

输入数据是一个原始的正常Web应用自动化测试脚本。输出数据是插入联网信息跟踪监控语句的测试脚本。具体流程如图2所示。

2)测试脚本跟踪执行

使用Selenium[6]自动化执行引擎执行测试脚本,在第一步测试脚本插桩中,我们在测试脚本中插入了启用全局代理语句。因此测试方法执行时并不直接将执行请求发送给Web服务器,而是先将请求发送给代理服务器,通过代理服务器拦截执行请求,并进行联网状态判断,执行测试脚本中的某条语句时,如果代理服务器有流量经过说明该执行语句对应的脚本语句是一个联网脚本即该事件是一个Web事件。由于代理服务器不仅要接收测试脚本执行请求,同时还要与测试脚本中插入的脚本行号信息进行通信,因为当我们知道某条语句是Web事件时,如果此时我们不清楚该条语句的行号,那么就无法将联网信息与执行语句对应起来,为此,我们将代理服务器的Web事件消息转发和普通的消息通信隔离,我们重新启用一个端口。并使用线程隔离的方式来共享测试脚本联网状态。上文介绍,在每一条执行语句后面都插入了一个语句行号, 因此在每条测试脚本执行之后都会将该语句的行号发送给代理服务,向代理服务器询问刚刚执行的语句是否联网,代理服务器会根据脚本信息是否联网发送给执行前端。我们定义了一个数据结构来保存每行脚本联网信息。

T = {[Line,Flag],...,[Line,Flag]}

Line表示正在执行的语句行号,Flag表示正在执行的语句是否是Web事件,例如行号为20的测试语句被判定是一个Web事件那么就被以[20,true]的格式被保存起来,所有的语句的联网状态会都会持久化作为测试脚本自动优化重构的输入数据。

22测试脚本自动优化

运行时联网状态收集模型用来收集脚本联网状态数据,而测试脚本优化主要是去除那些与Web应用程序测试执行不相关的语句,也就是非Web事件语句,通过收集每行语句的联网信息作为测试脚本语句去除的标准,语句去除原则就是去除最后一条Web事件之后的所有语句。因为在真正与Web应用程序相关的语句已经执行完毕,后续的执行语句将不会对Web应用产生任何作用,只是用来记录脚本执行的附加信息或者对测试执行结果进行验证。

测试脚本优化的输入数据是原始脚本和脚本语句联网状态信息,输出数据是优化后的测试脚本。主要流程如图3所示。我们利用ANTLR工具,在Python的文法下,构建Python测试脚本的抽象语法树。同时对联网数据进行判断,找到最后一个Web事件对应的语句行号。然后将行号与抽象语法树进行匹配,找到最后一个Web事件对应的节点,在测试方法的语句范围内,删除该节点之后的所有节点。最后将抽象语法树还原成测试脚本。

3Web应用测试脚本自动增强

内存膨胀测试脚本增强是指通过对测试脚本进行自动化重构,将普通功能测试脚本转换成为性能测试脚本。典型的方式是通过为测试脚本填添加循环操作和并发操作。

31脚本循环引入策略

测试脚本循环是指通过为测试脚本中的测试方法添加循环语句实现对测试方法的循环执行,从而达到Web应用程序长时间大剂量运行效果,更快的发现Web应用中可能存在的内存膨胀问题。传统的方法是测试人员手动不断重复的循环执行测试脚本,而人工循环操作测试脚本不仅耗时耗力,而且可能导致测试结果的不稳定。另外,手动的在测试脚本中添加循环操作也会导致人工的过度干预,并且对每个测试脚本都添加循環操作会产生巨大的工作量,大大降低测试效率。我们提出了一个测试脚本自动添加循环的方法,通过为测试方法设置循环次数,自动的在测试方法中的预定位置插入循环语句实现脚本循环执行。

Web应用程序试脚本循环的输入是一个原始测试脚本和预定循环次数,输出是一个增加循环后的测试脚本。算法伪代码如算法1所示。

首先给定一个原始测试脚本,利用ANTLR构造测试脚本抽象语法树AST,然后定位循环语句的插桩位置,由于循环是作用于整个测试方法,所以需要循环语句添加到整个方法体的外层。循环语句的插桩位置测试方法第一个直接子节点之前。插入循环语句节点之后,将抽象语法树还原成测试脚本。完成循环语句自动插入。

32脚本并发引入策略

为了模拟多用户并发场景,增加Web应用内存膨胀问题暴露的可能性,我们为测试脚本引入了并发执行语句。手动测试脚本并发执行需要测试人员同时运行多个测试脚本,操作复杂,效率低下。我们提出了一种测试脚本自动重构策略来为测试脚本添加并发执行。为了避免同时运行多个脚本,我们将多个不同的测试脚本通过外部引入的方式加入到原始测试脚本中。这样,只需要发起一个测试脚本的执行,会自动执行并发方法,并发执行方法会再以并发的方式调用外部引用的测试脚本,从而实现多脚本并发执行。

如图4所示,脚本并发引入的输入数据是原始测试脚本、并发线程数目以及待并发的测试脚本集合,输出数据是自动重构的并发测试脚本。首先利用ANTLR在原始脚本中确定并发测试方法的插入位置。并使用ANTLR构造测试脚本抽象语法树,然后将并发测试脚本通过外部引入的方式关联到原始脚本上,将引入语句插入到抽象语法树中。然后根据模板将并发线程数目以及运行库runtime封装成并发方法。最后将并发方法插入到抽象语法树中的预定插桩位置。然后将抽象语法树还原成测试脚本,完成对测试脚本的并发执行引入。

4原型工具实现endprint

为检验本文方法的有效性,在Eclipse 平台上实现了一个Web应用程序测试脚本自动重构原型工具。 图 5 给出了测试脚本自动优化界面,从图中可以看出通过测试脚本自动优化后,原始测试方法中的print(“test acc log”)被去除,实现测试脚本优化。

图6给出了测试脚本自动增强界面。以自动为测试脚本添加循环为例,这里为测试脚本UpdateBook.py的test_update_book测试方法添加10轮循环,自动重构后的测试脚本如图中右边编辑框所示,测试方法被自动添加了循环语句,实现测试脚本增强。测试脚本并发过程同添加循环一样。

5结论

本文提出了一种基于ANTLR的Web应用测试脚本自动重构方法。通过构建测试脚本运行时联网状态模型收集脚本联网状态,再利用ANTLR自动去除测试脚本与Web事件不相关的语句实现脚本自动优化。通过为测试脚本添加循环、并发语句来实现对测试脚本的增强。測试脚本的自动重构不仅提高了测试效率,节约了测试资源,而且能够更快的发现Web应用中存在的内存缺陷和性能瓶颈。

参考文献

[1]路晓丽Web应用软件的测试技术研究[D]西安:西北大学,2006

[2]杨佩星面向能耗的测试用例生成技术研究[D],南京:南京航空航天大学,2016.

[3]ANTLR.http://www.antlr.org/

[4]XU L,XU BA Framework for Web Applications Testing[C]// International Conference on CyberworldsIEEE Computer Society,2004:300-305.

[5]ALSHAHWAN N,HARMAN MAutomated web application testing using search based software engineering[J]2011,43(30):3-12.

[6]Seleniumhttp://docs.seleniumhq.org.

[7]HANNA S,MUNRO M,Faultbased Web services testing,5th International Conference on Information Technology[C] //New Generations (ITNG)USA,2008,471-476.

[8]LI Z J,ZHU J,ZHANG L J,et alTowards a Practical and EffectiveApproach for Web Services Test Case Generation[J]Automation of Software Test,2009,106-114.

[9]ATKINSON C,BRENNER D,FALCONE G,et alSpecifying highassurance services[J]Computer,2008,41,64-71.endprint

猜你喜欢

软件测试
软件测试方向人才培养“1+X”融合研究
大数据背景下软件测试技术的发展
软件测试课程教学改革探讨
关于 Web 应用系统的软件测试的研究
核心概念与案例驱动的软件测试课程教学研究
军用软件测试项目管理系统设计与实现
智能手机菜谱软件的设计
软件测试发展现状及前景的探讨