JMeter性能測試-自定義Java腳本

使用JMeter做性能測試時,我們通常都是需要自己編寫測試腳本,才能滿足測試用例的需求,Jmeter也是支持我們自定義編寫測試腳本的,而且支持Java、Python等多種語言。在這裏,我們選擇使用Java語言開發測試腳本,是因爲Jmeter本身也是用Java實現的,所以使用Java開發腳本會更好。

首先,使用Eclipse或者IntelliJ IDEA來新建一個項目,然後新建一個包,再從Jmeter的lib/ext目錄下中拷貝ApacheJMeter_java.jar和ApacheJMeter_core.jar兩個文件,然後引入這兩個JAR包到項目中。在IntelliJ IDEA中的操作如下:

點擊File->Project Structure
點擊Project Structure界面左側的Modules
在Dependencies標籤界面下
點擊底部的+號,
選擇第一個選項JARs or directories…
選擇相應的jar包,點擊OK

IntelliJ IDEAä¸ç导å¥æä½

然後,我們在包中新建一個TestNum類,該類繼承ApacheJMeter_java.jar包中的AbstractJavaSamplerClient類,引用它就可以調用了。在繼承AbstractJavaSamplerClient類的時候,我們需要實現4個方法:

setupTest():初始化方法,用於初始化性能測試時的每個線程,實際運行時每個線程僅執行一次
getDefaultParameters():用於設置傳入的參數,可以設置多個,已設置的參數會顯示到Jmeter參數列表中
runTest():性能測試時的線程運行體,即測試執行的循環體,根據線程數和循環次數的不同可執行多次
teardownTest():測試結束方法,用於結束性能測試中的每個線程,實際運行時,每個線程僅執行一次,在測試方法運行結束後執行
具體的代碼實現如下:
 

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 TestNum extends AbstractJavaSamplerClient {
    // SampleResult類封裝了從入口樣本返回的各種信息
    private SampleResult results;
    // 輸入的數字
    private String inNum;
    // 需要匹配的數字
    private String resultNum;

    // 用於設置傳入的參數,可以設置多個,已設置的參數會顯示到Jmeter參數列表中
    // Arguments類表示一組參數對象
    public Arguments getDefaultParameters() {
        // 聲明定義Arguments類
        Arguments params = new Arguments();
        // 添加一個新參數
        params.addArgument("inNum", "");
        params.addArgument("resultNum", "66");
        return params;
    }

    // 初始化方法,用於初始化性能測試時的每個線程,實際運行時每個線程僅執行一次
    //
    // JavaSamplerContext類用於向JavaSamplerClient實現提供上下文信息
    // 這當前由在GUI中指定的初始化參數組成,其他數據將來可以通過JavaSamplerContext訪問
    public void setupTest(JavaSamplerContext jsc) {
        // 定義SampleResult類
        results = new SampleResult();
        // 以String形式獲取指定參數的值,或者如果未指定該值,則返回指定的默認值
        inNum = jsc.getParameter("inNum", "");
        resultNum = jsc.getParameter("resultNum", "");
        if (inNum != null && inNum.length() > 0) {
            // 設置採樣器數據
            results.setSamplerData(inNum);
        }
        if (resultNum != null && resultNum.length() > 0) {
            results.setSamplerData(resultNum);
        }
    }

    // 性能測試時的線程運行體,即測試執行的循環體,根據線程數和循環次數的不同可執行多次
    public SampleResult runTest(JavaSamplerContext arg0) {
        boolean flag = false;
        // 定義一個事務,表示這是事務的起始點
        results.sampleStart();
        for (int i = inNum.length(); --i >= 0; ) {
            // 使用isDigit判斷是否爲數字,charAt方法用於返回指定索引處的字符
            if (!Character.isDigit(inNum.charAt(i))) {
                flag = false;
            } else {
                flag = true;
            }
        }
        for (int j = resultNum.length(); --j >= 0; ) {
            if (!Character.isDigit(resultNum.charAt(j))) {
                flag = false;
            } else {
                flag = true;
            }
        }
        // 定義一個事務,表示這是事務的結束點
        results.sampleEnd();
        if (flag) {
            Integer num = Integer.parseInt(inNum);
            Integer rsNum = Integer.parseInt(resultNum);
            if (num == rsNum) {
                // 設置SampleResult對象的編碼和響應數據
                results.setResponseData("恭喜你,答對了O(∩_∩)O~\n答案是【" + resultNum + "】", "UTF-8");
                // 設置SampleResult對象的成功屬性,即返回正確還是錯誤
                results.setSuccessful(true);
            } else if (num > rsNum) {
                results.setResponseData("好像大了點~~~~(>_<)~~~~ \n您輸入的是【" + inNum + "】", "UTF-8");
                results.setSuccessful(false);
            } else {
                results.setResponseData("好像小了點~~~~(>_<)~~~~ \n您輸入的是【" + inNum + "】", "UTF-8");
                results.setSuccessful(false);
            }
        } else {
            results.setResponseData("請輸入數字:~~~~(>_<)~~~~ \n您輸入的inNum是【" + inNum + "】,resultNum是【" + resultNum + "】", "UTF-8");
            results.setSuccessful(false);
        }
        return results;
    }

    // 測試結束方法,用於結束性能測試中的每個線程,實際運行時,每個線程僅執行一次,在測試方法運行結束後執行
    public void teardownTest(JavaSamplerContext arg0) {
    }
}

然後將上面的代碼打包成jar包,生成的包名稱爲TestNum.jar,在IntelliJ IDEA中的操作如下:

點擊File->Project Structure
點擊Project Structure界面左側的Artifact
依次點擊底部的+>JAR>Empty
輸入這個jar的Name,下面有這個jar包生成的路徑Output directory
在Output Layout中點擊+>Module Output給這個jar包添加Module Output
點擊OK退出Project Structure面板
最後依次點擊Build>Build Artifacts…>TestNum>Build/Rebuild
生成jar包後,將jar包拷貝到Jmeter的lib/ext目錄下。之後啓動Jmeter,添加線程組和Java請求,同時爲了方便,我們用隨機數函數(選項--函數助手)來隨機抽取數字,驗證與resultNum匹配的結果,再添加察看結果樹和聚合報告。

設置線程數爲10,執行後可以看到,10個請求中,有3個請求回答正確,響應數據對應了我們的代碼,表示執行成功。

通過使用Jmeter自定義Java測試代碼,再配合Jmeter自帶的各種函數,就可以實現絕大多數的性能測試需求。

 

轉載自原文:https://blog.csdn.net/hekaiyou/article/details/79439046

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章