Jmeter做爲基於java開源的壓測工具,其擴展性是很便捷的。以前本身編寫實踐瞭如何擴展jmeter的function函數,你們能夠按照以下方法盡情的擴展本身想要實現的任何基礎函數。java
一、整體思路web
擴展JMeter的function能夠分紅下面幾個步驟:apache
一、在Eclipse中新建Maven項目,引入擴展JMeter function所需的依賴包;安全
二、編寫實現自定義function的代碼,並對其編譯打包;微信
三、將編譯好的包拷貝至JMeter的擴展目錄下;app
四、運行查看自定義的function是否正確;dom
二、新建項目ide
在Eclipse中新建一個Maven項目,File > New > Project,選擇Maven Project;而後引入擴展jmeter function的2個依賴包,我用的是jmeter3.3版本。以下圖。函數
三、編寫JMeter function代碼工具
要實現擴展JMeter function,主要有兩點:
一、 實現function的類的package聲明必須包含".functions"。
JMeter設計讓一些核心的類能夠在非UI的方式下運行的時候能被加載進來,這些類會被優先加載。加載這些類的時候是經過命名規則來實現的。全部實現function的類必需包含".functions",因此咱們自定義實現的類裏必須包含".functions",好比以下申明的包名爲:"jmeter.test.functions"。
二、須要繼承AbstractFunction,而且實現相應的方法。
AbstractFunction類提供了4個抽象方法,在擴展的時候須要實現他們。
一、public void setParameters(Collection<CompoundVariable> parameters)
throws InvalidVariableException
這個方法在用於傳遞用戶在執行過程中傳入的實際參數值。該方法在function沒有參數狀況下也會被調用。通常該方法傳入的參數會被保存在類內全局變量裏,並被後面調用的execute方法中使用到。
二、public String execute(SampleResult previousResult, Sampler currentSampler)
throws InvalidVariableException
JMeter會將上次運行的SampleResult和當前的Sampler做爲參數傳入到該方法裏,返回值就是在運行該function後獲得的值,以String類型返回。該方法若是操做了非線程安全的對象(好比文件),則須要將對該方法進行線程同步保護。
三、public String getReferenceKey()
這個就是function的名字。JMeter的命名規則是在方法名前面加入雙下劃線"__"。好比"__MyRandomFunc",function的名字跟實現該類的類名應該一致,並且該名字應該以static final的方式在實現類中定義好,避免在運行的時候更改它。
四、public List<String> getArgumentDesc()
最後在你的實現類中還須要提供一個方法來告訴JMeter關於你實現的function的描述。
四、測試function正確性
右擊項目選址export 》選擇jar file,以下打包成一個jar包。
把這個JAR拷貝至$JMETER__HOME/lib/ext目錄下,從新啓動JMeter。打開選項中的函數助手對話框,若是配置正確的話就能出現本身定義的function,以下所示。每次點擊右下角的生產按鈕,會生成調用該function隨機數字,每點擊一次,這個值就不同,可見編寫的函數是正確的。
五、完整的源碼
你們能夠參考以下的代碼,修改爲本身想要擴展的,從此就能夠爲所欲爲的編寫一些基礎功能的函數了。
若是須要完整的工程,可在微信公衆號大話性能發送: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(); // 將值存入類變量中。
}
}
更多其餘測試內容都在公衆號大話性能能夠參考連接文末更多測試好文章