1. 程式人生 > >jmeter beanshell斷言介面自動化例項

jmeter beanshell斷言介面自動化例項

一、JMeter介紹

        Apache JMeter是一款優秀的開源效能測試工具,在國外無論是在效能測試還是介面測試領域都有著非常高的使用率,但由於本身沒有完善的中文文件以及典型開源工具特點(介面不美觀)所以在國內應用並不廣泛。先說說為什麼要選擇JMeter作為介面測試工具,選擇它我主要基於以下幾個原因:

一、成本低並且對編碼要求相對不高。相較針對公司產品特性自主開發一套介面測試自動化框架,用JMeter實現介面測試無需具備非常專業的編碼能力(對於像我這樣的碼渣而言是極好的羨慕),並且成本也要低的多,很適合現如今國內各大網際網路公司流行的敏捷開發流程

二、JMeter的擴充套件性非常好

。雖然原生支援的協議有限,但我們可以根據需要制定自己的Sampler並向伺服器傳送請求。

三、JMeter是開源的。開源不僅意味著免費,更重要的是你可以通過開放的原始碼瞭解工具的所有行為,而不會像商業工具那樣僅僅只能依靠有限的幫助手冊以及網上教程。

二、安裝與環境配置

2.將apache-jmeter-3.0.zip解壓至任意位置。

3.新增環境變數:

變數名 變數值
JMETER_HOME 填入之前安裝包解壓的路徑。例如E:\apache-jmeter-3.0
CLASSPATH 在尾部新增  ;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;
Path 在尾部新增  ;%JMETER_HOME%\bin; 

4.驗證配置是否成功:開啟CMD命令列視窗,輸入jmeter -v,回車,出現下圖則代表配置成功。

三、例項練習

【測試點】

1)斷言首頁精華帖數量是否大於4。

2)斷言主題為"MTSC2018 早鳥票開售..."的帖子是否為精華帖。

【思路】

首先開啟TesterHome首頁地址利用json格式化工具分析一下返回的json資料,發現是否為精華帖是由excellent這個引數定義的,excellent等於1則是精華帖,等於0則不是,那麼接下來要做的就很簡單了。

1)獲取首頁返回的json

2)解析json並計算出excellent為1的帖子數量,以此得出精華帖總數。

3)解析json獲取主題為"MTSC2018 早鳥票開售..."帖子對應的excellent值,以此判斷是否為精華帖。

【下載json依賴包】

【準備工作就緒,開工】

一、首先執行Jmeter(可以直接執行\apache-jmeter-3.0\bin下的jmeter.bat或在CMD直接輸入jmeter然後回車)

二、在"測試計劃"下依次新增執行緒組、Sampler-HTTP請求

三、在HTTP請求頁面填寫請求資訊(本例中訪問的地址無需設定請求引數),名稱隨意填寫

四、接下來新增BeanShell PostProcessor,用來獲取JSONArray物件並賦值給JMeter內建變數。但在此之前我們先新增依賴路徑使得JMeter可以正常引用json依賴包,步驟如下:

1.在"...apache-jmeter-3.0\bin"目錄下新建dependencies資料夾,並將剛才下載下來的json依賴包(json-20140107.jar)複製進去

2.開啟"...apache-jmeter-3.0\bin"目錄下的jmeter.properties配置檔案,搜尋"plugin_dependency_paths=",刪除該行的註釋並設定為plugin_dependency_paths=../dependencies,最後儲存;至此配置成功,在JMeter的BeanShell PostProcessor裡就可以正常引用jar依賴包了。

3.不知道為什麼有時候通過上述方法仍無法正常引用外部jar包,那麼為了以防萬一,強烈建議在測試計劃中通過瀏覽將需要匯入的jar包引入

