Jmeter作爲基於java開源的壓測工具,其擴展性是很便捷的。之前自己編寫實踐瞭如何擴展jmeter的function函數,大家可以按照如下方法盡情的擴展自己想要實現的任何基礎函數。
1、總體思路
擴展JMeter的function可以分成下面幾個步驟:
1、在Eclipse中新建Maven項目,引入擴展JMeter function所需的依賴包;
2、編寫實現自定義function的代碼,並對其編譯打包;
3、將編譯好的包拷貝至JMeter的擴展目錄下;
4、運行查看自定義的function是否正確;
2、新建項目
在Eclipse中新建一個Maven項目,File > New > Project,選擇Maven Project;然後引入擴展jmeter function的2個依賴包,我用的是jmeter3.3版本。如下圖。
3、編寫JMeter function代碼
要實現擴展JMeter function,主要有兩點:
1、 實現function的類的package聲明必須包含".functions"。
JMeter設計讓一些核心的類可以在非UI的方式下運行的時候能被加載進來,這些類會被優先加載。加載這些類的時候是通過命名規則來實現的。所有實現function的類必需包含".functions",所以我們自定義實現的類裏必須包含".functions",比如如下申明的包名爲:"jmeter.test.functions"。
2、需要繼承AbstractFunction,並且實現相應的方法。
AbstractFunction類提供了4個抽象方法,在擴展的時候需要實現他們。
1、public void setParameters(Collection<CompoundVariable> parameters)
throws InvalidVariableException
這個方法在用於傳遞用戶在執行過程當中傳入的實際參數值。該方法在function沒有參數情況下也會被調用。一般該方法傳入的參數會被保存在類內全局變量裏,並被後面調用的execute方法中使用到。
2、public String execute(SampleResult previousResult, Sampler currentSampler)
throws InvalidVariableException
JMeter會將上次運行的SampleResult和當前的Sampler作爲參數傳入到該方法裏,返回值就是在運行該function後得到的值,以String類型返回。該方法如果操作了非線程安全的對象(比如文件),則需要將對該方法進行線程同步保護。
3、public String getReferenceKey()
這個就是function的名字。JMeter的命名規則是在方法名前面加入雙下劃線"__"。比如"__MyRandomFunc",function的名字跟實現該類的類名應該一致,而且該名字應該以static final的方式在實現類中定義好,避免在運行的時候更改它。
4、public List<String> getArgumentDesc()
最後在你的實現類中還需要提供一個方法來告訴JMeter關於你實現的function的描述。
4、測試function正確性
右擊項目選址export 》選擇jar file,如下打包成一個jar包。
把這個JAR拷貝至$JMETER__HOME/lib/ext目錄下,重新啓動JMeter。打開選項中的函數助手對話框,如果配置正確的話就能出現自己定義的function,如下所示。每次點擊右下角的生產按鈕,會生成調用該function隨機數字,每點擊一次,這個值就不一樣,可見編寫的函數是正確的。
5、完整的源碼
大家可以參考如下的代碼,修改成自己想要擴展的,今後就可以隨心所欲的編寫一些基礎功能的函數了。
如果需要完整的工程,可在微信公衆號大話性能發送:jmeter函數工程,即可獲取下載工程密碼。
完整工程下載地址:https://share.weiyun.com/5JoDvIh
package jmeter.test.functions;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
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;
public class MyRandomFunc extends AbstractFunction {
// 自定義function的描述
private static final List<String> desc = new LinkedList<String>();
static {
desc.add("Get a random int within specified parameter value.");
}
// function名稱
private static final String KEY = "__MyRandomFunc";
private static final int MAX_PARA_COUNT = 1;
private static final int MIN_PARA_COUNT = 1;
// 傳入參數的值
private Object[] values;
private Random r = new Random();
@Override
public List<String> getArgumentDesc() {
return desc;
}
@Override
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
try {
int max = new Integer(((CompoundVariable) values[0]).execute().trim());
int val = r.nextInt(max);
return String.valueOf(val);
} catch (Exception ex) {
throw new InvalidVariableException(ex);
}
}
@Override
public String getReferenceKey() {
return KEY;
}
@Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
checkParameterCount(parameters, MIN_PARA_COUNT, MAX_PARA_COUNT); // 檢查參數的個數是否正確
values = parameters.toArray(); // 將值存入類變量中。
}
}
更多其他測試內容都在公衆號大話性能可以參考鏈接文末更多測試好文章