Jmeter 對 Java 請求的測試實施,jmeterjava
本文來自作者 勇氣 在 GitChat 上分享 「Jmeter 對 Java 請求的測試實施」,「閱讀原文」查看交流實錄。
「文末高能」
編輯 | 哈比
概要
本篇文章主要介紹以下三個方面的內容。
準備工作;
用 Jmeter 測試 JAVA 工程;
總結。
準備工作
主要包括以下方面:
JDK 的注意事項;
Jmeter 的配置;
Eclipse 工具的注意事項。
JDK 的注意事項
Jmeter 是依賴 JDK 的,目前從官網下載下來的 Jmeter 支援 JDK1.7 和 1.8;這裡推薦大家自行安裝 JDK1.8 的版本。如果 JDK 版本過低,啟動 Jmeter 時會報錯,報錯資訊如下:
Jmeter 的配置
1)自行下載 Jmeter(從官網上下載最新版本即可),下載到本地進行解壓縮。解壓後的目錄結構如所示:
2)配置環境變數
建立系統變數為:JMETER_HOME;
變數值為:D:\TestTool\Jmeter\apache-jmeter-3.1
配置 CLASSPATH(沒有的話也建立),變數值為:
%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;
%JMETER_HOME%\lib\jorphan.jar;
%JMETER_HOME%\lib\logkit-2.0.jar;如果沒有其他值,那麼前面應該加 .;這個三個 jar 必須配置在 CLASSPATH 中。
Eclipse 工具的注意事項
1)自行下載 Eclipse, 請注意下載的 Eclipse 版本要和 JDK 的版本保持一致,即 64 位元的 JDK 對應的 Eclipse 應該是 64 位元,32 位 JDK 對應的 Eclipse 版本應該是 32 位。
2)將 apache-jmeter-3.1\lib\ext 目錄下的 ApacheJMeter_core.jar 和 ApacheJMeter_java.jar 匯入到 JAVA 工程中;
這一步是關鍵,反編譯 ApacheJMeter_java.jar,可以看到 JavaSampler 類,這即是 Jmeter 可以測試 JAVA 請求的關鍵所在。
用 Jmeter 測試 JAVA 工程建立工程
在 Eclipse 裡建立一個 JAVA 工程。
定義一個類為 SumDemo:實現兩個數的求和,代碼如下:
package com.sum.demo;class Math{ private int a; private int b; // 定義一個方法實現 a+b 的和 public int sumTest(int a,int b){ return a+b; }}public class SumDemo { public static void main(String[] args) { Math m = new Math(); int c = m.sumTest(10, 20); System.out.println(" 兩數相加之和:"+c); }}
匯入 jar
向工程裡匯入 ApacheJMeter_core.jar 和 ApacheJMeter_java.jar。
編寫輔助函數
要想將 Java 的 jar 匯入到 Jmeter 的 Java 請求中,需要編寫 Jmeter 的輔助方法,常用的方法如下:
1)public Arguments getDefaultParameters(),用於擷取 Jmeter 介面上的參數。如下所示:
2)public void setupTest(JavaSamplerContext context), 每個線程只執行一次,編寫一些初始化資料,類似於 LoadRunner 中的 JAVA Vuser 中的 Init() 函數和 Junit 的 setUp();
3)public SampleResult runTest(JavaSamplerContext context) ,JmeterSampler 的主方法,類似於 LoadRunner 中的 JAVA Vuser 中的 Action() 函數;
4)public void teardownTest(JavaSamplerContext context),每個線程執行一次,類似於 LoadRunner 中的 JAVA Vuser 中的 end() 函數和 Junit 的 tearDown();測試結束時調用,常用來編寫關閉流資源,關閉資料庫連接,沒有的話,就什麼都不要寫。
上述方法在執行的時候是有先後順序的,類似於 Testng,執行的先後順序為:
getDefaultParameters()>setupTest(JavaSamplerContext context)>runTest(JavaSamplerContext context)>teardownTest(JavaSamplerContext context)
以上的四個方法組成了 JavaSampler 的基本結構,缺一不可。
除了上述四個主要方法外,還有如下方法:
sampleStart() 用來定義一個事務的開始;
sampleEnd() 用來定義一個事務的結束;
addArgument(“ 參數名稱 “,” 參數值 “),定義參數;
setSuccessful(”true/false”),設定運行結果的成功和失敗,用來協助 Jmeter 統計成功、失敗的次數,並在彙總報告中給與體現;
查看結果樹的顯示方法
必須在程式中編寫如下代碼,才能將運行結果輸出在 “ 查看結果樹 “ 中。代碼如下:
if (resultData != null && resultData.length() > 0) { sr.setResponseData(resultData, null); // 要求標頭中會多個類型輸出 Data type ("text"|"bin"|""): text sr.setDataType(SampleResult.TEXT); }
代碼中的 resultData 為 String 的執行個體對象,sr 為 SampleResult 的執行個體對象;
JmeterSampler 的編寫
為了實現 SumDemo 類中的求和功能,編寫的 JmeterSampler 的代碼如下所示:
package com.sum.demo;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;import org.apache.jmeter.samplers.SampleResult;public class JmeterSampler extends AbstractJavaSamplerClient{private Math ma=null; private String a; private String b; private String resultData; /** 通過 SumDemo 我們知道我們需要傳入參數 a,b, * 所以使用這個方法來定義方法的入參 */ public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("numa", ""); params.addArgument("numb", ""); return params; } // 做一些初始化操作,每個線程執行一次 public void setupTest(JavaSamplerContext context) { System.out.println(" 執行開始 "); ma= new Math(); a = context.getParameter("numa"); b = context.getParameter("numb"); } @Override public SampleResult runTest(JavaSamplerContext context) { SampleResult sr = new SampleResult();sr.setSamplerData(" 請求參數 numa:"+a+"\t"+" 請求參數 numb:"+b);try{ sr.sampleStart();// 事務開始resultData = String.valueOf(ma.sumTest(Integer.parseInt(a), Integer.parseInt(b)));if (resultData != null && resultData.length() > 0) {sr.setResponseData(" 結果是:"+resultData, null);sr.setDataType(SampleResult.TEXT);sr.setSuccessful(true);}} catch(Throwable e) {sr.setSuccessful(false);e.printStackTrace();} finally {sr.sampleEnd();// 事務結束 } return sr; } public void teardownTest(JavaSamplerContext context) { System.out.println(" 執行完畢 ");}}
匯出 jar
選中此時的 Java 工程;將 jar 命名為 com.demo.jmeterTest。
右鍵->Export,選擇匯出 jar;
點擊 next,選擇 JAR file,並將 jar 命名為:sum.demo.jmeter.sampler.jar(名字任取)
點擊 finish,此時 jar 就成功匯出了。
將 jar 匯入到 Jmeter
將 sum.demo.jmeter.sampler.jar 複製到\apache-jmeter-3.1\lib\ext 目錄下,如果 JAVA 工程還依賴有其他的 jar 包,我們就將其全部複製到\apache-jmeter-3.1\lib 目錄下。
Jmeter 運行 JAVA 工程
以管理員身份開啟 Jmeter 後,
1)測試計劃-> 添加->Threads(Users)-> 線程組
2)線程組-> 添加->Sampler->Java 請求
3)選擇我們測試的類名稱並且給參數 numa 和 numb 分別複製為 8 和 6;
4)線程組-> 添加-> 監聽器-> 查看結果樹
5)運行
6)查看結果樹
此時可以看到 JAVA 工程已經被成功調用,並且在 “ 查看結果樹 “ 中成功列印了請求和響應資訊。響應結果也與預期相符。
總結
通過本次實踐過程,總體說明如下:
當測試過程中出現效能問題時,可以繼續拆分事務,以便更好的定位效能瓶頸。
Jmeter 要想載入出我們的測試類別,必須滿足以下條件:
Jmeter 運行所依賴的 JDK 版本>JAVA 工程編譯所使用的 JDK 版本;
必須在 JAVA 工程裡編寫繼承自 AbstractJavaSamplerClient 的測試類別;
JavaSampler 的編寫是有先後順序的,方法也是固定統一的,一定要認真掌握。
近期熱文
《從零開始,搭建 AI 音箱 Alexa Voice Messaging Service》
《修改訂單金額!?0.01 元購買 iPhoneX?| Web談邏輯漏洞》
《讓你一場 Chat 學會 Git》
《介面測試載入器 Postman 使用實踐》
《如何基於 Redis 構建應用程式組件》
《深度學習在攝影技術中的應用與發展》
「閱讀原文」看交流實錄,你想知道的都在這裡
著作權聲明:本文為GitChat作者的原創文章,未經 GitChat 允許不得轉載。