回归测试是指修改了旧代码之后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。回归测试作为软件生命周期的一个重要组成部分,在 整个软件测试过程中占有很大的比重,并且伴随着渐进和快速迭代开发的广泛应用,新版本的连续发布对回归测试的频率和效率都有了更高的要求。因此自动化回归 测试无论是从时间、效率还是成本的角度考虑,都是解决这一问题的不二选择。本文随着回归测试的自动化程度不同而展开如下:手工回归测试 -> 自动化回归测试 -> 无需人工干预的自动化回归测试 -> 无需人工干预的跨平台并发自动化回归测试。
1. 手工回归测试
手工回归测试软件一般由以下步骤组成:
2. 自动化回归测试
2.1. 自动化回归测试工具
回归测试的步骤以及回归测试用例本身相对固定的特点,保证了自动化回归测试的可行性。除了利用 Java,ANT 等直接开发自动化脚本以外,各种自动化测试的软件和工具也保证了自动化回归测试的可行性:
2.2 .自动化回归测试的可行性
将手工测试自动化,首先需要考虑的是手工测试的每一步(见章节 1)是否可以实现自动化。换而言之,也就是是否可以利用命令行操作或者脚本语言来代替手工测试中需要人机交互的部分:
根据被测软件存放的服务器类型、协议的不同,可以利用相应的命令行操作工具,实现自动监测并下载最新版本的被测软件。例如:wget,mget。
目前被广泛使用的 VMware 虚拟机,不但支持多种操作系统,可以通过 revert to snapshot 恢复到任何环境,还提供了命令行工具 vmrun 。因此,我们可以利用命令行操作实现自动将虚拟机还原到最初的干净的测试环境,并且开启虚拟机。举例如下 :
<VMware Install Path>/VMware VIX/vmrun revertToSnapshot <your-VM> <some-snapshot> <VMware Install Path>/VMware VIX/vmrun start <your-VM>
大部分的软件都会提供命令行安装方式,也就是所谓的“ Silent Installation ”。利用提前设置好的安装配置信息,实现无需用户输入的自动安装软件并不是一件难事。
Rational Functional Tester 是目前非常流行的一个面向对象的自动化测试工具。通过编写 RFT 脚本,可以实现对 Java、.Net 以及基于 Web 的各种应用程序的自动测试。
Rational Functional Tester 提供了两种开发环境:Eclipse 框架中的 Java™ 或者 Microsoft™ Visual Studio™ 开发系统中的 Microsoft™ Visual Basic™ .NET 。无论是使用哪一种脚本,都可以通过嵌入 DAO 的方式访问数据库,进而将 RFT 脚本的执行结果自动记录到数据库中,再经由网页展现出来,见图 1 。
图 1. 自动记录执行结果
2.3. 自动化回归测试
基于以上的可行性分析,手工回归测试的每一步都是可以通过命令行操作,或者脚本语言来实现的。如果将把手工回归测试的每一步分别自动化,比喻成一颗颗的珍珠,那么 STAF/STAX 就是一根绳子,它将一颗颗珍珠串起,构成了一根美丽的项链。
Software Test Automation Framework (STAF) 是开源、跨平台、支持多语言并且基于可重用的组件来构建的自动化测试框架。 STAF eXecution engine (STAX) 是基于 XML 的执行引擎,它是 STAF 提供的众多外部服务中的一种。简单来说,STAX 脚本不但可以利用 STAF 提供的各种内部、外部服务,方便快捷地实现很多功能,而且它还可以在任何一台装有 STAF 的机器上远程同时执行。基础架构见图 2 。
图 2. 基础架构
为了方便重用,我们可以把手工回归测试的各个部分写成独立的 STAX 脚本,如图 3 所示。
图 3. 自动化脚本
各部分的 STAX 脚本代码示例如下:
示例代码 1. 转换虚机状态
<! — Revert VM to a saved state--> <sequence> <!-- FREE EDITION - ONLY A SINGLE SNAPSHOT IS AVAILABLE --> <process name="'revertVM'"> <location>VMWare Server</location> <command>'vmwareRun'</command> <parms>'revertToSnapshot vmwareVirtualMachinePath vmImageFile vmImageFile'</parms> </process> <if expr="callRC != 0"> <throw exception="'eTerminateFunction'">'Failed to Revert VMware Image Snapshot'</throw> </if> <!-- Ping the target machine and ensure it open --> <log level="'user1'">'Waiting for target %s open' % (vmIP)</log> <timer duration="'10m'"> <sequence> <mce:script type="text/javascript"><!-- pingRC = 1 // --></mce:script> <loop until="pingRC == 0"> <sequence> <stafcmd name="'STAFPingTargetMachine'"> <location>VM</location> <service>'PING'</service> <request>'PING'</request> </stafcmd> <if expr="RC != 0"> <sequence> <stafcmd name="'delay'"> <location>'local'</location> <service>'DELAY'</service> <request>'DELAY %s' % (delayTime)</request> </stafcmd> <sequence> <else> <log level="'user1'">'%s is opened' % (vmIP)</log> </else> </if> </sequence> </loop> </sequence> </timer> <!-- If the target did not ping within the given amount of time --> <if expr="RC != 0"> <throw exception="'eTerminateFunction'"> 'The target failed to reboot and start STAF within the specified amount of time. Please check the target for further details' </throw> </if> </sequence>
通过在 VMware 服务器上执行 VMware 软件本身提供的转换 snapshot 的命令,可以方便的将目标虚拟机恢复到测试的初始状态。继而,可以通过 STAF 提供的 PING 服务进一步确认目标虚拟机已经开启,并且运行在其上的 STAF 也工作正常。一旦确认目标机工作正常,便可以开始后续的测试工作,否则需输出出错提示,并且返回。
示例代码 2. 安装被测产品
<!-- Install product on the target --> <if expr="Platform == 'Windows'"> <sequence> <process name="'installProduct'"> <location>target</location> <command>'installCmdonWin'</command> <parms>'installParmsonWin'</parms> </process> <if expr="callRC != 0"> <throw exception="'eTerminateFunction'">'Failed to Install Product on Windows'</throw> </if> </sequence> <else> <sequence> <process name="'installProduct'"> <location>target</location> <command>'installCmdonLinux'</command> <parms>'installParmsonLinux'</parms> </process> <if expr="callRC != 0"> <throw exception="'eTerminateFunction'">'Failed to Install Product on Linux'</throw> </if> </sequence> </else> </if>
利用 STAF 可以在目标虚拟机上执行命令行操作和运行脚本的特点,我们可以在目标虚拟机上运行安装被测产品的脚本或者直接通过执行命令行操作安装被测产品。如果待测产品的安装命令在不同的操作系统上有所不同,则需要先判断操作系统之后,再根据不同的操作系统,执行不同的命令行操作。当然,如果是通过运行脚本程序来达到安装被测产品的目的,那么在脚本中实现操作系统的判断是更为合理而且通用的。
示例代码 3. 执行 RFT 脚本
<!-- Run the RFT test on the target--> <sequence> <process name="'runRFTTest'"> <location>target</location> <command>'java'</command> <parms>'-classpath "%s" %s -datastore %s -playback %s' %(classpath, rftClass, rftProject, rftScript) </parms> </process> <if expr="callRC != 0"> <throw exception="'eTerminateFunction'">'Failed to Run RFT Scripts'</throw> </if> <sequence>
RFT 不但提供了通过界面执行 RFT 脚本的方式,还提供了命令行的执行方式。因此,我们可以通过 STAF,从命令行调用 RFT 并执行 RFT 自动化测试脚本。
3. 无需人工干预的自动化回归测试
最大程度的自动化回归测试自然是无需人工干预的自动化测试,也就是不但可以把手工测试的每一步都自动化,而且还可以在拿到新版本的软件之后自动触发回归测试,自动记录执行结果 , 并且发送通知。
3.1 自动触发回归测试
STAF 内部的信号量服务(Semaphore Service)提供了两种信号量的操作,mutex 和 event 。我们可以利用它来开始自动化回归测试。
示例代码 4. 利用信号量服务触发事件
STAF serverIPAddress SEM POST EVENT event_name STAF serverIPAddress SEM RESET EVENT event_name
如果你想定时触发自动化回归测试,Windows 和 Linux 操作系统本身都提供了定时调度任务的功能。在 Windows 上,可以利用 Windows 任务调度程序(Windows Task Scheduler);在 Linux 上,可以利用 Crontab 。继而可以通过定时调用 shell 脚本或者 batch 文件,触发自动回归测试。
但是,定时触发并执行回归测试往往是不够的,更加智能和有效的方式是在每拿到一个新版本的软件的同时,开始一轮新的回归测试。为了实现这种触发方式,我们可以将定时触发并执行自动回归测试,改为定时检测服务器端的软件版本,比如每隔五分钟检测一次。一旦检测到服务器端已经上载完全的新版本的软件,就可以调用 STAF 的信号量服务来触发自动回归测试。
3.2 自动发送测试结果
在执行完回归测试的自动脚本并且将结果记入数据库之后,在将结果传回 STAF 服务器的同时,还可以发送邮件将测试结果通知给相关人员。
示例代码 5. 回传执行结果并发送邮件通知
<! — Send notification --> <stafcmd name="'EmailNotification'"> <location>'local'</location> <service>'EMAIL'</service> <request>'SEND %s FROM %s@%s SUBJECT "%s" MESSAGE "%s"' % (emailString, hostname, dnsString, subject, message) </request> </stafcmd>
通过 STAF 的 EMAIL 服务,可以将测试结果以邮件形式通知测试人员
图 4 描述了无需人工干预的自动回归测试的流程:
图 4. 无需人工干预的自动回归测试流程
4. 多平台并发
4.1. 多平台(Windows、Vista、Linux)
在回归测试的过程里,只有安装产品和执行测试脚本两部分与操作系统有关,而 RFT 和 STAF 都是跨平台的,所以很容易扩展到多平台。我们需要做的仅仅是在 RFT 和 STAX 脚本里,利用条件判断语句,对不同的操作系统做不同的处理。
示例代码 6. RFT 脚本中的平台判断
if(RationalTestScript.getOperatingSystem().isWindows()){ callScript(new testcases_for_win()); }else{ callScript(new testcases_for_linux()); }
RFT 脚本有很多种判断平台的方法,示例代码只是其中的一种。当测试用例本身针对不同的平台,有比较大的差别时,除了可以在脚本内部根据不同的平台,灵活运动用不同的函数以外,也可以直接将一个脚本,分成针对不同平台的多个脚本,在另外的脚本中,统一调用。
示例代码 7. STAX 脚本中的平台判断
<if expr="Platform == 'Windows'"> ... <else> ...... </else> </if>
同理,STAX 脚本的部分,如果根据不同的平台有所不同,也需要在脚本中区别操作系统,而后分别对待。
4.2. 并发
STAX 不但可以顺序执行任务,还可以并发任务。通过并发任务,可以更好的利用资源,节约时间,提高效率。
示例代码 8. 并发任务
<! — Run install and test product function in parallel --> <paralleliterate var="vmIP" in="vmInfoIp"> <sequence> <mce:script type="text/javascript"><!-- vmInfoImage = vmInfo[vmIP] // --></mce:script> <call function="'installandtestProduct'"> vmIP,buildPath,installPath,installConfiguration </call> <mce:script type="text/javascript"><!-- callRC = STAXResult // --></mce:script> <if expr="callRC != 0"> <throw exception="'eTerminateFunction'"> 'Failed to install and test product' </throw> </if> </sequence> </paralleliterate>
利用 STAX 提供的元素 parallel 和 paralleliterate,可以很容易实现同一系列任务在多台目标机上的并发执行。例如示例代码中原本针对一个目标机执行的安装和测试函数,通过 paralleliterate 即可变成同时在目标机列表中的所有目标机上同时执行,极大的节约了总体执行的时间,提高了执行的效率。
5. 结论
更加系统和全面的自动化回归测试,无疑是回归测试未来发展的一个必然趋势。本文是作者根据自动化回归测试的实际经验积累和总结而成。伴随着自动化测试的自动化程度展开的同时,介绍了几种主流的自动化测试工具的使用经验。希望能对正在实现和准备实现自动化回归测试的同仁有所帮助。
转载: http://www.ibm.com/developerworks/cn/rational/r-cn-rftstaftesting/