基于 STAF 和 XML 配置文件的跨平台自动化测试部署

 

级别: 初级

高 蒙 (gaomeng@cn.ibm.com), 软件工程师, IBM
张 耀东 (yaodongz@cn.ibm.com), 软件工程师, IBM
陈 轶群 (yiqunc@cn.ibm.com), 软件工程师, IBM
姚 春 (chunyao@cn.ibm.com), 软件工程师, IBM

2009 年 1 月 08 日

目前,我们的测试需要越来越多的平台,并且测试规模多达数十台机器。为提高测试效率和测试质量,我们结合 STAF(Software Test Automation Framework) 和 XML ,设计并实现了一种测试框架。以XML为配置文件,配置所有平台信息;以STAF为引擎,实现跨平台自动化测试;将测试框架与测试用例分离,实现测试用例的即插即用。本文具有很强的实用性,读者可参考设计跨多个平台的自动化测试。

前言

目前,我们的测试需要覆盖越来越多的平台,以及需要多达几十台机器的测试规模。为了提高测试效率和测试质量,我们设计并实现了一种基于STAF和XML的自动化测试工具,主要解决了以下问题:

  1. 应用 STAF 内部服务和 XML 配置文件,实现在多达几十台机器上的自动化测试;
  2. 直接在 Perl 脚本中调用 STAF 的内部服务,提供更灵活和更强大的功能;
  3. 将测试框架与测试用例分离,每次我们生成一个新的测试用例,只需要将其在 XML 文件中进行配置,实现了测试用例的即插即用。
  4. 生成 HTML 格式的日志文件,方便测试者的查询。

我们的测试工作包括下列三个组件:自动化测试框架、配置文件、测试用例。结构如下图所示。


图 1 : 本自动化测试框架结构图
本自动化测试框架结构图




回页首

自动化测试框架

对 STAF 框架的改进

自动化测试框架是基于 STAF 和 XML 实现的。STAF/STAX 是由IBM开发的自动化测试环境,其中STAF是开源的、跨平台的、支持多语言的自动化测试框架。它为自动化测试建立了基础,并加快了自动化测试的进程。 STAX 是基于 STAF 的基础上的执行引擎,它在 STAF 的基础上,帮助用户实现测试用例的分发、布置、执行以及结果分析。在测试工作中,测试人员越来越多的将 STAF 与 STAX 结合使用,但是 STAX 本身为 XML 格式文档,且要求嵌入 Python 语言,具有流程复杂,操作不便的特点。为实现跨多平台的综合性自动化测试,以及提高自动化测试的效率,决定在 Perl 脚本中直接调用 STAF 服务,实现关键性的远程进程调用功能和文件传输功能,并配置XML文件管理测试平台及测试用例。

测试框架中涉及的 STAF 服务

STAF是基于重用的组件来构建自动化框架的,这些可重用的组件就是服务。其中,本测试框架中用的服务主要为:

  • 程序调用服务:内部服务,利用此服务,可用远程调用外部程序。本框架中利用 STAF Process 服务远程执行 Perl 脚本,例如在 Windows 平台下调用语法为:

        STAF “hostname” Process start command “cmd /C perl xxxxxxx.pl”

  • 文件系统服务:内部服务,利用此服务,可以对文件系统进行操作,比如复制、删除、查看等操作。本框架中利用STAF文件系统服务,将测试用例部署到所有的测试平台,并在执行结束后,将日志文件返还特定机器,以便查阅。例如在 windows 平台下的调用语法为:

    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 脚本,它负责以下功能:

  1. 初始化并获取测试用例名称;
  2. 顺序执行测试用例;
  3. 生成HTML格式的日志文件,方便测试者的查询。


代码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 : 每一个测试用例指向具体的执行情况





回页首

小结

本测试框架在 STAF 自动化测试框架的基础上,增加了 XML 文件,对跨多种平台测试进行配置和部署,实现了在多种平台上的自动化测试,提高了测试效率,节省了测试时间。尽管如此,本框架还是存在着许多不足之处,例如对不同平台的测试用例,移植性较差,没有实现在不同平台下,对测试用例的透明性等。


参考资料


作者简介

 

高蒙,2008 年 3 月加入 IBM,从事 SDD (Subsystem Device Driver ) 的测试工作。


 

张耀东,2007 年 9 月加入 IBM,从事 SDD (Subsystem Device Driver ) 的测试工作。


 

陈轶群,2007 年 8 月加入 IBM,从事 SDD (Subsystem Device Driver ) 的开发工作。


 

姚春,2008年3月加入IBM,从事SDD (Subsystem Device Driver ) 的开发工作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值