文章內容轉載於:http://lib.csdn.net/article/softwaretest/25700,並且加上個人一些截圖
本篇將開啟為JMeter開發插件之旅,我們選擇以Function(函數)組件作為插件開發的入手對象,在前面的章節我們將其划分為非GUI組件,選擇它的理由不僅僅是因為Function插件在開發方面是極簡的,而且在實際運用JMeter執行測試時,對於Function組件的應用會極大的為你的測試帶來便利,有些甚至是必不可少的。
什么是Function組件?
我們還是有必要對Function組件的功能進行一下簡單的回顧:
通過打開函數助手,我們可以通過下拉菜單,查看JMeter為我們默認提供的一系列實用的函數功能,使用函數非常簡單,比如”__UUID”函數,功能是生成一個uuid,在后面的輸入框中只需輸入”${__UUID}”便可以引入調用該函數方法所返回的uuid值,所有的組件都可以對函數組件進行引入。
插件開發方法有兩種!
第一種:直接在jmeter官網下載 jmeter開源包,在源碼里面新加函數,然后導出jar!
第二種:不需要下載源碼,直接導入jmeter相應的jar包,即可立即開發!看官方文檔,也是推薦使用第二種方法,下面都是以第二種方法為例。
一個用於測試的Sampler插件
在此處我們首先可以開發一個專門用於測試函數或自定義變量輸出的Sampler(原來它才是我們所開發的第一個插件),我們叫它TestSampler,開發方式是分離法,分為邏輯控制部分TestSampler和GUI部分TestSamplerGUI:
1、首先創建Java工程,File>New>Project,選擇未maven工程,next>命名為TestSampler>next
2、先在Java工程中引入主要的JMeter插件開發jar包,如何引入jar包可參考IntelliJ IDEA java項目導入jar包,打jar包:http://www.cnblogs.com/yulia/p/6824058.html:
對應包可以取jmeter安裝目錄:apache-jmeter-2.13\lib\ext
3. TestSampler類代碼參考如下:
public class TestSampler extends AbstractSampler { public final static String FUNCTION = "function"; @Override public SampleResult sample(Entry entry) { // TODO Auto-generated method stub SampleResult res = new SampleResult(); res.sampleStart(); System.out.println(this.getProperty(FUNCTION));//輸出GUI界面所輸入的函數方法返回結果 res.sampleEnd(); res.setSuccessful(true); return res; } }

我們在之前的章節簡單介紹了Sampler的主要實現方法,通過重寫sample方法,實現執行一次抽樣方法,我們在此處輸出”function”屬性所對應的值,即輸出GUI界面所引入的函數方法返回結果。
4. TestSamplerGUI類代碼參考如下:
public class TestSamplerGUI extends AbstractSamplerGui{ private JTextField functionTextField = null; public TestSamplerGUI(){ init(); } @Override public void configure(TestElement element) { super.configure(element); functionTextField.setText(element.getPropertyAsString(TestSampler.FUNCTION)); } private void init() { JPanel mainPanel = new JPanel(new GridBagLayout()); functionTextField = new JTextField(20); mainPanel.add(functionTextField); add(mainPanel); } @Override public TestElement createTestElement() {//創建所對應的Sampler // TODO Auto-generated method stub TestElement sampler = new TestSampler(); modifyTestElement(sampler); return sampler; } @Override public String getLabelResource() { // TODO Auto-generated method stub return this.getClass().getSimpleName(); } @Override public void modifyTestElement(TestElement sampler) { // TODO Auto-generated method stub super.configureTestElement(sampler); if (sampler instanceof TestSampler) { TestSampler testSmpler = (TestSampler) sampler; testSmpler.setProperty(TestSampler.FUNCTION, functionTextField.getText()); } } @Override public String getStaticLabel() {//設置顯示名稱 // TODO Auto-generated method stub return "TestSampler"; } private void initFields(){ functionTextField.setText(""); } @Override public void clearGui() { super.clearGui(); initFields(); } }
我們主要的目的是通過modifyTestElement方法將functionTextField輸入框中所輸入的值賦給TestSampler對象的function屬性。
5、通過上面的簡單代碼完成了測試用的Sampler,把java工程打包為jar包,如何打包可參考IntelliJ IDEA java項目導入jar包,打jar包:http://www.cnblogs.com/yulia/p/6824058.html
6、把上一個步驟打的包插入JMeter框架,即把TestSampler.jar放到jmeter包路徑下,例D:\apache-jmeter-2.13\lib\ext下
7、若jmeter在上一個步驟時打開,重啟jmeter,在測試計划下add directory or .jar to classpath把TestSampler.jar配置后,在jmeter操作,線程組>添加>Sampler,看到該TestSampler出現在Sampler列表中:
在線程組下添加該Sampler,並輸入被測試函數,運行該測試計划,可以看到控制台輸出:
OK,和我們的意圖一致,輸出了__UUID函數運行后所返回的結果。
有了測試用的Sampler后,就可以開發擁有自己功能的Function插件了。
Function插件開發案例
1、重新創建工程,工程名為Factorial。現在可以寫一個計算階乘的Function,將其命名為Factorial,主要代碼參考如下(打包在如*.jmeter.functions下):
import java.util.Collection; import java.util.LinkedList; import java.util.List; 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 org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; public class Factorial extends AbstractFunction { private static final Logger log = LoggingManager.getLoggerForClass(); private static final List<String> desc = new LinkedList<String>(); private static final String KEY = "__factorial"; private Object[] values = null; static { desc.add("factorial_value"); } //描述參數 @Override public List<String> getArgumentDesc() { // TODO Auto-generated method stub return desc; } //函數執行,返回結果 @Override public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException { // TODO Auto-generated method stub String numberString = ((CompoundVariable) values[0]).execute().trim(); int num; try{ num = Integer.valueOf(numberString); } catch (Exception e){ return null; } return String.valueOf(factorial(num)); } //獲取函數引用關鍵字 @Override public String getReferenceKey() { // TODO Auto-generated method stub return KEY; } //設置參數 @Override public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException { // TODO Auto-generated method stub //可以檢查參數數量,主要包括以下兩種方法 checkMinParameterCount(parameters, 1); checkParameterCount(parameters, 1, 1); values = parameters.toArray(); } private int factorial(int num){ int result = 1; if(num < 0){ return -1; } if(num == 0){ result = 1; } else { for(int i = num; i > 0; i--){ result *= i; } } return result; } }
通過繼承AbstractFunction抽象類,重寫getArgumentDesc方法實現對函數參數的描述,重寫setParameters方法來對函數的參數進行檢查和設置,重寫getReferenceKey方法告訴JMeter該函數在框架中的引用名稱,重寫execute方法,實現對該函數的執行並返回結果。通過上述代碼我們完成了對Factorial函數組件的編寫。
2、這里寫的簡潔了,如果覺得復雜,可再參考TestSampler類似步驟(5、6、7),將插件打包插入JMeter框架,可以在函數助手中查看到該函數組件內容如下:
框架已經引入了我們所開發的函數組件,我們根據參數設置計算10的階乘,設置如下:
通過TestSampler對其進行測試,測試結果如下:
控制台輸出了10的階乘返回結果。就此,便通過此章節基本掌握了Function(函數)插件式組件的主要開發過程。