Xebium詳解13-其他系統集成想法

Xebium本身作為一個自動化測試架構,給測試帶來便利;同時又可以利用wiki這種markdown語法進行團隊信息和知識傳遞工具。那麼,我們是否可以再集成其他的工具或者架構來完善整個開發測試流程呢?是否能利用後端開進程方式調用其它系統呢?答案是肯定的,就拿最常用的API mock工具來說,moco server應該是開發和測試比較常用的工具之一,給調試API或者單元測試帶來了方便。以它為工具,做個實例進行集成操作。如果要集成其他系統,比如Jmeter,應該也可以同樣操作。

1. 安裝moco server:

mocoserver可以從github上免費得到,我們可以直接放在Xebium的主目錄下,就是一個jar文件,可以通過命令行啟動,啟動和配置方法可以參考相關文檔,這裡不做闡述。

dreamhead/moco?

github.com圖標

2. 用Xebium啟動Moco Server:

由於需要配置文件來啟動server,我們假設配置文件為"00-GeneralConfiguration.json" (直接用多節點配置的方案,把不同的路徑配置用不同文件來單獨配置) 和"01-DefaultMockServerConfig.json"。暫時可以為空,甚至文件都不用建,只要假設有這2個文件。由於我們還需要把server輸出寫入文件,我們可以新建一個bat文件,內容如下(假設目錄為C:Xebiummoco-server,啟動的埠為9000,千萬別和Xebium的埠衝突):

@echo off

cd C:Xebiummoco-server

java -Dfile.encoding=UTF-8 -jar c:Xebiummoco-servermoco-runner-0.12.0-standalone.jar http -p 9000 -g "00-GeneralConfiguration.json" > c:Xebiummoco-server
un_%date:~0,4%%date:~5,2%%date:~8,2%.log

輸出文件,日期我在gbk環境下是這樣,如果是其他的,大家可以試驗或者寫死一個固定文件名也可以,到此準備工作做完。

用java開發啟動moco server的介面,其實就是調用bat文件執行即可(如果是linux,那麼用bash腳本也可以):

