Jmeter是一款开源的性能测试工具,目前是行业内使用率最高的性能测试工具之一,Jmeter是使用JAVA语言开发的,本文介绍如何使用JAVA语言开发自己需要的扩展函数
目前业界流行的两种开发模式,本文介绍第二种
1、使用Jmeter二次开源环境,直接在org.apache.jmeter.functions包下面开发自己需要的函数,然后导出该jar包,替换Jmeter目录的ApacheJMeter_functions.jar文件
2、直接在Maven 项目下开发自定义函数,然后打包,该方法、简单、高效
开发思路
1、使用Eclipse创建Maven 项目,配置Pom文件,引入扩展function所需的依赖包;
2、创建类,然后继承AbstractFunction,实现四个主方法;
3、对编写好的项目进行编译、打包
4、把打包好的函数放到jmeter扩展目录,调用自定义函数,检查是否正确;
一、新建Maven项目
1.File》New》Project,选择Maven》Maven Project,一直点击Next,此处Package包名一定要以.functions格式结束,否则开发出来的函数,Jmeter读取不到

2.配置Pom文件,Pom文件配置的Jmeter4.0版本,只要保存了Pom文件,系统就会自动下载和关联相应的jar包,Pom配置文件如下:
3.保存Pom文件之后,系统会自动下载关联的依赖文件,如下图:

4.此时,由于对pom文件进行了修改,项目顶层会出现一把×,并且编译可能就会报错,需要执行Maven》Update Project更新外部依赖的Jar包



JMeter设计让一些核心的类可以在非UI的方式下运行的时候能被加载进来,这些类会被优先加载。加载这些类的时候是通过命名规则来实现的。所有实现function的类必需包含".functions",所以我们自定义实现的类里必须包含".functions",比如如下申明的包名为:"jmeter.test.functions"

首先在Jmeter.test.functions包下创建一个类,类名称为Save_Variable,需要继承AbstractFunction类,然后实现父类的四个方法
本次开发的函数实现的效果为通过传两个变量,一个是变量名,一个是变量,自动在执行脚本路径的上一个层级实现自动创建一个txt文档保存变量,已经有该文件则追加,测试过程中有时候需要对获取的变量及时保存,如果大批量就可以使用该方法
private static final List<String> desc = new LinkedList<String>(); /*该变量用来获取对参数值输入进行描述*/
private static final String KEY = "__Save_Variable"; /这个是在函数助手上显示的函数名称/
static {
desc.add("请输入要保存变量的文件名建议直接用变量名");
desc.add("请输入要保存的变量 格式如${name}");
/该描述是针对函数的输入值进行描述/
}
***
- 这里主要是定义变量desc、KEY 然后将描述显示到函数的参数描述中,如下图

***
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
/该函数用来获取输入的值/
/这里,后面的1,2是指调用函数助手时,可以接受的参数个数,低于1就不会执行/
checkParameterCount(parameters, 1, 2);
values = parameters.toArray();
/将值存入类变量中,把接受到的参数装成array,然后用value[i]取出来 /
}
- 该函数作用就是获取函数输入框界面输入的值,将输入的值传递给execute
***
@Override
public String getReferenceKey() {
/本方法是提供一个在Jmeter函数助手显示的函数名称/
return KEY;
}
- 该函数是提供一个在Jmeter函数助手显示的函数名称
***
public List<String> getArgumentDesc() {
/该函数用来获取对输入参数的描述/
return desc;
}
- 该函数用来获取对输入参数的描述
***
@Override
public String execute(SampleResult previousResult, Sampler currentSampler)
throws InvalidVariableException {
/该函数为执行函数,获取参数然后用来处理/
String filename = ((CompoundVariable) values[0]).execute(); /定义变量获取第一个输入框的值/
String variable = ((CompoundVariable) values[1]).execute(); /定义变量获取第二个输入框的值/
String script_path = FileServer.getFileServer().getBaseDir(); /*获取jmeter执行的脚本所在的路径*/
if(script_path.contains("script")==true&&variable.contains("$")==false) { //做一个判断,如果执行
System.out.println("该脚本执行路径为规范路径(script路径下),变量保存在data目录下");
script_path = script_path.replace("script", ""); //由于获取的脚本路径为script路径,所以需要替换成空值
script_path = script_path+"data\\"+filename+".txt"; //拼接变量文件的保存路径
System.out.println("测试文件保存路径_"+script_path);
BufferedWriter out = null;try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(script_path, true)));
out.write(variable+"\r\n");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
else if(script_path.contains("script")==false&&variable.contains("$")==false) {
System.out.println("该脚本执行路径不为规范路径,变量直接保存在执行脚本同路径下");
script_path = script_path+"\\"+filename+".txt"; //拼接变量文件的保存路径
System.out.println("测试文件保存路径_"+script_path);
BufferedWriter out = null;try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(script_path, true)));
out.write(variable+"\r\n");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
- 该函数用来实现获取输入的参数,并且进行最后执行,主要实现的功能就是保存jmeter中传入的变量
***
**三、编译、打包**




四、验证开发的函数是否正常







-----
如果对您有帮助,记得点个赞
原文:https://blog.51cto.com/6183574/2390616