本文转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-stafxml/
目前,我们的测试需要越来越多的平台,并且测试规模多达数十台机器。为提高测试效率和测试质量,我们结合 STAF(Software Test Automation Framework) 和 XML ,设计并实现了一种测试框架。以XML为配置文件,配置所有平台信息;以STAF为引擎,实现跨平台自动化测试;将测试框架与测试用例分离,实现测试用例的即插即用。本文具有很强的实用性,读者可参考设计跨多个平台的自动化测试。
前言
目前,我们的测试需要覆盖越来越多的平台,以及需要多达几十台机器的测试规模。为了提高测试效率和测试质量,我们设计并实现了一种基于STAF和XML的自动化测试工具,主要解决了以下问题:
我们的测试工作包括下列三个组件:自动化测试框架、配置文件、测试用例。结构如下图所示。
图 1 : 本自动化测试框架结构图
|
自动化测试框架
对 STAF 框架的改进
自动化测试框架是基于 STAF 和 XML 实现的。STAF/STAX 是由IBM开发的自动化测试环境,其中STAF是开源的、跨平台的、支持多语言的自动化测试框架。它为自动化测试建立了基础,并加快了自动化测试的进程。STAX 是基于 STAF 的基础上的执行引擎,它在 STAF 的基础上,帮助用户实现测试用例的分发、布置、执行以及结果分析。在测试工作中,测试人员越来越多的将 STAF 与 STAX 结合使用,但是 STAX 本身为 XML 格式文档,且要求嵌入 Python 语言,具有流程复杂,操作不便的特点。为实现跨多平台的综合性自动化测试,以及提高自动化测试的效率,决定在 Perl 脚本中直接调用 STAF 服务,实现关键性的远程进程调用功能和文件传输功能,并配置XML文件管理测试平台及测试用例。
测试框架中涉及的 STAF 服务
STAF是基于重用的组件来构建自动化框架的,这些可重用的组件就是服务。其中,本测试框架中用的服务主要为:
STAF “hostname” Process start command “cmd /C perl xxxxxxx.pl” |
STAF local FS COPY DIRECTORY $fromDir TODIRECTORY $toDir TOMACHINE $hostname EXT $ext |
其中 $fromDir 指本地文件夹,$toDir 指远程文件夹,$hostname 指远程测试平台,$ext 指将要进行复制的文件扩展名,此处为 “pl”。
|
配置文件
脚本的执行命令和环境变量在各个平台是不同的,具有很大的差异性。为避免将这种差异硬编码到自动化脚本中,并使自动化脚本具有很好的透明性,我们采用基于 XML的配置文件覆盖多种平台的差异性。例如本框架中的配置文件如下所示。
代码1 : 配置文件内容示例
<Monitor name="hostname" exeCmd="b:/Scripts/executeCommand.pl" / log="b:/Scripts/ logfile/ " configure="b:/Scripts/configure.xml"> <host name="turfgrass" os="win" dir="systemDirve/automation"> <testcase value="testcase0001"/> <testcase value="testcase0002"/> <testcase value="testcase0003"/> <testcase value="testcase0004"/> <testcase value="testcase0005"/> </host> <host name="eagles" os="aix" dir="home/automation"> <testcase value="testcase0001"/> <testcase value="testcase0002"/> <testcase value="testcase0003"/> <testcase value="testcase0004"/> <testcase value="testcase0005"/> </host> <Monitor/> |
在配置文件中,指定了要执行的脚本,日志文件的存放位置,配置文件的存放位置,测试机器的操作系统类型,以及脚本要部署的具体路径。脚本在执行时首先读取 XML 文件中的重要信息,例如测试机器的平台,以便采用相对应的执行命令和查询必须的环境量。示例代码如下。
代码2 : 读取XML代码示例
use XML::Parser; use XML::SimpleObject; $file="configure.xml"; $parser = XML::Parser->new(ErrorContext=>2,Style=>"Tree"); $xso = XML::SimpleObject->new($parser->parsefile($file)); $monitor = $xso->child('Monitor'); $exeCmdFile = $monitor->attribute('exeCmd'); $log = $monitor->attribute('log'); $configureFile = $monitor->attribute('configure'); chomp($exeCmdFile); chomp($log); chomp($configureFile); |
遍历所有测试平台,查询相关信息,如果平台为 Windows 平台,还将查询 STAF 变量,获取 System Drive 的值,并构造测试平台下的路径,此路径为所要执行测试用例的存放位置。示例代码如下。
代码3 : 遍历所有测试平台代码示例
foreach $host($monitor->children('host')){ my $exeCmd; my $hostname = $host->attribute('name'); my $os = $host->attribute('os'); my $dir = $host->attribute('dir'); chomp($os); chomp($hostname); chomp($dir); if($os =~ /win/i){ my @systemDrive = `staf $hostname VAR GET var STAF/Env/SystemDrive`; chomp($systemDrive[2]); $dir = "$systemDrive[2]//automation//"; } } |
|
部署并执行测试用例
在本自动化测试工具中,我们将测试框架与测试用例分离。每次,我们生成一个新的测试用例,只需要加将它加入到特定的位置,并在配置文件中进行简单的配置。测试开始执行时,测试工具会根据配置文件中的信息将测试用例部署到测试平台上,设置必须的环境变量,在测试机器上启动执行引擎,由执行引擎执行用例,并将日志文件返还。
部署测试用例
首先利用 STAF 提供的文件系统服务将要执行的测试用例和配置文件部署到所有的测试平台。每一个测试用例是由Perl写成的脚本。之所以要将配置文件也部署到测试机器,是因为在测试机器上的执行引擎要根据配置文件中的测试用例信息来执行测试用例。示例代码如下所示。
代码4 : 部署测试用例代码示例
my $ext = "/"pl/""; $toDir =~ s/[////]$//; $fromDir =~ s/[////]/w+/./w+$//; my $cmd = "staf local fs copy DIRECTORY $fromDir TODIRECTORY / $toDir TOMACHINE $hostname EXT $ext"; open (EXEC, “$cmd | ”) or die “can not deploy test cases onto test beds”; while(<EXEC>){ if($_ =~ /error/i){ print “execute command error/n”; #todo } } close EXEC; print “successfully deploy test cases onto test beds, next step, / execute them on test beds automatically/n”; |
在测试平台上执行测试用例
成功地将测试用例部署到测试平台上之后,接下来要做的是执行测试用例。每一个测试平台都有一个执行引擎,我们通过 STAF 的远程调用服务,在测试框架中调用执行引擎,由执行引擎负责在各个测试平台上执行测试用例。执行引擎本身也是一个 perl 脚本,它负责以下功能:
代码5 : 初始化并获取测试用例名
sub initialize{ while($option = shift @ARGV){ if($option =~ /.html/){ $logFileName = $option; }elsif($option =~ /[////]/){ $dir = $option; }else{ $hostname = $option; } } print "dir is $dir/n"; print "hostname is $hostname/n"; print "logFileName is $logFileName/n"; $logFileExt = ".html"; $dateAndTime = &getCurrentDateAndTime(); #Analyze the xml configure file, register all test cases to be executed $file = "$dir"."hostInfo_$hostname.xml"; $confFile = "$dir"."configure.xml"; $parser = XML::Parser->new(ErrorContext=>2,Style=>"Tree"); $xso = XML::SimpleObject->new($parser->parsefile($file)); $confxso = XML::SimpleObject->new($parser->parsefile($confFile)); $count = 0; foreach $tmp_host($confxso->child('Monitor')->children('host')){ if($tmp_host->attribute('name') =~ /$hostname/i){ foreach $testcase($tmp_host->children('testcase')){ $testcases[$count++] = $testcase->attribute('value'); } } } } |
代码6 : 顺序执行测试用例代码示例
sub executeCommand{ $count = 0; foreach $testcase(@testcases){ $testcase = $testcases[$count++]; $testcase =~ s//s+/_/g; $testcase .=".pl $hostname $dir"."function.pl $logFileName"; $testcase = $dir.$testcase; print $testcase; `perl $testcase`; } } |
生成日志
根据测试用例的执行情况,生成 HTML 日志,代码示例如下。
代码7 : 以 HTML 格式生成日志
#initial html head sub initLog{ my ($logFileName,$hostname) = @_; my $sdq = "/""; &appendLogScriptInfo($logFileName, / "<HTML><HEAD><TITLE>Automation Results</TITLE></HEAD>"); &appendLogScriptInfo($logFileName,"<ALIGN=left"); &appendLogScriptInfo($logFileName,"<FONT FACE=$sdq"."arial$sdq>"); &appendLogScriptInfo($logFileName, / "<B>Automation Results for host: $hostname ".&getCurrentDateAndTime."</B><BR>"); &appendLogScriptInfo($logFileName,"</FONT></ALIGN>"); &appendLogScriptInfo($logFileName,"<TABLE BORDER"); &appendLogScriptInfo($logFileName,"<BR><BR>"); } #end html after test sub endLog{ my ($logFileName) = @_; &appendLogScriptInfo($logFileName,"<BR><BR>"); &appendLogScriptInfo($logFileName,"</TABLE BORDER>"); &appendLogScriptInfo($logFileName,"<BR><BR><BR><BR>"); &appendLogScriptInfo($logFileName,"<BR><BR><BR><BR>"); &appendLogScriptInfo($logFileName,"</HTML>"); } #append log contents into html file sub appendLogScriptInfo{ my ($logFile, $content) = @_; unless(open(LOGFILE,">>$logFile")){ die("can not open log file $logFile"); } print LOGFILE ("$content/n"); close(LOGFILE); } |
|
日志查询
测试结束后,利用STAF的文件系统服务将在测试机器上生成的日志文件返回监测机器,并将其部署到Web容器中,测试人员可以通过IE等Web浏览器查看脚本的执行情况,示例图片如下。
图 3 : 每一个链接对应一个测试平台
图 4 : 每一个链接指向平台所执行的测试用例列表
图 5 : 每一个测试用例指向具体的执行情况