「技術是業務的支撐」,已經不是第一次聽到這句話,由於有各類各樣的需求,所以衍生了許多各類各樣的技術。共勉!前端
前面有提到提到過Jmeter的安裝目錄結構,也提到Jmeter的經常使用函數功能,有部分工做使用函數即可以完成,有知足,那確定是有不知足的,本篇來記錄函數的開發。java
先貼內置函數圖,該jar包位於${jmeter_home}\lib\ext目錄下,ApacheJMeter_functions.jarapache
有不少熟悉的名字。dom
那麼就挑一個典型的來反編譯一下。Random.class。函數
GUI界面顯示內容:this
前端實現Random函數,定義個三個參數。spa
上源碼: 調試
1 // 2 // Source code recreated from a .class file by IntelliJ IDEA 3 // (powered by Fernflower decompiler) 4 // 5 6 package org.apache.jmeter.functions; 7 8 import java.util.Collection; 9 import java.util.LinkedList; 10 import java.util.List; 11 import java.util.concurrent.ThreadLocalRandom; 12 import org.apache.jmeter.engine.util.CompoundVariable; 13 import org.apache.jmeter.samplers.SampleResult; 14 import org.apache.jmeter.samplers.Sampler; 15 import org.apache.jmeter.threads.JMeterVariables; 16 import org.apache.jmeter.util.JMeterUtils; 17 18 public class Random extends AbstractFunction { 19 private static final List<String> desc = new LinkedList(); 20 private static final String KEY = "__Random"; 21 private CompoundVariable varName; 22 private CompoundVariable minimum; 23 private CompoundVariable maximum; 24 25 public Random() { 26 } 27 28 public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException { 29 long min = Long.parseLong(this.minimum.execute().trim()); 30 long max = Long.parseLong(this.maximum.execute().trim()); 31 long rand = ThreadLocalRandom.current().nextLong(min, max + 1L); 32 String randString = Long.toString(rand); 33 if (this.varName != null) { 34 JMeterVariables vars = this.getVariables(); 35 String varTrim = this.varName.execute().trim(); 36 if (vars != null && varTrim.length() > 0) { 37 vars.put(varTrim, randString); 38 } 39 } 40 41 return randString; 42 } 43 44 public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException { 45 this.checkParameterCount(parameters, 2, 3); 46 Object[] values = parameters.toArray(); 47 this.minimum = (CompoundVariable)values[0]; 48 this.maximum = (CompoundVariable)values[1]; 49 if (values.length > 2) { 50 this.varName = (CompoundVariable)values[2]; 51 } else { 52 this.varName = null; 53 } 54 55 } 56 57 public String getReferenceKey() { 58 return "__Random"; 59 } 60 61 public List<String> getArgumentDesc() { 62 return desc; 63 } 64 65 static { 66 desc.add(JMeterUtils.getResString("minimum_param")); 67 desc.add(JMeterUtils.getResString("maximum_param")); 68 desc.add(JMeterUtils.getResString("function_name_paropt")); 69 } 70 }
觀察這段代碼、總體結構大體分爲三個部分。code
定義、實現邏輯、返回定義。blog
在編寫實現函數代碼的時候須要注意的幾個細節:
一、包名必須是以functions結尾。
二、類繼承AbstractFunction。
OK,照貓畫虎,編寫其中的邏輯:
1 String result = ""; 2 3 try { 4 int a = Integer.valueOf(str1).intValue(); 5 int b = Integer.valueOf(str2).intValue(); 6 int c = Integer.valueOf(str3).intValue(); 7 result = String.valueOf(addInt(a, b, c)); 8 } catch (Exception e) { 9 // TODO Auto-generated catch block 10 e.printStackTrace(); 11 } 12 13 if ((localJMeterVariables != null) && (this.values.length > 0)) { 14 localJMeterVariables.put(str4, result); 15 } 16 17 return result; 18 } 19 20 private int addInt(int a, int b, int c) { 21 // TODO Auto-generated method stub 22 return a + b + c; 23 }
三個正整數相加,返回和。
打包,將jar包放入lib\ext目錄下,啓動Jmeter
調試一下。
像外行同樣去思考,像專家同樣去實踐。
----金出武雄