3.1 FTP腳本
STAF(STAX)實現了自動化測試的框架,但并沒有實現具體的常用功能,比如FTP, CVS。因此我們需要借助FTP命令來完成FTP源碼的下載。自動化下載一般通過命令行實現,因此我們使用Windows自帶的FTP命令來完成。
FTP命令提供了一個參數-s,可以指定一個FTP腳本文件來存放將要執行的FTP命令。因此我們把需要執行的FTP命令存放到某個文件,然后通過STAX調用FTP命令實現FTP上源碼的自動下載。
代碼4:FTP腳本(ftpSample.conf)示例
open ftp.ibm.com
username
password
binary
prompt
cd /code/latest/unix
lcd C:\latest\unix
mget *
bye
這個FTP腳本表示以用戶名username,密碼password訪問ftp.ibm.com,設置傳輸方式為binary,然后下載/code/latest/unix下的文件到本地目錄C:\latest\unix?梢酝ㄟ^ftp -s:ftpSample.conf 來運行此腳本。
調用ftp命令的STAX腳本如下所示:
代碼5:調用FTP命令的STAX腳本
<process>
<location>'local'</location>
<command>'ftp'</command>
<parms>'-s:ftpSample.conf'</parms>
<workdir>'C:/STAF'</workdir>
</process>
process標簽表示調用STAF的進程服務(process),location表示請求被發送的目標機器,command表示需要執行的進程,而parms表示傳遞給進程的參數,workdir表示進程運行的工作目錄。
通過FTP腳本和STAX腳本,我們可以控制STAX來自動下載FTP上的源代碼。
3.2 CVS下載
和FTP類似,CVS源碼下載也使用命令行的方式,但由于CVS服務器使用的協議不同,對CVS客戶端的要求也不同,因此我們在這里不再介紹如何使CVS客戶端工作的內容。假定我們能夠使用如下的命令更新CVS代碼: cvs -d :ext:username@cvs.ibm.com:/cvsroot/ checkout -d directory modulename .
根據這個CVS命令,調用此命令更新CVS代碼的STAX腳本如下:
代碼6:調用FTP命令的STAX腳本
<process>
<location>'local'</location>
<command>'cvs'</command>
<parms>'-d :ext:username@cvs.ibm.com:/cvsroot/ checkout -d directory modulename'</parms>
<workdir>'C:/CVS'</workdir>
<stdout>'C:/CVS/cvsupdate.log'</stdout>
</process>
與代碼 5 不同的是,代碼 6 使用了stdout 標簽,此標簽表示將進程 cvs 的輸出重定向到 cvsupdate.log 中,以便于我們查看 cvs 命令執行的狀態和結果。
3.3 拷貝編譯源碼
從 CVS 和 FTP 上下載源碼之后,需要將源碼拷貝到編譯服務器上。本節介紹如何使用 STAF 的文件傳輸命令以及 STAX 的循環指令。
代碼 7:傳輸文件的 STAX 腳本
<script> directoryList = ['CVSDirectory', 'FTPDirectory'] </script>
<iterate var = "directory" in="directoryList">
<testcase name = "'sourceCopy'">
<sequence>
<stafcmd>
<location>'local'</location>
<service>'fs'</service>
<request>'copy DIRECTORY C:/Source/%s TODIRECTORY /root/build/%s TOMACHINE
buildserver RECURSE KEEPEMPTYDIRECTORIES' % directory % directory</request>
</stafcmd>
</sequence>
</testcase>
</iterate>
代碼 7 拷貝 CVS 和 FTP 源碼到編譯服務器中。script 標簽定義了一個數組 directoryList,這個數組有兩個值,分別表示 CVS 源碼目錄和 FTP 目錄。iterate 定義了一個順序循環,分別從 CVS 目錄和 FTP 目錄拷貝文件到編譯服務器中。 stafcmd 標簽調用 STAF 命令,此處我們調用的是 FS(文件系統)服務。copy DIRECTORY 表示我們需要拷貝整個目錄到編譯服務器中。 如果編譯服務器已經有原來的代碼,為了正確起見,可以在拷貝之前使用 fs delete entry 命令來刪除原有的文件。
拷貝文件后,需要通知編譯服務器對更新后的源碼進行編譯。假定在編譯服務器上存在用于編譯源碼的腳本文件 /root/build/build.sh,則調用此腳本文件編譯源碼的 STAX 腳本如代碼 8 所示。
代碼 8:編譯源碼的 STAX 腳本
<stafcmd>
<location>'buildserver'</location>
<service>'process'</service>
<request>'start command "/root/build/build.sh" username "root" password "password"
workdir "/root/build" wait stdout /root/build/build.log'</request>
</stafcmd>
代碼 8 指定以用戶 root 的身份來運行編譯腳本 build.sh,并且將輸出重定向到文件 build.log 中,以便分析編譯運行的過程和結果。另外如果編譯腳本 build.sh 用到某些和路徑相關的命令,比如相對路徑,則需要指定工作目錄。 workdir 指定工作目錄為 build.sh 所在的目錄,這相當于在 /root/build 目錄中運行 build.sh 命令。
3.4 部署測試
更新包編譯完成后,需要將編譯之后的更新包分發到部署服務器和測試服務器,然后部署服務器部署程序,測試服務器調用測試程序來測試更新包。將更新包分發到部署和測試服務器的 STAX 腳本如代碼 9 所示。
代碼 9:更新包分發
<script> serverList = ['deployServer', 'testServer'] </script>
<iterate var = "server" in="serverList">
<testcase name = "'buildCopy'">
<if expr="server != 'deployServer'">
<stafcmd>
<location>'buildserver'</location>
<service>'fs'</service>
<request>'copy DIRECTORY /root/build/result TODIRECTORY /root/build/result
TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES' % server </request>
</stafcmd>
<else>
<stafcmd>
<location>'buildserver'</location>
<service>'fs'</service>
<request>'copy DIRECTORY /root/build/result TODIRECTORY C:/build/result
TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES' % server </request>
</stafcmd>
</else>
</if>
</testcase>
</iterate>
代碼9使用了判斷語句來判斷目標機器的平臺,根據目標機器的平臺選擇不同的文件路徑。當只有兩臺機器時,使用 if-else 的好處并不明顯,甚至還不如分別向 windows 和 linux 機器上單獨拷貝方便。 但考慮如下的情況,環境中有大量的部署服務器和測試服務器,這時一臺一臺的拷貝顯然很難維護,而使用 if-else 加上循環的方式則要方便的多。
部署測試的 STAX 腳本如代碼 10 所示。
代碼 10:部署測試
<sequence>
<stafcmd>
<location>'deployServer'</location>
<service>'process'</service>
<request>'start command "C:/build/deploy.bat > deploy.log" username "Administrator"
password "password" workdir "C:/build" wait '</request>
</stafcmd>
<stafcmd>
<location>'testServer'</location>
<service>'process'</service>
<request>'start command "/root/build/runtest.sh" username "root" password "password"
workdir "/root/build" wait stdout /root/build/runtest.log'</request>
</stafcmd>
</sequence>
代碼 10 中在 Windows 和 Linux 平臺運行命令的方式有細微的區別,在 Windows 中我們使用> deploy.log 來重定向輸出,而在 Linux 中我們使用 stdout 來重定向輸出。具體的原因將在經驗教訓中說明。
至此,我們已經完成了更新包下載、分發、編譯、部署和測試的整個過程,根據本節提供的示例代碼,讀者應該能夠根據自己的環境編寫出適合環境的STAX腳本。另外,讀者也可以自定義一些附加的操作,比如在更新代碼之前,先把原有的代碼刪除;在測試完畢后,把分散于各個服務器上的日志匯總到一臺集中的機器上;甚至和 CruiseControl 結合實現定時或者基于 CVS 上的代碼更新來運行,以及將測試的日志發布到某臺服務器上。
回頁首
4.經驗教訓
雖然現在 STAF(STAX) 已經比較完善,但在實際使用的過程中,我們還是發現了一些問題。本節介紹這些問題以及解決或者避免這些問題的方法,使讀者在碰到這些問題時能夠及時的解決它們。
4.1 使用 STAFCMD 的 process 服務,不要使用 STAX 的 process 標簽
為了編寫 STAX 腳本方便,STAX 定義了 process 標簽用來調用 STAF 中的進程(process)服務。但在使用過程中,發現 STAX 的 process 標簽在某些情況下存在著一定的問題,其所調用的進程不能返回。 代碼 11 的 STAX 腳本就是這樣一個例子。
代碼 11:process 標簽不能返回
<process>
<location>'linuxServer' </location>
<command>'ls'</command>
<parms>'-l'</parms>
</process>
代碼 11 調用 Linux 機器上的 ls 命令,并且傳給 ls 命令 -l 參數。使用 STAXMonitor 執行此腳本,任務始終無法返回。因此推薦使用 stafcmd 標簽直接調用 STAF 服務,如代碼 12 所示。
代碼 12:修改后的任務
<stafcmd>
<location>'linuxServer'</location>
<service>'process'</service>
<request>'start command "ls" parms "-l" wait '</request>
</stafcmd>
4.2 在 Windows 平臺上不要使用 STDOUT 重定向輸出
STAF 使用 STDOUT 來為啟動的進程重定向輸出,類似于>參數,比如 ls -l > ls.log。但在 Windows 平臺使用中,我們發現使用 STDOUT 會帶來一些問題。 如果調用的進程為批處理文件,并且此批處理文件中包含某些特定的功能,比如 xcopy,則 xcopy 將不會工作。另外一些檢查目錄和文件的命令也不能與 STDOUT 共存。 在 Linux 環境中并不存在這樣的問題。因此,如果需要在 Windows 平臺中使用重定向輸出的功能時,建議使用>來重定向輸出。
4.3 使用 STAXMonitor 監控任務的執行情況
對于 STAF 和 STAX 新手來說,盡可能使用 STAXMonitor 來監控 STAX 任務的執行情況。STAXMonitor 為我們提供了足夠詳細的信息,比如測試用例的執行結果,任務執行的消息,當前執行的命令。 使用 STAXMonitor 有助于我們對正在進行的任務進行分析并且監控其執行情況和結果。
STAXMonitor 在 STAX 安裝文件中,可以用java -jar STAXMon.jar 來啟動 STAXMonitor。STAXMonitor 的界面如圖 3 所示。
圖3. STAXMonitor 運行界面
STAXMonitor 會顯示當前正在運行的 STAX 任務,任務號,任務名字,功能,開始時間,執行時間以及結果。Monitored 表示是否正在使用 STAXMonitor 來監控任務。 右鍵單擊任務,然后選擇 Start monitoring,將出現如圖 4 所示的監控界面。
圖 4. STAXMonitor 監控界面
監控界面會顯示正在運行的進程或者STAF命令,命令的詳細信息,比如開始時間、進程或者命令的參數,狀態等。另外還顯示測試用例的狀態。通過STAXMonitor,我們可以很好的監控STAX任務的執行情況。
4.4 將 STAF 注冊為 Windows 平臺上的服務
STAF 并沒有提供開機自動啟動的功能,在 Windows 平臺上,只有當某個用戶登錄后,才會啟動 STAF。這對于自動化測試的環境來說不是一個好消息。 因此我們需要自動啟動 STAF 的功能,這在 Linux 上比較簡單,只要在 /etc/rc.d/rc.local(如果是 SuSE Linux,就是 /etc/rc.d/boot.local)中加入 STAF 的啟動命令/usr/local/staf/bin/STAFProc & 就可以了。 Windows 平臺上就沒有那么方便,因此本小節介紹如何將 STAF 注冊為 Windows 的服務,以便能開機自動重啟。
首先使用 instsrv 命令注冊一個基本的服務 STAF:instsrv STAF c:\winnt\system32\srvany.exe 。
打開注冊表編輯器(regedit),找到鍵值 My Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\STAF。在 STAF 下創建一個鍵,名字為 Parameters。
在 Parameters 鍵下面,創建一個字符串值(String Value),名字為 Application,值為 STAFProc 的完整路徑,比如 C:\STAF\bin\STAFProc.exe。
使用命令services.msc啟動Windows服務窗口,找到STAF,右鍵選擇屬性,然后定位到登錄窗口,選擇“允許服務與桌面交互”。
使用命令net start staf 或者重啟機器來啟動STAF服務。
使用命令staf local service list 來驗證STAF是否已經成功啟動。
回頁首
5.總結
STAF提供了一個自動化測試的平臺,幫助我們進行自動化測試的更新、編譯、部署和測試。STAX為STAF提供了一個執行引擎,幫助加快STAF程序的開發和部署。 因此利用STAF和STAX可以減少測試的工作量和復雜度,加快軟件測試的流程,縮短測試周期。
文章來源于領測軟件測試網 http://www.kjueaiud.com/