Metersphere 内置 JMeter 用于实现接口测试和性能测试,同时也支持 JMeter 内置函数和扩展函数的使用。以下示例展示扩展函数的实现以及其在 JMeter、MeterSphere 中如何使用。
1. 如何实现扩展函数
这里使用 Maven 做一个两数求和的扩展函数,其中实现过程简单描述如下:
引入项目所需依赖,目前 Metersphere 内置 JMeter 版本为 5.5,与其保持一致即可;
创建包含".functions."的包名;
实现类 AbstractFunction 的四个方法;
打包。
1.1 项目所需依赖文件 pom.xml
引入项目所需的依赖文件为 pom.xml ,详细内容参见如下:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jmeter.version>5.5</jmeter.version>
<java.version>17</java.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_functions</artifactId>
<version>${jmeter.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>${java.version}</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
</profiles>
1.2 创建包名需包含“.functions.”
JMeter 为了确保 GUI 和后端不会混淆,根据包名对类进行隔离,jmeter.properties 文件中,通过 “classfinder.functions.contain=.functions." 指定包名需包含“.functions.”,因为 Metersphere 内置了 JMeter,所以这里我们使用默认配置。
1.3 继承 AbstractFunction 并实现四个方法
实现类需要继承 AbstractFunction 方法,同时需要实现以下四个方法:
String execute(SampleResult sampleResult, Sampler currentSampler):
该方法用来实现扩展函数的功能。JMeter 传递之前的 sampleResult 和当前的 sampler 作为参数,将执行结果以字符串的形式返回。可根据需要对该方法做线程同步。
void setParameters(Collection<CompoundVariable> collection):
JMeter 调用此方法并传递函数调用中的值。变量作为 CompoundVariable 的集合传递。即使没有提供参数,也会调用此方法。在此方法中,可以设置和访问全局变量。
String getReferenceKey():
返回扩展函数名称,使用默认约定在名称前加两个下划线。
List<String> getArgumentDesc():
以列表形式返回参数描述,可在函数助手中查看具体信息。
其中代码示例如下:
package org.functions.demo;
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 Demo extends AbstractFunction {
//自定义函数的参数列表
private static final List<String> desc = new LinkedList<>();
//自定义函数的名称,使用默认的”__“开头
private static final String KEY = "__CustomSum";
static{
//使用add 添加参数,多个参数多次调用
desc.add("加数1");
desc.add("加数2");
}
private static final int MAX_PARAM_COUNT = 2;
private static final int MIN_PARAM_COUNT = 2;
//传入参数的值
private Object[] values;
/**
* @param sampleResult 上次运行的 sampleResult
* @param sampler 当前的 sampler
* @return String 自定义函数的返回值,以String类型返回
* @Description 实现自定义函数功能
*/
@Override
public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
//第一个整数
int param1 = Integer.parseInt(((CompoundVariable)this.values[0]).execute());
//第二个整数
int param2 =Integer.parseInt (((CompoundVariable)this.values[1]).execute());
return String.valueOf(param2+param1);
}
/*
* @Description 接受用户传入的参数
* @param collection 用户传入的参数
*/
@Override
public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
checkParameterCount(collection,MIN_PARAM_COUNT,MAX_PARAM_COUNT);
values= collection.toArray();
}
/*
* @Description 返回自定义函数名称
* @param
* @return String
*/
@Override
public String getReferenceKey() {
return KEY;
}
/*
* @Description 返回参数描述
* @param
* @return List<String>
*/
@Override
public List<String> getArgumentDesc() {
return desc;
}
}
2. 在 JMeter 中使用扩展函数
将打包生成的 ext-function-1.0-SNAPSHOT-jar-with-dependencies.jar 包,放入 JMeter 安装目录下的 【lib/ext】 下,重启 JMeter,打开【工具→函数助手】,可找到扩展函数 CustomSum,输入变量值,点击生成,可正常输出计算结果,用法参考内置函数。
3. 在 MeterSphere 中使用扩展函数
上传 jar 包,将 ext-function-1.0-SNAPSHOT.jar 包,上传至【项目设置->文件管理→添加文件】,上传成功后,打开用于接口测试。
在接口参数、Beanshell 脚本中使用扩展函数如下图所示: