Jmeter(三十二)Jmeter Question 之 “自定义函数开发”

  “技术是业务的支撑”,已经不是第一次听到这句话,因为有各种各样的需求,因此衍生了许多各种各样的技术。共勉!

  前面有提到提到过Jmeter的安装目录结构,也提到Jmeter的常用函数功能,有部分工作使用函数便可以完成,有满足,那肯定是有不满足的,本篇来记录函数的开发。

  先贴内置函数图,该jar包位于${jmeter_home}\lib\ext目录下,ApacheJMeter_functions.jar

  Jmeter(三十二)Jmeter Question 之 “自定义函数开发”

  有很多熟悉的名字。

  那么就挑一个典型的来反编译一下。Random.class。

  GUI界面显示内容:

  Jmeter(三十二)Jmeter Question 之 “自定义函数开发”

  前端实现Random函数,定义个三个参数。

  上源码: 

 //
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package org.apache.jmeter.functions; import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils; public class Random extends AbstractFunction {
private static final List<String> desc = new LinkedList();
private static final String KEY = "__Random";
private CompoundVariable varName;
private CompoundVariable minimum;
private CompoundVariable maximum; public Random() {
} public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
long min = Long.parseLong(this.minimum.execute().trim());
long max = Long.parseLong(this.maximum.execute().trim());
long rand = ThreadLocalRandom.current().nextLong(min, max + 1L);
String randString = Long.toString(rand);
if (this.varName != null) {
JMeterVariables vars = this.getVariables();
String varTrim = this.varName.execute().trim();
if (vars != null && varTrim.length() > 0) {
vars.put(varTrim, randString);
}
} return randString;
} public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
this.checkParameterCount(parameters, 2, 3);
Object[] values = parameters.toArray();
this.minimum = (CompoundVariable)values[0];
this.maximum = (CompoundVariable)values[1];
if (values.length > 2) {
this.varName = (CompoundVariable)values[2];
} else {
this.varName = null;
} } public String getReferenceKey() {
return "__Random";
} public List<String> getArgumentDesc() {
return desc;
} static {
desc.add(JMeterUtils.getResString("minimum_param"));
desc.add(JMeterUtils.getResString("maximum_param"));
desc.add(JMeterUtils.getResString("function_name_paropt"));
}
}

  观察这段代码、整体结构大致分为三个部分。

  定义、实现逻辑、返回定义。

  在编写实现函数代码的时候需要注意的几个细节:

    1、包名必须是以functions结尾。

    2、类继承AbstractFunction。

   OK,照猫画虎,编写其中的逻辑:

  

 String result = "";

         try {
int a = Integer.valueOf(str1).intValue();
int b = Integer.valueOf(str2).intValue();
int c = Integer.valueOf(str3).intValue();
result = String.valueOf(addInt(a, b, c));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} if ((localJMeterVariables != null) && (this.values.length > 0)) {
localJMeterVariables.put(str4, result);
} return result;
} private int addInt(int a, int b, int c) {
// TODO Auto-generated method stub
return a + b + c;
}

    三个正整数相加,返回和。

    打包,将jar包放入lib\ext目录下,启动Jmeter

    Jmeter(三十二)Jmeter Question 之 “自定义函数开发”

  调试一下。

  Jmeter(三十二)Jmeter Question 之 “自定义函数开发”

  Jmeter(三十二)Jmeter Question 之 “自定义函数开发”

  像外行一样去思考,像专家一样去实践。

                ----金出武雄

上一篇:开放api接口签名验证


下一篇:MSSQL获得表的字段名称及其参数