基于 MeterSphere 的扩展函数实现以及使用


朱飞鸽
飞致云 发布于 2023-12-06 / 306 阅读 / 0 评论 /
Metersphere 内置 JMeter 用于实现接口测试和性能测试,同时也支持 JMeter 内置函数和扩展函数的使用。以下示例展示扩展函数的实现以及其在 JMeter、MeterSphere 中如何使用。 1. 如何实现扩展函数 这里使用 Maven 做一个两数求和的扩展函数,其中实现过程简单

Metersphere 内置 JMeter 用于实现接口测试和性能测试,同时也支持 JMeter 内置函数和扩展函数的使用。以下示例展示扩展函数的实现以及其在 JMeter、MeterSphere 中如何使用。

1. 如何实现扩展函数

这里使用 Maven 做一个两数求和的扩展函数,其中实现过程简单描述如下:

  1. 引入项目所需依赖,目前 Metersphere 内置 JMeter 版本为 5.5,与其保持一致即可;

  2. 创建包含".functions."的包名;

  3. 实现类 AbstractFunction 的四个方法;

  4. 打包。

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 脚本中使用扩展函数如下图所示:



是否对你有帮助?