弱小的扩展性是压力测试工具 JMeter 的一个重要特点。尽管自身内置的函数、协定反对无限,然而 JMeter 提供了良好的扩大框架,容许使用者对其进行扩大。

本文将介绍如何利用 JMeter 的扩展性来实现自定义的函数,用户能够通过此形式扩大出性能测试过程中所须要的函数性能。

对于 JMeter 理解不多的读者,可参阅往期内容:开源测试工具 JMeter 介绍

JMeter 函数简介

因为 JMeter 函数绝对简略,本文便以它作为终点。

JMeter 函数(function)能够让用户在编辑测试脚本的时候插入到任何 Sampler 或者其余测试元素中,执行相应的工作。比方,__machineName 获得 JMeter Agent 所在机器的主机名,__machineIP 获得 JMeter Agent 所在机器的 IP 地址,__RandomString 失去一个随机的字符串。JMeter 所提供的内置函数残缺列表,请参考官网文档。

总体来说,扩大 JMeter 的函数能够分成上面几个步骤:

  1. 在 IDE (以下将以 Eclipse 为例)中新建 Maven 我的项目,引入扩大 JMeter 函数所需的依赖;
  2. 编写实现自定义函数的代码,并对其编译打包;
  3. 将编译好的包拷贝至 JMeter 的扩大目录,编辑测试脚本,在脚本中应用自定义的函数;
  4. 运行自定义的函数,查看运行后果是否正确。

接下来咱们将以一个返回随机偶数的自定义函数为例,来带大家理解残缺的开发过程。

创立扩大 JMeter 我的项目

本例中将应用 Maven 来治理依赖并进行打包。

在 Eclipse 中新建一个 Maven 我的项目:File > New > Project,抉择 Maven Project,如下图所示:

在向导的第 2 页里,抉择 Create a simple project (skip archetype selection),应用默认的 Workspace,或指定 Workspace 地位,并点击下一步:

在向导的第 3 页,指定 Group Id 和 Artifact Id。点击实现,实现我的项目的创立:

通过 Maven 引入相应的 JMeter 依赖

关上 pom.xml ,在 中退出 JMeter 的 ApacheJMeter_core 和 ApacheJMeter_functions 依赖,如下所示:

 <dependencies>    <dependency>        <groupId>org.apache.jmeter</groupId>        <artifactId>ApacheJMeter_core</artifactId>        <version>5.4.3</version>        <scope>provided</scope>    </dependency>    <dependency>        <groupId>org.apache.jmeter</groupId>        <artifactId>ApacheJMeter_functions</artifactId>        <version>5.4.3</version>        <scope>provided</scope>    </dependency> </dependencies>

因为 ApacheJMeter_core 和 ApacheJMeter_functions 曾经蕴含在 JMeter 的运行时中,所以前面编译打包进去的 jar 不须要蕴含它们,此处将这两个依赖的 scope 设为 provided。

保留 pom.xml 后,如果 Maven 没有开始主动下载相干的依赖文件,在我的项目上右键点击,抉择 Maven > Update Project,实现依赖的下载。

扩大 JMeter 函数

要实现扩大 JMeter 函数,有两处要点:

  1. 实现函数性能的类所在的 package 的申明必须蕴含".functions"
  2. 实现类继承 org.apache.jmeter.functions.AbstractFunction,并且编写相应办法的实现逻辑。

package 名字

JMeter 能够通过非 UI 形式运行,因为它的设计中让一些外围的类(非 UI 相干的,比方 ApacheJMeter_core 等)能够在非 UI 运行形式下被优先加载进来,加载这些类的时候是通过命名规定来实现的。所有实现 JMeter 函数的类必须蕴含".functions.",因而咱们自定义实现的类里也必须恪守这一规定,比方,类所在的 package 名称为"com.xmeter.customized.functions"。当然也能够通过更改 jmeter.properties 中的配置来实现扭转命名规定,如下图所示(但一般来说不举荐更改此项配置):

classfinder.functions.contain=.functions.

扩大 AbstractFunction 类

ApacheJMeter_core 中的 AbstractFunction 类提供了4个形象办法,在扩大的时候须要实现它们。

办法 1:

public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException;

JMeter 会将上次运行的 SampleResult 和以后的 Sampler 作为参数传入 execute 办法中,办法的返回值就是在运行该函数后应失去的值,返回类型为 String 类型。该办法如果操作了非线程平安的对象(比方文件),则须要对该办法进行线程同步爱护。

办法 2:

public List<String> getArgumentDesc();

getArgumentDesc 办法用于通知 JMeter 对于你实现的函数所需的参数的形容。

办法 3:

public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException;

setParameters 办法用于传递用户在执行过程中传入的函数所需的理论参数值。该办法在函数没有参数的状况下也会被调用。个别该办法传入的参数会被保留在实现类中的全局变量里,并在其后 JMeter 调用到 execute 办法时应用到。

