Jmeter 對 Java 請求的測試實施

NO IMAGE

?wx_fmt=gif&wxfrom=5&wx_lazy=1

本文來自作者 勇氣 在 GitChat 上分享 「Jmeter 對 Java 請求的測試實施」,「閱讀原文」檢視交流實錄。

「文末高能」

編輯 | 哈比

概要

本篇文章主要介紹以下三個方面的內容。

  1. 準備工作;

  2. 用 Jmeter 測試 JAVA 工程;

  3. 總結。

準備工作

主要包括以下方面:

  1. JDK 的注意事項;

  2. Jmeter 的配置;

  3. Eclipse 工具的注意事項。

JDK 的注意事項

Jmeter 是依賴 JDK 的,目前從官網下載下來的 Jmeter 支援 JDK1.7 和 1.8;這裡推薦大家自行安裝 JDK1.8 的版本。如果 JDK 版本過低,啟動 Jmeter 時會報錯,報錯資訊如下:

?wx_fmt=png

Jmeter 的配置

1)自行下載 Jmeter(從官網上下載最新版本即可),下載到本地進行解壓縮。解壓後的目錄結構如下圖所示:

?wx_fmt=png

2)配置環境變數

新建系統變數為:JMETER_HOME;

變數值為:D:\TestTool\Jmeter\apache-jmeter-3.1

?wx_fmt=png

配置 CLASSPATH(沒有的話也新建),變數值為:

%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;

%JMETER_HOME%\lib\jorphan.jar;

%JMETER_HOME%\lib\logkit-2.0.jar;如果沒有其他值,那麼前面應該加 .;這個三個 jar 必須配置在 CLASSPATH 中。

?wx_fmt=png

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 工程中;

?wx_fmt=png

這一步是關鍵,反編譯 ApacheJMeter_java.jar,可以看到 JavaSampler 類,這即是 Jmeter 可以測試 JAVA 請求的關鍵所在。

用 Jmeter 測試 JAVA 工程

新建工程

在 Eclipse 裡新建一個 JAVA 工程。

?wx_fmt=png

定義一個類為 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。

?wx_fmt=png

編寫輔助函式

要想將 Java 的 jar 匯入到 Jmeter 的 Java 請求中,需要編寫 Jmeter 的輔助方法,常用的方法如下:

1)public Arguments getDefaultParameters(),用於獲取 Jmeter 介面上的引數。如下所示:

?wx_fmt=png

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 的基本結構,缺一不可。

除了上述四個主要方法外,還有如下方法:

  1. sampleStart() 用來定義一個事務的開始;

  2. sampleEnd() 用來定義一個事務的結束;

  3. addArgument(“ 引數名稱 “,” 引數值 “),定義引數;

  4. 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。

?wx_fmt=png

右鍵->Export,選擇匯出 jar;

?wx_fmt=png

點選 next,選擇 JAR file,並將 jar 命名為:sum.demo.jmeter.sampler.jar(名字任取)

?wx_fmt=png

點選 finish,此時 jar 就成功匯出了。

將 jar 匯入到 Jmeter

將 sum.demo.jmeter.sampler.jar 複製到\apache-jmeter-3.1\lib\ext 目錄下,如果 JAVA 工程還依賴有其他的 jar 包,我們就將其全部複製到\apache-jmeter-3.1\lib 目錄下。

?wx_fmt=png

Jmeter 執行 JAVA 工程

以管理員身份開啟 Jmeter 後,

1)測試計劃-> 新增->Threads(Users)-> 執行緒組

?wx_fmt=png

2)執行緒組-> 新增->Sampler->Java 請求

?wx_fmt=png

3)選擇我們測試的類名稱並且給引數 numa 和 numb 分別複製為 8 和 6;

?wx_fmt=png

4)執行緒組-> 新增-> 監聽器-> 檢視結果樹

?wx_fmt=png

5)執行

?wx_fmt=png

6)檢視結果樹

?wx_fmt=png

此時可以看到 JAVA 工程已經被成功呼叫,並且在 “ 檢視結果樹 “ 中成功列印了請求和響應資訊。響應結果也與預期相符。

總結

通過本次實踐過程,總體說明如下:

  1. 當測試過程中出現效能問題時,可以繼續拆分事務,以便更好的定位效能瓶頸。

  2. Jmeter 要想載入出我們的測試類,必須滿足以下條件:

    Jmeter 執行所依賴的 JDK 版本>JAVA 工程編譯所使用的 JDK 版本;

    必須在 JAVA 工程裡編寫繼承自 AbstractJavaSamplerClient 的測試類;

  3. JavaSampler 的編寫是有先後順序的,方法也是固定統一的,一定要認真掌握。

近期熱文

從零開始,搭建 AI 音箱 Alexa 語音服務

修改訂單金額!?0.01 元購買 iPhoneX?| Web談邏輯漏洞

讓你一場 Chat 學會 Git

介面測試工具 Postman 使用實踐

如何基於 Redis 構建應用程式元件

深度學習在攝影技術中的應用與發展


?wx_fmt=jpeg

「閱讀原文」看交流實錄,你想知道的都在這裡