Jmeter(三十二)Jmeter Question 之 「自定義函數開發」

 

 

  「技術是業務的支撐」,已經不是第一次聽到這句話,由於有各類各樣的需求,所以衍生了許多各類各樣的技術。共勉!前端

  前面有提到提到過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

    

  調試一下。

  

  

 

  像外行同樣去思考,像專家同樣去實踐。

                ----金出武雄

相關文章
相關標籤/搜索