歡迎您光臨本站 註冊首頁

基於 STAF 和 XML 配置文件的跨平台自動化測試部署

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
目前,我們的測試需要越來越多的平台,並且測試規模多達數十台機器。為提高測試效率和測試質量,我們結合 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(
目前,我們的測試需要越來越多的平台,並且測試規模多達數十台機器。為提高測試效率和測試質量,我們結合 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 : 部署測試用例代碼示例
___FCKpd___5

在測試平台上執行測試用例

成功地將測試用例部署到測試平台上之後,接下來要做的是執行測試用例。每一個測試平台都有一個執行引擎,我們通過 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 文件,對跨多種平台測試進行配置和部署,實現了在多種平台上的自動化測試,提高了測試效率,節省了測試時間。儘管如此,本框架還是存在著許多不足之處,例如對不同平台的測試用例,移植性較差,沒有實現在不同平台下,對測試用例的透明性等。(責任編輯:A6)

=~ /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 : 初始化並獲取測試用例名
___FCKpd___6


代碼6 : 順序執行測試用例代碼示例
___FCKpd___7

生成日誌

根據測試用例的執行情況,生成 HTML 日誌,代碼示例如下。


代碼7 : 以 HTML 格式生成日誌
___FCKpd___8





日誌查詢

測試結束后,利用STAF的文件系統服務將在測試機器上生成的日誌文件返回監測機器,並將其部署到Web容器中,測試人員可以通過IE等Web瀏覽器查看腳本的執行情況,示例圖片如下。


圖 3 : 每一個鏈接對應一個測試平台


圖 4 : 每一個鏈接指向平台所執行的測試用例列表


圖 5 : 每一個測試用例指向具體的執行情況





小結

本測試框架在 STAF 自動化測試框架的基礎上,增加了 XML 文件,對跨多種平台測試進行配置和部署,實現了在多種平台上的自動化測試,提高了測試效率,節省了測試時間。儘管如此,本框架還是存在著許多不足之處,例如對不同平台的測試用例,移植性較差,沒有實現在不同平台下,對測試用例的透明性等。(責任編輯:A6)



[火星人 ] 基於 STAF 和 XML 配置文件的跨平台自動化測試部署已經有612次圍觀

http://coctec.com/docs/linux/show-post-69002.html