引言
jmeter本身的函数助手,已经满足大多数使用场景了,但是某些特殊的场景还是无法满足,比如报文加解密转换、生成特定算法的key等等等等,与你的业务强关联的功能,这些场景无法用jmeter的原生函数满足,那就需要单独开发自定义函数实现这些特定功能。
当然,实现这些功能的方式不止函数一种,还可以用beanshell、groove等,也可以自己开发一个mock服务通过http方式实现,本文仅使用jmeter工具,深入理解jmeter的高扩展性特性、以及其对java的高兼容特性。
本文使用以Jmeter工具函数助手的源码为示例,基于源码,使用java代码进行二次开发,仅需一次开发,后续所有项目都可直接通过函数助手使用。
1.目标功能
2.准备工作
1、环境:Java1.8、Maven 3.以上x、jmeter 5.x以上。
2、开发工具:Windows IDEA。
本人的环境如下图:

函数助手的jmeter核心依赖包有3个,如下:
ApacheJMeter_core
ApacheJMeter_java
ApacehJMeter_functions这3个依赖包在jmeter的lib/ext目录下,如果你的网络环境是内网无法访问Maven官网下载依赖包,那么可通过idea手动引入这3个包。

3.新建项目并配置依赖
3.1.IDEA新增项目
如下图

创建好以后如下

点击pom.xml,新增版本配置和jmeter依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jmeter-version>5.6.3</jmeter-version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>${jmeter-version}</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>${jmeter-version}</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>${jmeter-version}</version>
</dependency>
</dependencies>
3.2.引入依赖
点击刷新按钮,加载依赖包

等待加载完成

4.代码实现
我们需要重写以下4个方法,
package org.example.functions;
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 java.util.Collection;
import java.util.List;
public class JmeterFunctions extends AbstractFunction {
@Override
public String execute(SampleResult sampleResult,Sampler sampler) throws InvalidVariableException {
return null;
}
@Override
public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
}
@Override
public String getReferenceKey() {
return null;
}
@Override
public List<String> getArgumentDesc() {
return null;
}
}
具体代码如下:
package org.example.functions;
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.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class JmeterFunctions extends AbstractFunction {
//自定义函数名称,也就是函数助手下显示的函数名称
private static final String KEY = "__contactStrings";
//自定义输入参数列表及参数说明
private static List<String> desc = new LinkedList<String>();
static {
//${__contactStrings(,,,)} 需要输入4个参数,第一个是原始字符串,第二是位数,第三是补位字符串,第四是左边或者右边
desc.add("Please input source Strings");//第一个参数描述:原始字符串
desc.add("Please input digit");//第2个参数描述:位数
desc.add("Please input addStrings");//第3个参数描述:补位字符串,需要用什么字符串来补位
desc.add("Please input direction");//第4个参数描述:左补还是右补,只有left和right两个值
}
//使用数组保存输入的所有参数
private Object[] inputValues;
//保存获取到的每个参数的值
String parameter1,parameter3,parameter4,response;
int parameter2;//位数是int类型
@Override
public String execute(SampleResult sampleResult,Sampler sampler) throws InvalidVariableException {
parameter1 = ((CompoundVariable) inputValues[0]).execute().trim();//分别拿到每个参数,进行处理
parameter2 = Integer.parseInt(((CompoundVariable) inputValues[1]).execute().trim());
parameter3 = ((CompoundVariable) inputValues[2]).execute().trim();
parameter4 = ((CompoundVariable) inputValues[3]).execute().trim();
if (parameter4.equals("left")){
response = StringUtils.leftPad(parameter1,parameter2,parameter3);
}else if (parameter4.equals("right")){
response = StringUtils.rightPad(parameter1,parameter2,parameter3);
}else {
response = "Input error!";
}
return response;
}
@Override
public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
checkParameterCount(collection,4);//检查参数数量
inputValues = collection.toArray();//将输入的变量存入数组
}
/**返回函数名称**/
@Override
public String getReferenceKey() {
return "__contactStrings";
}
/**函数功能描述**/
@Override
public List<String> getArgumentDesc() {
return desc;
}
}
5.打包部署



将编译打包生成的Jar包放置jmeter的lib/ext目录下,并且重启jmeter

6.成果检验
重启jmeter后,打开函数助手,找到我们自定义的函数

填入参数,验证函数是否正确

