如何用STAF進行自動化測試分布式運行


  本文的目的在於引導讀者去了解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)進行咨詢,很樂意為大家解答問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM