一、定義
各個服務端點(稱作STAF客戶端)是對等的,從一個端點可直接調用另一端點(在另一台機器運行的程式)提供的服務。
二、技術特點
1.將環境需求最小化(包括硬體與軟體)
2.在各種語言中都很容易使用,包括Java,C/C++,Rexx,Perl,TCL,及命令行shell環境
3.易於擴展,讓用戶能方便的創建一個服務插入到STAF體系中
STAF比較適應需要構造複雜測試環境的場合,複雜測試環境通常是分散式的,通過STAF將測試任務分發到不同的測試環境去執行,可以方便的測試機的測試 腳本,可以方便的收集測試結果,另外,執行引擎STAX(Software Test Automation eXecution Engine)讓STAF的使用變得更簡單,測試人員只需要配置XML檔案便實現STAF任務管理。
三、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)等服務,這裡不一一列舉。
四、請求/訪問格式
每個服務都定義了它能接受的請求格式。STAF 通過請求來調用服務的功能,每個請求都以字元串的形式傳送,這樣可以保證 STAF 能夠跨平台的運行。 每個請求都有三個參數,以系統-服務-參數的形式出現。第一個參數表示此請求需要被傳送到的 STAF 系統,這個參數被 STAFProc 解析以便確定請求應該被本地處理還是傳送到其他的 STAF 系統。 當這個請求被傳送到需要處理的 STAF 系統後,STAFProc 解析第二個參數來判斷哪個服務會被調用。最後,STAFProc 會把第三個參數轉發給需要調用的服務,服務處理這個請求。
當處理完請求後,服務會返回兩種數據:返回碼和特定於請求的信息。返回碼錶示服務處理的結果。特定於請求的信息表示服務返回的具體數據,如果請求成功返回,這些信息將包括這次請求所請求的數據,如果請求出現錯誤,這些信息將包含額外的診斷信息。
完全使用字元串作為請求回響格式可以簡化 STAF 的很多方面,包括與其他語言的接口,服務之間的通信,跨平台的操作等。 其他語言只需要通過一個接口 STAFSubmit() 來請求 STAF 的服務,並且只需傳遞三個字元串參數。服務之間也只需要通過字元串傳送接收請求。
五、STAX
STAX 是基於 STAF 的執行引擎,它提供了一種 XML 格式的工作流語言。用戶可以編寫 XML 的腳本檔案來通過 STAX 調用 STAF 的服務已完成自動化測試。用戶可以不需要和程式語言打交道就可以開發出自己的自動化測試環境。STAX 提供如下的功能:支持並行運行,用戶自定義的運行控制粒度,嵌套測試用例,控制運行時間,支持現有的 Java 和 Python 模組等。STAX 還提供了一個圖形化的監控工具,通過這個工具,用戶可以清晰的看出測試運行的位置,狀態和出錯信息等。
六、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 STAF重啟之後,運行命令staf local service list,查看輸出結果,如果顯示有STAX和EVENT,如圖1所示,則說明STAX已經成功載入。
圖 1. STAF 服務列表
SERVICE EVENT LIBRARY JSTAF EXECUTE {STAF/Config/STAFRoot}/services/stax/STAFEvent.jar通知STAF在啟動時以名字EVENT來載入STAFEvent.jar。
如果需要在運行STAX的機器上運行STAX Monitor (STAX任務的監控工具),則需要設定MAXQUEUESIZE,以保證STAXMonitor能夠正確運行。
6.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服務傳送請求並且接收處理結果。
6.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來調用。
七、注意
具體的項目經驗中,也發現不少問題,比較需要注意的是:一、是在stax job的XML檔案中,其調用WINDOWS的命令時,檔案分隔設定為"/",而不是"\"。二、在編寫STAX JOB的XML時,如用到Altova xmlspy等工具,需要STAX的DTD,可以用以下命令得到
set STAF_QUIET_MODE=1 (在Unix中: export STAF_QUIET_MODE=1)
STAF local STAX GET DTD > stax.dtd
set STAF_QUIET_MODE= (在Unix中: unset STAF_QUIET_MODE)
八、總結
STAF(軟體自動化程式框) 提供了一個自動化測試的平台,可與其他測試工具一起,幫助我們進行自動化測試的更新、編譯、部署和測試。STAX為STAF提供了一個執行引擎,幫助加快STAF程式的開發和部署。 因此利用STAF和STAX可以減少測試的工作量和複雜度,加快軟體測試的流程,縮短測試周期。