JMeter中函数二次开发?思路是什么?
1、JMeter提供了接口给用户进行二次开发,其中接口可通过引入ApacheJMeter_components.jar、ApacheJMeter_core.jar两个包获取。(或许你看到别人介绍所要用的jar包会更多,其实正常开发就这两个,所以至少保证有这两个包即可)
2、开发的代码需要符合JMeter的规范:第一,新建的包名称必须是以 functions 结尾;第二,方法类需要继承AbstractFunction类,而AbstractFunction类中有四个要实现的函数,其中我们要实现的功能需要结合这四个函数实现。
接下来我们就开始吧 ~
环境准备
第一、添加依赖包:
两个jar包在JMeter安装目录下的\lib\ext 文件夹,在工程里新建一个lib目录,把jar包放进去,然后添加到项目工程里(
IDEA中给项目添加依赖的jar包-CSDN博客
):
-
ApacheJMeter_components.jar
-
ApacheJMeter_core.jar
第二,创建的包以functions结尾,同时创建的类继承AbstractFunction类,当我们继承时,发现会报错,根据提示,导入方法:
AbstractFunction类四个方法的简单介绍
函数概要说明:
package com.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 test 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 com.functions;
import com.IdNumTool;
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.LinkedList;
import java.util.List;
public class CardToolFunctions extends AbstractFunction {
public String card_code = "";
public String card_birthday = "";
public String card_sex = "";
//定义函数参数列表
@Override
public List<String> getArgumentDesc() {
List<String> parms = new LinkedList<String>();
parms.add("请输入地区码(示例:430922)");
parms.add("请输入生日(格式:xxxx-xx-xx)");
parms.add("请输入性别(男:1,女:2)");
return parms;
}
//用来接收、处理用户调用函数时所传入的参数值
@Override
public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
//collection为getArgumentDesc函数接收到的用户输入的值
//检查用户输入的参数值是否等于3个
checkParameterCount(collection,3);
//把Collection<CompoundVariable>转换为数组,固定写法
Object[] parmsData = collection.toArray();
//把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
card_code = ((CompoundVariable)parmsData[0]).execute();
card_birthday = ((CompoundVariable)parmsData[1]).execute();
card_sex = ((CompoundVariable)parmsData[2]).execute();
}
//函数的执行主体,执行具体的业务逻辑、功能
@Override
public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
//初始化idNumTool类
IdNumTool idNumTool = new IdNumTool();
String idcard = idNumTool.getidcard(card_code,card_birthday,card_sex);
return idcard; //把身份号返回给用户
}
//要调用的函数名称
@Override
public String getReferenceKey() {
String key = "__idCard";
return key ;
}
}
四个每个函数
getReferenceKey函数
比较简单,就是定义函数的名称,主要注意的是需要是两个下划线开头,这是JMmter规范要求的。
public String getReferenceKey() {
String key = "__idCard";
return key ;
}
getArgumentDesc函数
参数描述
public List<String> getArgumentDesc() {
List<String> parms = new LinkedList<String>();
parms.add("请输入地区码(示例:430922)");
parms.add("请输入生日(格式:xxxx-xx-xx)");
parms.add("请输入性别(男:1,女:2)");
return parms;
}
setParameters
把用户输入的参数值进行处理
public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
//collection为getArgumentDesc函数接收到的用户输入的值
//检查用户输入的参数值是否等于3个
checkParameterCount(collection,3);
//把Collection<CompoundVariable>转换为数组,固定写法
Object[] parmsData = collection.toArray();
//把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
card_code = ((CompoundVariable)parmsData[0]).execute();
card_birthday = ((CompoundVariable)parmsData[1]).execute();
card_sex = ((CompoundVariable)parmsData[2]).execute();
}
execute方法
具体的逻辑实现,结果通过return返回,这里具体实现通过IdNumTool类实现,这已经封装好了,这里只是调用即可;
public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
//初始化idNumTool类
IdNumTool idNumTool = new IdNumTool();
String idcard = idNumTool.getidcard(card_code,card_birthday,card_sex);
return idcard;
}
导出jar包
代码编写完成之后,导出jar包,方法JMeter的lib\ext目录下,然后重启JMeter就可以啦~
导出jar的方法之前有写过,具体见:
IDEA导出jar包到JMeter-CSDN博客
结果展示:
结语
学习参考(不熟悉的话推荐看下):
Jmeter二次开发之自定义函数详解_哔哩哔哩_bilibili
对Java以及JMeter底层运行不熟悉的人来说,没人指导这东西不是很好理解,比如我自己,上方的B站链接就挺好的,看一半,基本就清楚怎么搞了~
后续
后续也在学习过程中添加了小功能,不太敏感,想想自己学习的曲折过程。。。,这里共享给大家吧,附代码跟jar包,都在网盘里了 ~
百度网盘
提取码:t2n4
gitee:
https://gitee.com/kevin0502/tools.git
这么走心的博主,此处应该值得一个赞吧?
功能函数1:JMeter中读取yaml文件
使用场景:读取配置文件的数据进行接口测试
yaml文件位置及支持格式:
默认取值路径:自己新建的一个文件夹,用于放自己的测试文件
功能函数2:生成指定个数的汉字
第一个是百家姓喔,所以做姓名也比合适