如何高效開發jmeter自定義函數
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,主要有兩點
- 實現function的類的package聲明必須包含".functions"
JMeter設計讓一些核心的類可以在非UI的方式下運行的時候能被加載進來,這些類會被優先加載。加載這些類的時候是通過命名規則來實現的。所有實現function的類必需包含".functions",所以我們自定義實現的類裏必須包含".functions",比如如下申明的包名為:"jmeter.test.functions"
- 實現function的類的package聲明必須包含".functions"
-
首先在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中傳入的變量 *** **三、編譯、打包**
- 編寫代碼完成,就可以進行編譯、打包操作了,右鍵點擊項目》Run As》Maven build
- 在Goals中輸入package,然後點擊Apply》Run執行編譯,打包操作
- 編譯打包完成,在target目錄會生成一個jar包,如下圖所示
四、驗證開發的函數是否正常
- 首先把Jmeter.test.functions函數放到jmeter的\lib\ext目錄
- 然後啟動jmeter,進入選項》函數助手對話框,選擇 _Save_Variable,輸入要保存的變量文件名,和變量值,點擊生成按鈕(點了生成,系統就會生成一個函數,然後就相當於做了復制功能,可以拷貝到需要調用的地方),本次以內部函數${__counter(false,i)}進行測試
- 使用一個sample調用該函數,如下所示
- 本次設置1線程,10循環,點擊執行按鈕,執行結果如下:
- 本次執行腳本的目錄為script下,所以會在相同層級目錄的data中生成
完整源碼如下:
-----
如果對您有幫助,記得點個贊
如何高效開發jmeter自定義函數