Jmeter 自帶有各種功能豐富的函數,可以幫助我們進行測試,但有時候提供的這些函數并不能滿足我們的要求,這時候就需要我們自己來編寫一個自定義的函數了。例如我們在測試時,有時候需要填入當前的時間,雖然我們可以使用props.get("START.YMD")來獲取當前日期,但使用起來很不方便。所以今天就來寫一個獲取當前時間的函數,并且可以自定義時間的顯示格式。
?
一、創建Package及類
- 在IDEA中創建一個Java項目(此步略),再創建一個包。包名必須是含有function?,如:package com.hetc.functions;?在function包下創建一個Java類
??
- 類創建后要繼承AbstractFunction?抽象類,繼承后需要實現的方法為execute()、setParameters()、getReferenceKey()、getArgumentDesc()?
二、方法詳解
execute()方法
函數的執行主方法,可以實現主要的處理邏輯,該方法的返回結果會顯示在函數助手的The result of the function is欄
?
方法內容:
@Overridepublic String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {// 獲取函數的參數,并進行格式轉換String s = String.valueOf(((CompoundVariable) this.arrayValue[0]).execute());DateTimeFormatter formatter = DateTimeFormatter.ofPattern(s);return formatter.format(LocalDateTime.now());}
setParameters()方法
該方法用來接收和處理用戶輸入的函數參數,即獲取在Jmeter函數助手中,函數參數的值中輸入的內容
?
方法中如果沒有其他處理邏輯的話,直接使用默認寫法即可:
@Overridepublic void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {// 判斷參數的個數是否為 1checkParameterCount(collection, 1);// 將入參轉為數組this.arrayValue = collection.toArray();}
getReferenceKey()方法
定義函數的名稱,即函數助手下拉列表中顯示的內容,以及調用函數時的函數名
??
可以直接return一個名稱,我這里是通過在類的開始定義一個常量,在return這個常量
private static final String KEY = "__TimeMaker";@Overridepublic String getReferenceKey() {return KEY;}
getArgumentDesc()方法
用來定義函數入參的描述內容,返回值是一個List<String>格式,函數有幾個參數,就往List中add幾個參數的描述。
??
private static final List<String> desc = new ArrayList<>();static {desc.add("請輸入要展示的時間格式,如“yyyy-MM-dd HH:mm”");}@Overridepublic List<String> getArgumentDesc() {return desc;}
具體的定義方法隨意,無需拘泥于我上面的例子。
完整內容
package com.hetc.functions;import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** @ClassName: TimeFunction* @Author: Jaxx* @Date: 2024/12/5* @Description: Jmeter自定義時間函數**/
public class TimeFunction extends AbstractFunction {private static final String KEY = "__TimeMaker";private static final List<String> desc = new ArrayList<>();private Object[] arrayValue;static {desc.add("請輸入要展示的時間格式,如“yyyy-MM-dd HH:mm”");}@Overridepublic String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {String s = String.valueOf(((CompoundVariable) this.arrayValue[0]).execute());DateTimeFormatter formatter = DateTimeFormatter.ofPattern(s);return formatter.format(LocalDateTime.now());}@Overridepublic void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {checkParameterCount(collection, 1);this.arrayValue = collection.toArray();}@Overridepublic String getReferenceKey() {return KEY;}@Overridepublic List<String> getArgumentDesc() {return desc;}
}
三、打包
在代碼編寫完成后,還需要將其打成Jar包,方法如下:
- 進入idea -> File -> Project Structure?
?
- 如下圖,依次點擊?
- 在彈出窗中依次進行輸入
? - 點擊確定后,回到Project Structure窗口,默認會帶出所有的依賴包,為了減小打出的Jar包的體積,可以將不需要的依賴手動刪除,只保留必須的即可。點擊確定進行保存
- 點擊Build -> Build Artifacts
?
- 選中上一步中的Artifacts,點擊Build,在out目錄中會生成打好的Jar包
四、測試驗證
將打好的Jar包放入jmeter_path/lib/ext目錄,重啟Jmeter后進入函數助手,選中新增的函數TimeMaker,輸入參數值后點擊生成,成功!
?