JMeter二次开发需求一般集中在2个方向:
针对请求类,即需要和服务器进行通信的,我们一般是做java请求的二次开发
针对数据处理类型,是不需要和服务器进行通信,是在客户端完成的,一般是做JMeter的自定义函数
除了用自定义函数,还可以通过beanshell去进行处理。但是一般不建议,因为beanshell脚本语言属于解释型语言,即每一次运行都需要临时编译一次,即编译一次运行一次,整体性能较差。 并且在JMeter中,beanshell的调试是非常糟糕的,提示信息较少;Beanshell的解析执行顺序,会导致无法读取其他函数的值。
怎么做自定义函数
JMeter提供了一个abstractFunction的类用于用户去继承、实现自定义函数。
准备工作
准备自定义函数开发过程所需要的依赖jar包。通常分为两种:
JMeter框架lib\ext目录下的ApacheJMeter_core.jar和ApacheJMeter_functions.jar
业务相关,指数据处理本身的逻辑和JMeter是没有任何关系的情况。
业务本身的jar包
业务依赖的jar包
实操
创建一个Java project后,选中工程右键Build Path ->Configure Build Path...->Libraries
通过Add External JARs添加ApacheJMeter_core.jar
创建一个Java Package,命名为XX.XX.functions
在Package中创建一个继承AbstractFunction的Java Class
需要复写4个方法
getArgumentDesc() //用来定义函数的参数列表,是给用户看的
execute() //函数的主题部分,即函数的结果由该方法返回
getReferenceKey() //用来定义函数的名称
在JMeter中,约定俗成要求函数的名称必须是以"__"开头,因此通常该方法返回以下定义的字符串:
private final static String key = "__hello";
setParameters() //用来接收和处理用户调用函数时所传入的参数值
导出jar包。 选中类文件,右键Export导出为Java JAR file
将jar包复制到lib\ext目录后,重新启动JMeter
传值
private final static String key = "__hello";
private static List<String> params = new LinkedList<String>();
static
{
params.add("请输入用户名");
params.add("请输入性别:男or女");
}
public String username = "";
public String sex = "";
@Override
public List<String> getArgumentDesc(){
return params;
}
@Override
public String execute(SampleResult arg0, Sampler arg1) throws InvalidVariable...{
String result = "";
if(sex.equals("男")){
result = username + ",先生你好。";
}
else if(sex.equals("女")){
result = username + ",女士你好。";
}
else{
result = "无名氏你好,请问你是男是女?";
}
return result;
}
@Override
public String getReferenceKey(){
return key;
}
@Override
public void setParameters(Collection<CompoundVariable> arg0) throws Inval...{
checkParameterCount(arg0, 2);
Object[] data = arg0.toArray();
username = ((CompoundVariable)data[0]).execute();
set = ((CompoundVariable)data[1]).execute();
}
业务包
自定义function依赖的业务包放在JMeter的lib目录下