本文的目的在於引導讀者去了解STAF及如何調用其接口去實現自動化測試的分布式動行。
提到分布式運行,很多人想到了Jenkins,Jenkins里面有個node插件,可以去分派任務給slave,Jenkins也有console可以查看運行LOG,但Jenkins存在如下幾個問題:
1.需要事先在node里填寫好slave的信息。
2.需要人為的去指派任務到某個slave上
3.多個task一起運行時,console信息是混亂的
4.slave上的報告不好整合
為了解決以上幾點,向大家推薦一款工具STAF(Software Testing Automation Framwork),這款工具可以實現機器與機器間的通信,只要兩台機器互相安裝好STAF工具后,就可以用代碼或控制台來控制另一台slave,這樣的操作是不需要用戶名與密碼的。列舉一下STAF的一些特性:
1.官網及下載地址:http://staf.sourceforge.net/
2.擁有豐富的Service
3.支持JAVA與PY語言擴展
4.我們做分布式一般要用到的Service包括:Ping Service,File System (FS) Service,Process Service,Resource Pool (ResPool) Service
先來看一下分布式應該如何來規划:
1.有三台機器(A1,A2,A3)
2.十個測試腳本要運行(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10)
3.在配置文件中配置每台機器上最多同時運行3個腳本
4.運行時應該這樣分配:A1(T1,T2,T3),A2(T4,T5,T6),A3(T7,T8,T9),T10等待,如果A1,A2,A3中有任何一個腳本運行完成,T10即填充進去。
5.每個腳本運行完成后,把每個腳本運行完成后的結果回傳給主機(可以配置主機為A1)
6.在A1中整合成最后的報告
流程圖如下:
架構圖:
到這里,我相信大家對整個架構應該有一個了解了,如果你有代碼基礎,且對此有興趣的話,請馬上動手實現吧。
下面來講講STAF的Service的調用(JAVA語言)
以Process Service為例,我們打開STAF的user gride且找到Process Service后, 其Description:
The PROCESS service is one of the internal STAF services. It provides the following commands
- START - Starts a process, and optionally registers for process end notification
- STOP - Stops a process
- LIST - Retrieves brief information on processes or lists the operational settings for the Process service
- QUERY - Retrieves detailed information about a process with a specified handle
- FREE - Releases the results data about a process
- NOTIFY REGISTER - Registers for process end notification
- NOTIFY UNREGISTER - Unregisters for process end notification
- NOTIFY LIST - Displays the list of machines/processes to receive process end notification
- SET - Sets operational settings for the Process service
- HELP - Returns syntax information
Syntax
START [SHELL [<Shell>]] COMMAND <Command> [PARMS <Parms>] [WORKDIR <Directory>]
[VAR <Variable=Value>]... [ENV <Variable=Value>]... [USEPROCESSVARS]
[WORKLOAD <Name>] [TITLE <Title>] [WAIT [<Number>[s|m|h|d|w]] | ASYNC]
[STOPUSING <Method>] [STATICHANDLENAME <Name>]
[NEWCONSOLE | SAMECONSOLE] [FOCUS <Background | Foreground | Minimized>]
[USERNAME <User name> [PASSWORD <Password>]]
[DISABLEDAUTHISERROR | IGNOREDISABLEDAUTH]
[STDIN <File>] [STDOUT <File> | STDOUTAPPEND <File>]
[STDERR <File> | STDERRAPPEND <File> | STDERRTOSTDOUT]
[RETURNSTDOUT] [RETURNSTDERR] [RETURNFILE <File>]...
[NOTIFY ONEND [HANDLE <Handle> | NAME <Name>] [MACHINE <Machine>]
[PRIORITY <Priority>] [KEY <Key>]]
如何去用呢:
public void runSTAFProcess() {
try {
STAFHandle handle = new STAFHandle("MyApp/Test");
} catch (STAFException e) {
System.out.println("Error registering with STAF, RC: " + e.rc);
}
String service = "PROCESS";
String request = "START SHELL COMMAND Ruby test.rb RETURNSTDOUT STDERRTOSTDOUT WAIT";
try {
String result = handle.submit("192.168.1.1", service,
request);
STAFMarshallingContext mc = STAFMarshallingContext
.unmarshall(result);
Map mcMap = (Map) mc.getRootObject();
handle.unRegister();
} catch (STAFException e) {
System.out.println("run process error");
}
}
從以上代碼可以看出,我們在submit時的幾個參數,第一個時slave的IP地址,第二個是service名稱(在user guide中可以找到),第三個就是我們需要在slave上運行的命令,其格式在user guide中也可以找到,同時我也相信通過上面的示例,懂一些代碼的人應該都能夠通過syntax而寫出來。
先介紹到這里,希望大家能從中得到啟發,有任何問題可進群(254285583)進行咨詢,很樂意為大家解答問題。