public class SystemKits { public String runCmdOnWin(String command){ try { Runtime.getRuntime().exec(command); return "SUCCESS"; } catch (IOException e) { // TODO Auto-generated catch block return "FAIL"; } }}

Xebium腳本為:

!4 啟動MocoServer服務腳本|script |!-SystemKits-! ||check |runCmdOnWin |cmd /c CALL C:Xebiummoco-servermoco-run.bat& |SUCCESS |

註:目前還啟動不了,因為還沒有相關配置文件。

3. 創建配置文件

配置文件可以直接在:Xebiummoco-server目錄下,創建"00-GeneralConfiguration.json" 和"01-DefaultMockServerConfig.json"兩個文件搞定,但利用Xebium可以把配置文件開放出去,可以在網頁上查看編輯。

Xebium中因為擔心字元串的翻譯輸出,可以用{{{和}}}包括進去來排除wiki的文本渲染。

可以在一個test suite中新建多個靜態頁(Static Page)來編輯腳本,假設00-GeneralConfiguration.json的配置如下:

[ { "context": "/", "include": "01-DefaultMockServerConfig.json" }]

那麼00-GeneralConfiguration.json靜態頁的腳本內容如下:

{{{[ { "context": "/", "include": "01-DefaultMockServerConfig.json" }]}}}

根節點的配置文件01-DefaultMockServerConfig.json,也同樣用一個靜態頁表示的話,腳本如下:

{{{[ { "description": "默認GET請求返回", "request" : { "method" : "get", "uri" : "/" }, "response" : { "status" : "200", "text" : "Moco Server - A Third-Party API Sim Platform! Its running now." } }]}}}

Xebium的腳本結構如下:

但配置文件的格式多了{{{和}}},另外所在目錄也不對,所以需要把配置搬到c:Xebiummoco-server下,代碼如下:

public class StringKits { public String getContentBetweenAnd(String input, String beginStr, String endStr, int index){ String content = ""; if(null != input && null != beginStr && null != endStr) { String pat = Pattern.quote(beginStr) + "([\s|\S|.]*?)" + Pattern.quote(endStr); Pattern p=Pattern.compile(pat); Matcher m=p.matcher(input); int i = 0; while(m.find()){ content = m.group(1); //eliminate start and end chars if(++i == index){ break; } } } else { content = "BLANK"; } return content; }}

讀取和寫入文件的代碼如下:

public class FileKits { private File file = null; public String readTxtFile(String filename){ this.file = new File(filename); return this.readTxtFile(); } public String readTxtFile() { //讀取文本文件 String fileContent = ""; try { if(file.isFile() && file.exists()) { InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8"); BufferedReader reader=new BufferedReader(read); String line; while ((line = reader.readLine()) != null) { fileContent += line + System.getProperty("line.separator"); } read.close(); } } catch (Exception e) { e.printStackTrace(); } return fileContent; } public String writeTxtFile(String fileName, String fileContent) { //寫入文本文件 File f = new File(fileName); try { if (!f.exists()){ f.createNewFile(); } OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(f),"UTF-8"); BufferedWriter writer=new BufferedWriter(write); writer.write(fileContent); writer.flush(); writer.close(); return "SUCCESS"; } catch (Exception e){ return "ERROR"; } }}

Xebium的腳本如下,靜態頁的目錄可以參考Xebium詳解03-目錄結構和頁面類型:

!3 全局配置文件!4 獲取全局配置文件|script |!-FileKits-! ||$content= |readTxtFile |c:XebiumFitNesseRootFrontPageMocoServer0-GeneralConfigurationcontent.txt |!4 排除掉格式轉換符|script |!-StringKits-! ||$filecontent= |getContentBetweenAnd; |$content |!-{{{-! |!-}}}-!|1 |!4 把全局配置文件寫入!-MocoServer-!的啟動目錄中|script |!-FileKits-! ||check |writeTxtFile; |c:Xebiummoco-server0-GeneralConfiguration.json |$filecontent |SUCCESS |!3 節點配置文件/!4 獲取配置文件|script |!-FileKits-! ||$content= |readTxtFile |c:XebiumFitNesseRootFrontPageMocoServer1-DefaultMockServerConfigcontent.txt |!4 排除掉格式轉換符|script |!-StringKits-! ||$filecontent= |getContentBetweenAnd; |$content |!-{{{-! |!-}}}-!|1 |!4 把全局配置文件寫入!-MocoServer-!的啟動目錄中|script |!-FileKits-! ||check |writeTxtFile; |c:Xebiummoco-server1-DefaultMockServerConfig.json |$filecontent |SUCCESS |

把這個腳本放到啟動moco server的腳本前,就能啟動實例,返回"SUCCESS"。

4. 關閉moco server:

可以用windows下的"wmic process"和"taskkill"查找PID並殺掉進程。代碼如下:

public class SystemKits { public String getPIDOnWinForJavaByCommandName(String commandName){ String pid = "NotFound"; String cmd = "cmd /c wmic process where (Name="java.exe" AND CommandLine like "%%" + commandName + "%%") get ProcessId"; ArrayList<String> lines = new ArrayList<String>(); try { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec(cmd); BufferedReader stdbr = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader errorbr = new BufferedReader(new InputStreamReader(process.getErrorStream())); String line = null; while((line=stdbr.readLine()) != null){ lines.add(line); } while((line=errorbr.readLine()) != null){ lines.add(line); } String str = lines.get(2).trim(); if(isInteger(str)){ pid = str; } return pid; } catch (Exception e) { return "ERROR"; } } public String killProcessOnWinByPID(String pid){ try { if(isInteger(pid)) { Runtime.getRuntime().exec("taskkill /F /PID " + pid); return "SUCCESS"; } else { return "FAIL"; } } catch (Exception e) { return "FAIL"; } } private boolean isInteger(String str) { if(!str.trim().isEmpty()){ Pattern pattern = Pattern.compile("^[-\+]?[\d]*$"); return pattern.matcher(str).matches(); } else { return false; } }}

同時,getPIDOnWinForJavaByCommandName方法可以驗證moco server是否啟動。驗證啟動的腳本如下,可以加入啟動腳本的最後:

!4 驗證MocoServer是否啟動完成|script |!-SystemKits-! ||check |getPIDOnWinForJavaByCommandName |moco-runner |>0 |

接著我們來看殺moco server的進程腳本:

!4 獲取MocoServer的PID|script |!-SystemKits-! ||$pid= |getPIDOnWinForJavaByCommandName |moco-runner |!4 根據PID,後台殺相關MocoServer的進程|script |!-SystemKits-! ||check |killProcessOnWinByPID |$pid |SUCCESS |

至此,所有的工作完工,不僅可以啟停moco server,還可遠程編寫API mock的腳本(如果需要添加URL節點,比如/test,那麼需要添加一個節點配置文件,同時需要修改全局配置文件00-GeneralConfiguration)。Moco Server的配置方法可以參考:

dreamhead/moco?

github.com圖標

Moco Server本身也可以寫java直接執行和配置,當然這也是另外一種集成方案,大家可以自己實驗。JMeter原先也提供Java執行方案,現在似乎不提供了,但這個思路也同樣可用於集成Jmeter,不多說了,大家自己參考實現吧。


推薦閱讀:

認識介面測試
遇到這樣的HR,我們必須要懟他!
15個常見正則表達式
軟體測試的具體概念有哪些?
軟體測試對於零基礎該怎麼制定學習思路

TAG:自動化測試 | 軟體測試 | 軟體測試和開發 |