办法 4:

public String getReferenceKey();

getReferenceKey 办法返回的就是此处自定义的函数的名字。JMeter 约定的命名规定是在函数名后面退出双下划线"__"。倡议函数的名字跟实现类的类名保持一致,而且 getReferenceKey 办法返回的名字以 static final 的形式在实现类中定义好,防止在运行的时候更改它。

源代码实现

实现的源代码如下所示,重要的代码曾经有正文。

package com.emqx.xmeter.demo.functions;import java.util.Collection;import java.util.LinkedList;import java.util.List;import java.util.Random;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;public class MyRandomFunc extends AbstractFunction {    //自定义function的形容    private static final List<String> desc = new LinkedList<String>();    static {        desc.add("Get a random int within specified parameter value.");    }    //function名称    private static final String KEY = "__MyRandomFunc";    private static final int MAX_PARA_COUNT = 1;    private static final int MIN_PARA_COUNT = 1;    //传入参数的值    private Object[] values;    private Random r = new Random();    @Override    public List<String> getArgumentDesc() {        return desc;    }    @Override    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {        try {            int max = new Integer(((CompoundVariable) values[0]).execute().trim());            int val = r.nextInt(max);            return String.valueOf(val);        } catch(Exception ex) {            throw new InvalidVariableException(ex);        }    }    @Override    public String getReferenceKey() {        return KEY;    }    @Override    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {         checkParameterCount(parameters, MIN_PARA_COUNT, MAX_PARA_COUNT); //查看参数的个数是否正确         values = parameters.toArray(); //将值存入类变量中    }}

编译并拷贝到 JMeter 扩大目录

接下来的一步就是要把实现类编译生成 jar 包并且拷贝到 JMeter 的扩大目录。编译打包局部可参考以下的 Maven :

<build>  <finalName>my-demo-plugins-${project.version}</finalName>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-compiler-plugin</artifactId>            <version>3.8.0</version>            <configuration>                <source>1.8</source>                <target>1.8</target>            </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><!-- 绑定到package阶段上 -->                    <goals>                        <goal>single</goal>                    </goals>                </execution>            </executions>        </plugin>    </plugins></build>

接下来在 Eclipse 中新增一个 Maven Build 的运行配置,请参见下图:

运行下面这个 Maven Build 之后,在工程的 target 目录下,会发现新生成了 my-demo-plugins-0.0.1-SNAPSHOT-jar-with-dependencies.jar。把这个jar 拷贝至 $JMETER_HOME/lib/ext 目录下($JMETER_HOME 指 JMeter 的装置目录),重新启动 JMeter。

点击工具 > 函数助手对话框,如果配置正确的话就能呈现本人定义的函数,如下图所示。点击右下角的"生成"按钮,会生成调用该函数后生成的示例后果。

测试自定义函数

最初咱们创立一个测试,来验证该 JMeter 函数工作是否失常,咱们将应用 Dummy Sampler 作为测试用的取样器。Dummy Sampler 是一个第三方扩大的取样器,提供根本的申请和响应模仿性能,在脚本调试或 JMeter 学习期间能够作为简略的模仿数据生成器来应用。Dummy Sampler 在 JMeter 社区中能够找到,咱们先介绍一下它的装置办法。

Dummy Sampler 能够通过 JMeter 插件管理器实现装置。

  1. 点击以下链接下载:https://jmeter-plugins.org/get/
  2. 将下载的 jmeter-plugins-manager-1.7 放到 $JMETER_HOME/lib/ext 目录下,并重启 JMeter。
  3. 如果装置胜利,重启 JMeter 后,菜单"选项"中将呈现"Plugins Manager":
  4. 关上"Plugins Manager"后,抉择"Available Plugins",在左侧的列表中搜寻并抉择"Dummy Sampler",而后点击"Apply Changes and Restart JMeter"按钮。如下图所示:
  5. JMeter的Plugins Manager 将下载相干文件,并且在装置实现后主动重启 JMeter。关上"Plugins Manager"后,将发现"Dummy Sampler"已呈现在"Installed Plugins"中。

接下来,咱们在测试脚本中应用 Dummy Sampler。先在线程组中增加 > 取样器 > [email protected] - Dummy Sampler:

能够进一步设置申请内容、连接时间、延迟时间、响应工夫、响应码、响应内容等模仿数据。在这次测试中,咱们将自定义函数生成的随机数设置为响应内容,参数设为 100,也就是指定生成小于 100 的偶数。

为不便查看测试后果,增加监听器,如"观察后果树"。而后运行测试,如果一切正常,在"响应数据"局部应该就能看到由该函数生成的随机整数了。

版权申明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/jmeter-extension-development-custom-functions