Jmeter 對 Java 請求的測試實施,jmeterjava

來源:互聯網
上載者:User

Jmeter 對 Java 請求的測試實施,jmeterjava


本文來自作者 勇氣 在 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 時會報錯,報錯資訊如下:

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

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

  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。

右鍵->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 工程已經被成功調用,並且在 “ 查看結果樹 “ 中成功列印了請求和響應資訊。響應結果也與預期相符。

總結

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

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

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

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

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

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

近期熱文

《從零開始,搭建 AI 音箱 Alexa Voice Messaging Service》

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

《讓你一場 Chat 學會 Git》

《介面測試載入器 Postman 使用實踐》

《如何基於 Redis 構建應用程式組件》

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


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

著作權聲明:本文為GitChat作者的原創文章,未經 GitChat 允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.