五、右鍵點選"HTTP請求"->新增->後置處理器->BeanShell PostProcessor,並在指令碼新增程式碼用以獲取"topics"下JSONArray物件(請無視這粗鄙的程式碼結構。。。害羞

  1. import org.json.*;

  2. //設定全域性變數

  3. static public int excellent_count = 0;

  4. //獲取最後一次請求返回資料 (JMeter內建方法)

  5. String jsonResult = prev.getResponseDataAsString();

  6. //分析:TestHome首頁json資料結構為{"topics":[{...},{...}...]},外層JSONObject內層JSONArrary

  7. //獲取"topics"下JSONArray物件

  8. JSONObject jsonObject = new JSONObject(jsonResult);

  9. JSONArray jsonArray = jsonObject.getJSONArray("topics");

  10. String string_jsonArray = jsonArray.toString();

  11. vars.put("string_jsonArray",string_jsonArray);

六、新增斷言Case01(對應第一條測試點),右鍵點選"HTTP請求"->新增->斷言->BeanShell斷言,然後填入以下指令碼:從BeanShell PostProcessorh提供的內建變數中獲取JSONArray物件,然後通過條件"excellent=1"得出精華帖總數,從而判斷精華帖是否>4

  1. import org.json.*;

  2. //設定全域性變數用於記錄精華帖數量

  3. static public int excellent_count = 0;

  4. //從BeanShell PostProcessor獲取jsonArray

  5. var b = vars.get("string_jsonArray");

  6. JSONArray jsonArray = new JSONArray(b);

  7. //計算精華帖數量

  8. for (int i = 0;i < jsonArray.length();i++) {

  9. excellent_result = jsonArray.getJSONObject(i).getInt("excellent");

  10. if (excellent_result == 1){

  11. //迴圈遍歷全部文章的excellent值,若為1則精華帖數量excellent_count+1

  12. excellent_count = excellent_count + 1;

  13. }

  14. }

  15. if (excellent_count >4){

  16. //Failure為false代表斷言成功,且結果樹不顯示該斷言

  17. Failure = false;

  18. //日誌輸出結果

  19. log.error("【Case01】執行成功,精華帖數量為" + excellent_count + "個。");

  20. }else{

  21. //Failure為true則代表斷言失敗

  22. Failure = true;

  23. //設定FailureMessage為斷言失敗資訊

  24. FailureMessage = "【Case01】執行失敗,精華帖數量為" + excellent_count + "個。" ;

  25. log.error("【Case01】執行失敗,精華帖數量為" + excellent_count + "個。" );

  26. }

七、新增斷言Case02,並填入指令碼:獲取主題為"MTSC2018 早鳥票開售..."帖子對應的excellent引數值,以此來判斷是否為精華帖

  1. import org.json.*;

  2. //設定全域性變數excellent_result用於儲存excellent值

  3. static public int excellent_result;

  4. //從BeanShell PostProcessor獲取jsonArray

  5. var b = vars.get("string_jsonArray");

  6. JSONArray jsonArray = new JSONArray(b);

  7. for (int i = 0;i < jsonArray.length();i++) {

  8. //獲取titile值

  9. String title = jsonArray.getJSONObject(i).getString("title");

  10. //當title="2018年TesterHome 全員感恩紅包發放"時獲取對應excellent值

  11. if ( "MTSC2018 早鳥票開售啦_中國移動網際網路測試開發大會".equals(title)){

  12. excellent_result = jsonArray.getJSONObject(i).getInt("excellent");

  13. break;

  14. }else{

  15. continue;

  16. }

  17. }

  18. //校驗結果excellent為0則斷言成功,若為1則斷言失敗

  19. if(excellent_result == 0){

  20. Failure = false;

  21. //日誌輸出結果

  22. log.error("【Case02】執行成功,excellent值為" + excellent_result + ",此帖非精華帖。");

  23. }else{

  24. Failure = true;

  25. FailureMessage = "【Case02】執行失敗,excellent值為" +excellent_result ;

  26. log.error("【Case02】執行失敗,excellent值為" + excellent_result + ",此帖為精華帖。");

  27. }

八、新增"察看結果樹",用來察看斷言執行結果。另外由於指令碼中部分執行結果由log輸出,因此需要將"選項"下的"Log Viewer"選項勾上,這樣就可以察看日誌資訊了。(建議將jmeter.properties配置檔案中的log_level.jmeter以及log_level.jmeter.junit分別設定為log_level.jmeter=ERROR、log_level.jmeter.junit=DEBUG,過濾不必要的日誌資訊)

九、最後儲存檔案並執行(點選操作欄中綠色三角箭頭),檢視執行結果

【結論】從右下方的日誌視窗可以看到,由於精華帖數量為3因此斷言Case01失敗,而上方的察看結果樹中這條斷言也顯示為紅色代表失敗,Case02執行成功,因此不會顯示在察看結果樹中。

四、總結

        至此,一個簡易的介面自動化測試框架便搭建完成,基本可以應付一些不太複雜的測試場景。

        JMeter就好比一把瑞士軍刀,麻雀雖小但五臟俱全,雖不及一些商業測試工具那樣能夠提供龐大的"套件",卻也憑藉著自己的靈活性幾乎無所不能。