JMeter介面自動化發包與示例
- 2021 年 11 月 10 日
- 筆記
- javascript, 介面自動化測試
JMeter介面自動化發包與示例
近期需要完成對於介面的測試,於是了解並簡單做了個測試示例,看了看這款江湖上聲名遠播的強大的軟體-Jmeter靠不靠譜。
官網://jmeter.apache.org/index.html
1簡介
- Apache-Jmeter是一個使用java語言編寫且開源,可拓展性較強的測試框架,設計初期用於web應用的壓力性能測試較多,但現在功能已經非常豐富,不僅是壓力,而目前的介面自動化都可以使用該工具完成
- 本次需求只依據業務,簡單設置定時任務,往指定的介面發送介面數據,對介面返回數據做assert斷言判斷結果,體驗一下該軟體與postman有何差異。
2結構
Jmeter左上角點擊文件-新建,即生成一個測試計劃,相當於一個project,並創建以下層級結構
-
聚合報告
查看該測試計劃的執行結果報告,每個執行的介面都統計在這,如果是做壓力測試的話,就可以得出很多次執行的一個介面的性能情況。
-
查看結果樹
查看每個測試介面的執行情況,包括該介面實際發送的包以及介面的響應都可以在這看到。
-
Http資訊頭管理器
消息頭資訊可以在這裡定義,沒定義就是按照默認的頭髮包。
-
setUp執行緒組
該執行緒組在整個項目的自動化時,可以將部分鑒權介面、參數生成與配置等放入該模組,以便確保該模組優先執行。
-
執行緒組
-
前置預處理程式
這裡我選擇beanshell預處理程式,構造後面介面發的數據,可以看到腳本上邊有個tips(scripts variable:ctx vars props prev sampler log),即Jmeter提示在編寫腳本的時候可以使用ctx、vars等類去調用相應的API,這些值比如ctx的具體用法可到官網://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html,常見的API:
- ctx - ( [JMeterContext ](//jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html)) - gives access to the context - vars - ( [JMeterVariables ](//jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html)) - gives read/write access to variables: vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object()); vars.getObject("OBJ2"); - props - (JMeterProperties - class java.util.Properties) - e.g. props.get("START.HMS"); props.put("PROP1","1234"); - prev - ( [SampleResult ](//jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html)) - gives access to the previous SampleResult (if any) - sampler - (Sampler)- gives access to the current sampler
-
業務請求程式碼{單個/多個http請求/循環壓測等}
-
後置預處理程式
//一般來說提取響應內容等列印出來 String statusCode = prev.getResponseCode(); log.info(statusCode);
-
-
tearDown執行緒組
該執行緒組將是最後處理的執行緒組,可以將清除測試數據等放在該模組內部執行。
3程式碼:
-
測試計劃:增加用戶定義變數如下:
host 192.168.3.10 port 50553 longConPort 60443 devNum 1 projectId 1 Token 1 -
beanshell預處理程式中處理需要往介面中帶入的一些隨機變數,這裡需求是要依據主設備的MAC地址等資訊,攜帶子設備的相關資訊通過介面上報給伺服器,於是需要在預處理腳本中新增易於維護的MAC地址資訊,也便於後續壓力測試的時候生成百千萬個設備數據時候做改寫。以下定義一台主設備,31檯子設備的MAC地址程式碼如下:
/** * 生成的device_mac為00-00-0X-00-00-00,其中X這裡定義為了進程號。整個生成規則可自己依據需求定義 * 對應的25個連接中斷的MAC地址也可自定義,client_mac為00-00-0X-00-00-01、00-00-0X-00-00-02……00-00-0X-00-00-25 */ pre_mac = ""; //getThreadNum獲取當前進程編號,進程號從0開始的,這裡結果是1 thread_index = ctx.getThreadNum(); str_index = thread_index + ""; log.info("當前執行緒編號: " + str_index ); //最後生成六位字元串000001 n = 6 - str_index.length(); for (int i=0; i<n; i++) { pre_mac += "0"; } pre_mac += str_index; //正則,每隔兩位數字就在後面插入一個「-」,使其符合mac地址的規範,最後pre_mac變成00-00-01,device_mac00-00-01-00-00-0X為mac地址一共12位, pre_mac = pre_mac.replaceAll("(.{2})", "$1-"); device_mac = pre_mac + "00-00-00"; //將生成的值存入對象vars中,後續在腳本中都可以直接使用//vars.put("client_mac_"+i, client_mac_i)這個參數後面就可以使用${變數名}直接使用; vars.put("device_mac", device_mac); for (int i=1; i<10; i++) { client_mac_i = pre_mac + "00-00-0" + i; vars.put("client_mac_"+i, client_mac_i); log.info(client_mac_i); } for (int i=10; i<31; i++) { client_mac_i = pre_mac + "00-00-" + i; vars.put("client_mac_"+i, client_mac_i); log.info(client_mac_i); } //Token的定義規則,可以用函數生成,也可以在前面的參數中直接加上 deviceToken = "test" + str_index; vars.put("deviceToken", deviceToken);
-
http請求格式
依據前面在測試計劃中設定的值,在這個頁面相應的位置寫上引用即可(格式${變數名}),並依據介面文檔定義,把需要發的包的數據編輯好附在body中並為該用例添加一個斷言即完成一個用例的編寫。
-
循環發送
如下圖所示
4運行結果
經過上面處理後,下面可以啟動測試計劃,並觀察執行的結果如下圖:
5 小結
Jmeter做上述簡單介面的測試上與postman相差無幾,而Jmeter還有很多定時器、監聽器等功能還未使用到,後面使用jmeter做一次完整的性能壓力測試之後,也許才能真正體會到它的強大。