1. 程式人生 > >如何高效開發jmeter自定義函數

如何高效開發jmeter自定義函數

pri 擴展函數 src project save link pre mage 測試工具

Jmeter是一款開源的性能測試工具,目前是行業內使用率最高的性能測試工具之一,Jmeter是使用JAVA語言開發的,本文介紹如何使用JAVA語言開發自己需要的擴展函數

目前業界流行的兩種開發模式,本文介紹第二種

1、使用Jmeter二次開源環境,直接在org.apache.jmeter.functions包下面開發自己需要的函數,然後導出該jar包,替換Jmeter目錄的ApacheJMeter_functions.jar文件
2、直接在Maven 項目下開發自定義函數,然後打包,該方法、簡單、高效

開發思路

1、使用Eclipse創建Maven 項目,配置Pom文件,引入擴展function所需的依賴包;

2、創建類,然後繼承AbstractFunction,實現四個主方法;
3、對編寫好的項目進行編譯、打包
4、把打包好的函數放到jmeter擴展目錄,調用自定義函數,檢查是否正確;

一、新建Maven項目

1.File》New》Project,選擇Maven》Maven Project,一直點擊Next,此處Package包名一定要以.functions格式結束,否則開發出來的函數,Jmeter讀取不到
技術分享圖片
技術分享圖片
2.配置Pom文件,Pom文件配置的Jmeter4.0版本,只要保存了Pom文件,系統就會自動下載和關聯相應的jar包,Pom配置文件如下:
技術分享圖片
3.保存Pom文件之後,系統會自動下載關聯的依賴文件,如下圖:

技術分享圖片
技術分享圖片
4.此時,由於對pom文件進行了修改,項目頂層會出現一把×,並且編譯可能就會報錯,需要執行Maven》Update Project更新外部依賴的Jar包

  • 更新前:
    技術分享圖片
    技術分享圖片
  • 更新後,編譯、打包正常:
    技術分享圖片
    二、編寫自定義函數代碼
  • 要實現擴展Jmeter function,主要有兩點
    1. 實現function的類的package聲明必須包含".functions"

      JMeter設計讓一些核心的類可以在非UI的方式下運行的時候能被加載進來,這些類會被優先加載。加載這些類的時候是通過命名規則來實現的。所有實現function的類必需包含".functions",所以我們自定義實現的類裏必須包含".functions",比如如下申明的包名為:"jmeter.test.functions"

技術分享圖片

  1. 首先在Jmeter.test.functions包下創建一個類,類名稱為Save_Variable,需要繼承AbstractFunction類,然後實現父類的四個方法

    本次開發的函數實現的效果為通過傳兩個變量,一個是變量名,一個是變量,自動在執行腳本路徑的上一個層級實現自動創建一個txt文檔保存變量,已經有該文件則追加,測試過程中有時候需要對獲取的變量及時保存,如果大批量就可以使用該方法


    
    private static final List<String> desc = new LinkedList<String>();  /*該變量用來獲取對參數值輸入進行描述*/

    private static final String KEY = "__Save_Variable"; /這個是在函數助手上顯示的函數名稱/

    static {
    desc.add("請輸入要保存變量的文件名建議直接用變量名");
    desc.add("請輸入要保存的變量 格式如${name}");
    /該描述是針對函數的輸入值進行描述/
    }

    ***
    
    - 這裏主要是定義變量desc、KEY 然後將描述顯示到函數的參數描述中,如下圖
    ![](https://s1.51cto.com/images/blog/201905/07/0d0d269392580a9593ae47ed96a4eb88.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
    ***
    

    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
    /該函數用來獲取輸入的值/
    /這裏,後面的1,2是指調用函數助手時,可以接受的參數個數,低於1就不會執行/
    checkParameterCount(parameters, 1, 2);
    values = parameters.toArray();
    /將值存入類變量中,把接受到的參數裝成array,然後用value[i]取出來 /
    }

    
    - 該函數作用就是獲取函數輸入框界面輸入的值,將輸入的值傳遞給execute
    ***

    @Override
    public String getReferenceKey() {
    /本方法是提供一個在Jmeter函數助手顯示的函數名稱/
    return KEY;
    }

    - 該函數是提供一個在Jmeter函數助手顯示的函數名稱
    ***
    

    public List<String> getArgumentDesc() {
    /該函數用來獲取對輸入參數的描述/
    return desc;
    }

    - 該函數用來獲取對輸入參數的描述
    ***

    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler)
    throws InvalidVariableException {
    /該函數為執行函數,獲取參數然後用來處理/
    String filename = ((CompoundVariable) values[0]).execute(); /定義變量獲取第一個輸入框的值/
    String variable = ((CompoundVariable) values[1]).execute(); /定義變量獲取第二個輸入框的值/

    String script_path = FileServer.getFileServer().getBaseDir(); /*獲取jmeter執行的腳本所在的路徑*/
    if(script_path.contains("script")==true&&variable.contains("$")==false) { //做一個判斷,如果執行
        System.out.println("該腳本執行路徑為規範路徑(script路徑下),變量保存在data目錄下");
        script_path = script_path.replace("script", "");   //由於獲取的腳本路徑為script路徑,所以需要替換成空值
        script_path = script_path+"data\\"+filename+".txt"; //拼接變量文件的保存路徑
        System.out.println("測試文件保存路徑_"+script_path);
        BufferedWriter out = null;try {
            out = new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream(script_path, true)));
            out.write(variable+"\r\n");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
            }
        }
    }
    else if(script_path.contains("script")==false&&variable.contains("$")==false) {
        System.out.println("該腳本執行路徑不為規範路徑,變量直接保存在執行腳本同路徑下");
        script_path = script_path+"\\"+filename+".txt"; //拼接變量文件的保存路徑
        System.out.println("測試文件保存路徑_"+script_path);
        BufferedWriter out = null;try {
            out = new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream(script_path, true)));
            out.write(variable+"\r\n");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
            }
        }
    }
    
    return null;

    }

    
    - 該函數用來實現獲取輸入的參數,並且進行最後執行,主要實現的功能就是保存jmeter中傳入的變量
    ***
    **三、編譯、打包**
  2. 編寫代碼完成,就可以進行編譯、打包操作了,右鍵點擊項目》Run As》Maven build
    技術分享圖片
  3. 在Goals中輸入package,然後點擊Apply》Run執行編譯,打包操作
    技術分享圖片
  4. 編譯打包完成,在target目錄會生成一個jar包,如下圖所示
    技術分享圖片
    技術分享圖片

四、驗證開發的函數是否正常

  1. 首先把Jmeter.test.functions函數放到jmeter的\lib\ext目錄
    技術分享圖片
  2. 然後啟動jmeter,進入選項》函數助手對話框,選擇 _Save_Variable,輸入要保存的變量文件名,和變量值,點擊生成按鈕(點了生成,系統就會生成一個函數,然後就相當於做了復制功能,可以拷貝到需要調用的地方),本次以內部函數${__counter(false,i)}進行測試
    技術分享圖片
  3. 使用一個sample調用該函數,如下所示
    技術分享圖片
  4. 本次設置1線程,10循環,點擊執行按鈕,執行結果如下:
    技術分享圖片
    技術分享圖片
  5. 本次執行腳本的目錄為script下,所以會在相同層級目錄的data中生成
    技術分享圖片
    完整源碼如下:

技術分享圖片

-----

如果對您有幫助,記得點個贊

如何高效開發jmeter自定義函數