如今軟件開發依賴于集體的開發和測試。對于部署和測試人員來說,如何從集中的代碼管理工具來獲取源代碼或者代碼的編譯包并且自動部署和測試變得非常重要。本文借助于 STAF(STAX) 和 FTP 以及 CVS 工具介紹如何自動從 FTP 或者 CVS 下載程序的更新包,并且部署到測試環境中。本文首先對自動化測試框架Software Test Automation Framework (STAF)和Software Test Automation eXecution Engine (STAX)進行簡要的介紹,然后簡單介紹如何安裝和配置STAF(STAX)。其次本文將結合一個場景重點介紹STAF(STAX)如何利用CVS和 FTP工具進行源代碼的下載、編譯、分發、部署和測試。最后本文列出了使用STAF(STAX)的經驗和教訓。
讀者可以從本文了解到 STAF(STAX) 的基本概念和用法。本文適合 STAF 的初學者。
1.STAF(STAX)
Software Test Automation Framework (STAF) 是開源、跨平臺、支持多語言并且基于可重用的組件來構建的自動化測試框架。它為自動化測試建立了基礎,并且提供了一種可插撥的機制支持不同的平臺和語言。 STAF 采用點對點的實現機制,被用來減輕自動化測試的工作負擔,加快自動化測試的進程。在 STAF 的環境中,所有的機器都是對等的,沒有客戶端和服務器的區分。
Software Test Automation eXecution Engine (STAX)是基于 STAF 的執行引擎。它在 STAF 的基礎上,幫助用戶實現測試用例的分發、部署、執行以及結果分析。STAX 使用了三種技術:STAF, XML 和 Python。簡單來說,STAX 在 STAF之 上提供了一些接口,方便用戶來操縱STAF進行自動化測試的實現。
我們將簡要介紹一下 STAF 和 STAX 中所用到的概念和機制。
1.1 Services (服務)
STAF 基于可重用的組件來構建自動化測試框架,這些可重用的組件就是 Services(服務)。STAF 中所有的組件都是服務。服務是一系列功能的集合。STAF 本身是一個后臺程序 (STAFProc),提供一種輕量級的分發機制,負責把請求轉發給這些服務。
STAF 中的服務分為兩種:internal (內部服務)和 external(外部服務)。內部服務被集成進 STAFProc 中,提供一些關鍵性的功能,比如數據管理和同步。外部服務由 STAFProc 動態裝入,通過共享庫(shared libraries)來訪問。
STAF 提供了如下幾種常用服務:
程序調用服務(Process Service):內部服務,利用此服務,STAF 可以調用外部程序。
文件系統服務(FileSystem Service):內部服務,利用此服務,STAF 可以對文件系統進行操作,比如復制,刪除,查看等操作。
日志服務(Log Service):外部服務,幫助用戶進行日志的記錄和查看。
資源池服務(ResPool Service):外部服務,提供了對于資源池的管理和操作,如查看,創建和刪除操作。
監控服務(Monitor Service):外部服務,提供對于 STAF 運行時的監控功能。
信號量服務(Sem Service):內部服務,提供了兩種信號量的操作,mutex 和 event。
壓縮服務(Zip Service):外部服務,提供了壓縮和解壓的功能。
Ping服務(Ping Service):內部服務,類似于操作系統的 ping 功能,用于檢測遠程的 STAF 是否運行。
變量服務(Var Service):內部服務,提供對于系統或者用戶級別的環境變量的操作。
STAF 還提供了延遲(Delay Service), 幫助(Help Service), 跟蹤(Trace Service)等服務,這里不一一列舉。
1.2 請求-響應格式
每個服務都定義了它能接受的請求格式。STAF 通過請求來調用服務的功能,每個請求都以字符串的形式發送,這樣可以保證 STAF 能夠跨平臺的運行。 每個請求都有三個參數,以系統-服務-參數的形式出現。第一個參數表示此請求需要被發送到的 STAF 系統,這個參數被 STAFProc 解析以便確定請求應該被本地處理還是發送到其他的 STAF 系統。 當這個請求被發送到需要處理的 STAF 系統后,STAFProc 解析第二個參數來判斷哪個服務會被調用。最后,STAFProc 會把第三個參數轉發給需要調用的服務,服務處理這個請求。
當處理完請求后,服務會返回兩種數據:返回碼和特定于請求的信息。返回碼表示服務處理的結果。特定于請求的信息表示服務返回的具體數據,如果請求成功返回,這些信息將包括這次請求所請求的數據,如果請求出現錯誤,這些信息將包含額外的診斷信息。
完全使用字符串作為請求響應格式可以簡化 STAF 的很多方面,包括與其他語言的接口,服務之間的通信,跨平臺的操作等。 其他語言只需要通過一個接口 STAFSubmit() 來請求 STAF 的服務,并且只需傳遞三個字符串參數。服務之間也只需要通過字符串發送接收請求。
1.3 STAX
STAX 是基于 STAF 的執行引擎,它提供了一種 XML 格式的工作流語言。用戶可以編寫 XML 的腳本文件來通過 STAX 調用 STAF 的服務已完成自動化測試。用戶可以不需要和編程語言打交道就可以開發出自己的自動化測試環境。STAX 提供如下的功能:支持并行運行,用戶自定義的運行控制粒度,嵌套測試用例,控制運行時間,支持現有的 Java 和 Python 模塊等。STAX 還提供了一個圖形化的監控工具,通過這個工具,用戶可以清晰的看出測試運行的位置,狀態和出錯信息等。 下面我們將通過與 FTP 和 CVS 的協作完成自動化部署來展示 STAF 和 STAX 的功能。
2.STAF(STAX) 安裝配置
STAF 的安裝文件可以從STAF 的網站 下載。對于不同的平臺和 JVM 環境有不同的安裝文件,請選擇合適的文件下載。如果下載的是 jar 文件,要確保需要安裝 STAF 的機器上已經安裝有相應的 JRE,然后運行如下命令安裝 STAF:java -jar STAF安裝文件.jar 。 如果下載的是可執行文件,則直接運行即可。
STAF 的安裝比較簡單,只需要按照向導提示進行操作即可。安裝完畢后,可以通過 STAFProc 命令啟動 STAF。關閉 STAF 可以用如下的命令: staf local shutdown shutdown 。從這條命令我們可以看出上面提到的 STAF 的命令格式。local 表示 STAF 的本地系統,shutdown 表示服務, 此服務提供了 STAF 的關閉操作。第二個 shutdown 表示傳遞給服務的參數,指示 STAF 把本地的 STAF 服務關閉。
STAX 的安裝文件也可以從STAF 的網站 下載。STAX 本身不需要安裝,只需要更改 STAF 的配置文件以便 STAF 在啟動的時候能夠加載 STAX 服務。 從這個角度來說,STAX 是 STAF 的一種外部服務,可以根據需要來決定是否加載它。
下載完 STAX 后,將其解壓到 $STAF_Install_Directory\services\stax 目錄中,然后更改 STAF 的配置文件 STAF.cfg。此文件在 $STAF_Install_Directory\bin 目錄下。 在 STAF.cfg 文件末尾加上如下的代碼,然后重啟 STAF。
代碼1:STAX配置
SERVICE STAX LIBRARY JSTAF EXECUTE \
{STAF/Config/STAFRoot}/services/stax/STAX.jar OPTION J2=-Xmx384m
SERVICE EVENT LIBRARY JSTAF EXECUTE \
{STAF/Config/STAFRoot}/services/stax/STAFEvent.jar
SET MAXQUEUESIZE 10000
STAF重啟之后,運行命令staf local service list ,查看輸出結果,如果顯示有STAX和EVENT,如圖1所示,則說明STAX已經成功加載。
圖 1. STAF 服務列表
SERVICE STAX LIBRARY JSTAF EXECUTE {STAF/Config/STAFRoot}/services/stax/STAX.jar 通知STAF在啟動時以名字STAX(這樣在STAF服務列表中,我們看到的STAX的服務名字就叫做STAX)來加載STAX.jar,也就是STAX服務。 傳遞的參數J2=-Xmx384m 表示更改JVM的堆棧大小。如果STAX會出現OutOfMemory錯誤,則需要調整這個參數,增加JVM的堆棧大小。 建議在加載STAX時總是指定這個參數,并且根據系統環境來調整參數大小。
SERVICE EVENT LIBRARY JSTAF EXECUTE {STAF/Config/STAFRoot}/services/stax/STAFEvent.jar 通知STAF在啟動時以名字EVENT來加載STAFEvent.jar。
如果需要在運行STAX的機器上運行STAX Monitor (STAX任務的監控工具),則需要設置MAXQUEUESIZE,以保證STAXMonitor能夠正確運行。
2.1 STAF Java 代碼示例
代碼2所示的是STAF Java代碼示例。
代碼2:STAF Java代碼示例
STAFHandle handle = null;
try {
handle = new STAFHandle("Java_Sample_Test");
} catch (STAFException e) {
System.exit(1);
}
STAFResult result = handle.submit2("Linux1", "process",
"start command ls parms -l wait stdout /root/lsjava.log");
if (result.Ok != result.rc) {
System.out.println("Error starting the process ls, RC: " + result.rc);
}
result = handle.submit2("Linux1", "fs", "copy FILE /root/lsjava.log
TODIRECTORY C:/STAF TOMACHINE windows' % machineName");
if (result.Ok != result.rc) {
System.out.println("Error coping file, RC: " + result.rc);
}
在調用STAF服務之前,首先需要注冊STAFHandle,所有的STAF服務調用都要通過這個句柄來進行,因此一般把這個句柄設置成靜態的。通過handle.submit2()函數可以向STAF服務發送請求并且接收處理結果。
2.2 STAX腳本示例
STAX為我們簡化了調用STAF服務的過程,因此我們通過STAX腳本來調用STAF服務。本節將根據一個簡單的示例來簡要介紹STAX腳本的語法。
代碼3:STAX腳本SampleScript.xml示例
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE stax SYSTEM "stax.dtd">
3 <!-- sample1.xml - Sample of a job definition file for STAX
4 Job Description:
5 This job executes some STAF commands and sends messages to the STAX Job Monitor.
6 -->
7 <stax>
8 <script> LinuxMachine = ['Linux1', 'Linux2'] </script>
9 <defaultcall function="ListDirectory">
10 </defaultcall>
11 <function name="ListDirectory">
12 <paralleliterate var = "machineName" in="LinuxMachine">
13 <testcase name = "'listDirectory'">
14 <sequence>
15 <stafcmd>
16 <location>'%s' % machineName</location>
17 <service>'process'</service>
18 <request>'start command "ls" parms "-l" wait stdout /root/ls.log'</request>
19 </stafcmd>
20 <if expr="RC == 0">
21 <sequence>
22 <tcstatus result="'pass'"/>
23 <log message="1">'List directory successfully on %s' % machineName</log>
24 </sequence>
25 <else>
26 <sequence>
27 <tcstatus result="'fail'"/>
28 <log message="1">'Error in listing directory on %s' % machineName</log>
29 </sequence>
30 </else>
31 </if>
32 <stafcmd>
33 <location>'%s' % machineName</location>
34 <service>'fs'</service>
35 <request>'copy FILE /root/ls.log TOFILE ls%s.log TODIRECTORY C:/STAF
TOMACHINE windows' % machineName</request>
36 </stafcmd>
37 </sequence>
38 </testcase>
39 </paralleliterate>
40 </function>
41 </stax>
這個示例調用兩臺Linux機器上的ls命令,將結果輸出到文件,根據命令返回的結果判斷調用是否成功,然后復制文件到另外的STAF機器中。為了方便描述,為腳本加上行號。
STAX采用現在流行的XML語言作為其腳本語言。第一行是XML語言的標準格式,第二行表示此XML文件使用stax.dtd樣式表進行驗證。所有的STAX腳本文件都應該保留這兩行。
3-6行是XML的注釋,用來描述這個腳本的功能。
第7行是STAX腳本命令的開始符,所有STAX腳本內容都要用它起始。第8行中script 類似于編程語言中的定義變量的語句,在這里定義一個長度為2的數組LinuxMachine,其值為Linux1和Linux2。
第9-10行指定STAX腳本運行時調用的函數。第11-40行是函數的定義體。11行指定函數名為ListDirectory。
第12-39行定義一個循環,類似于Java中的for,但是這個循環是并行的。var="machineName" in="LinuxMachine" 表示此循環從LinuxMachine數組中獲得輸入,并且賦給machineName變量。
13行定義測試用例,在STAX腳本的運行中,可以根據運行結果來決定測試用例的結果,方便用戶查看。
第14-37行表示其中的STAX腳本是順序執行的。15-19行執行具體的STAF命令,其中location指定需要運行STAF命令的機器,可以由變量來動態指定,比如'%s' % machineName。 service表示需要調用的服務,在這里為process進程服務。request為需要傳遞給服務的參數。進程服務的參數分為幾部分,首先是需要調用的命令"ls",parms指定需要傳遞給"ls"的參數"-l"。 wait表示需要等待這個命令結束才能返回。stdout表示將命令運行的結果輸出到文件中去。
20-31行判斷上個命令的返回結果,并根據返回結果的值設定測試用例的狀態,并且記錄日志以及將消息發送到STAFMonitor。expr="RC==0" 判斷返回結果是否為0。 RC表示上個命令的返回結果,0表示命令執行成功。<tcstatus result="'pass'"/> 設置測試用例狀態為通過,fail則表示測試用例失敗。<log message="1"> 表示不僅將消息記錄到STAX的日志中,而且將其發送到STAFMonitor(如果STAFMonitor處于運行狀態)。
32-36 行是STAF的文件拷貝命令。fs表示文件系統服務,copy FILE指定復制文件操作,TOFILE指定目標文件的名字,STAX會用命令后面的參數% machineName替換%s,因此目標文件的名字為lsLinux1.log和lsLinux2.log。 TODIRECTORY指定目標文件夾,TOMACHINE指定目標機器。
上述STAX腳本可以用staf local stax execute file SampleScript.xml wait 執行,或者通過java -jar STAXMon.jar 啟動STAXMonitor來調用。
回頁首
3.自動部署更新包
圖2. STAF(STAX)環境拓撲
圖2是本節將要介紹的簡化的場景圖。軟件開發分為兩部分,一部分是在CVS上的最新的軟件源碼,另外一部分是在FTP服務器上的執行腳本。在STAF(STAX)自動部署更新包的過程中,STAX需要同時從CVS和FTP上下載最新的代碼和安裝腳本。 測試環境中,測試機器上都裝有STAF,并且在從CVS和FTP下載代碼的機器上安裝有STAX。
STAX下載完代碼后,將代碼拷貝到用于編譯的服務器上。因為代碼的編譯需要特殊的環境,比如需要WAS (WebSphere Application Server) 的環境,因此我們把STAX服務器和編譯服務器分開。 編譯服務器編譯好源碼之后,將其分發到部署和測試服務器上。部署服務器負責向應用程序服務器部署程序,而測試服務器則用來進行自動化測試。
本節根據這個場景介紹如何通過STAF(STAX)來實現部署和測試的自動化。
文章來源于領測軟件測試網 http://www.kjueaiud.com/