JMeter 内置反对了一系列的罕用协定,例如 HTTP/HTTPS、FTP、JDBC、JMS、SOAP 和 TCP 等,能够间接通过编写脚本来反对相干协定的测试场景。除了这些协定之外,用户也可能须要进行一些其余标准协议的测试,或者某些状况下在标准协议根底上减少了定制化的内容,须要对定制后的协定进行测试。本文中介绍的 Java Sampler 扩大机制就是 JMeter 提供的一种能够轻松实现对新协定反对的形式。

Java Sampler 简介

JMeter 中有一类重要的组件 Sampler,即“取样器”。取样器中蕴含了后面提到的一系列协定,能够认为“取样器”这个类别中的组件,是对相应协定的实现。不过 Java Sampler 的意思并不是指反对所谓的 Java 协定,也不能简略地说成 Java 取样器,比拟精确的意思是利用自定义的 Java 类来扩大对新协定的反对,这些扩大的新协定都是通过“Java申请“退出到测试脚本中的。

上面两张图的步骤展现了如何增加 Java 申请,以及如何抉择不同的 Java Sampler。

接下来咱们将以 MQTT 协定中的连贯为例,介绍应用 Java Sampler 来进行扩大开发的具体步骤。

筹备开发环境

在开发 JMeter插件的时候,大部分状况不须要把 JMeter 的源代码下载,只须要对相干的 JMeter 库进行援用就能够了。请参见文章 JMeter 扩大开发:自定义函数 来筹备开发环境。须要留神的是,在本文的示例中,除了援用 ApacheJMeter_core 之外,还须要引入 ApacheJMeter_core ,以及反对 MQTT 协定的 Java 类库,在此例中应用的是开源的 Eclipse Paho Java MQTT client 库。其余的 MQTT Java 类库当然也能够,取决于被扩大的协定和协定扩大者的偏好。

pom.xml 中所需的依赖局部如下:

<dependencies>  <dependency>    <groupId>org.eclipse.paho</groupId>    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>    <version>1.2.5</version>  </dependency>  <dependency>    <groupId>org.apache.jmeter</groupId>    <artifactId>ApacheJMeter_java</artifactId>    <version>5.4.3</version>    <scope>provided</scope>  </dependency>  <dependency>    <groupId>org.eclipse.paho</groupId>    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>    <version>1.2.5</version>  </dependency><dependencies>

开发 Java Sampler

开发一个本人的 Java Sampler 包含上面几步:

  1. 继承 JMeter 抽象类 org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient
  2. 实现上面4个办法:

办法1:

SampleResult runTest(JavaSamplerContext context)

runTest 办法定义在接口 JavaSamplerClient 中,扩大协定的主体逻辑就是在这个办法中进行编码实现,是必须要实现的办法。

办法2:

public Arguments getDefaultParameters()

与申请一起发送的默认参数定义在 getDefaultParameters 办法中,这些参数的名称和值将呈现在 JMeter Java 申请对应的界面中。这个办法不是必须要实现的,应用 Java 申请的时候,如果没有默认的参数,也能够通过手动增加参数的办法退出。

办法3:

void setupTest(JavaSamplerContext context)

办法4:

void teardownTest(JavaSamplerContext context)

setupTestteardownTest 顾名思义,就是在 Java 申请开始时候进行的初始化工作,以及完结时候进行的开头工作。这两个办法也不是必须要实现的。

runTest 办法

先重点介绍 runTest 办法。 runTest 办法的返回后果为 SampleResult,也就是每次“取样“的后果。办法实现的个别代码构造如下:

@Overridepublic SampleResult runTest(JavaSamplerContext context) {  SampleResult result = new SampleResult();  result.sampleStart();  try{     //以下局部实现具体的解决逻辑    //...    //具体业务逻辑完结    //发出请求    result.sampleEnd();    //申请胜利,设置测试后果为胜利    result.setSuccessful(true);    result.setResponseData("data...".getBytes());    result.setResponseMessage("message...");    result.setResponseCodeOK();  } catch(Exception e) {    //申请失败,设置测试后果为失败    result.sampleEnd();    result.setSuccessful(false);    result.setResponseCode("500");  }  return result;}

如上所示,代码逻辑次要是:

1)对指标零碎必送正确的协定数据。

2)依据指标零碎返回的数据,给 SampleResult 设置正确的办法、完结工夫等,这样 JMeter 引擎可获知测试胜利与否,进一步地能够正确显示到 JMeter 的报告后果中。

进行一般 MQTT TCP 连贯,业务逻辑局部的实现能够参考上面的代码:

//MQTT Broker 的连贯信息String broker = "tcp://broker.emqx.io:1883";String username = "emqx";String password = "public";String clientid = "publish_client";MqttClient client = new MqttClient(broker, clientid, new MemoryPersistence());MqttConnectOptions options = new MqttConnectOptions();options.setUserName(username);options.setPassword(password.toCharArray());client.connect(options);

getDefaultParameters 办法

上述代码中咱们硬编码了 MQTT Broker 的连贯信息,但在理论利用场景中,更心愿能应用一个 JMeter 插件,连贯不同的 MQTT Broker。这种状况下,就能够将连贯信息从 JavaSamplerContext 的参数中读取进去:

String broker = context.getParameter("broker");String username = context.getParameter("user");String password = context.getParameter("password");String clientid = context.getParameter("clientid");

参数具体值的输出由脚本编写人员在 JMeter 界面上编辑脚本时指定,或者在运行期间应用指定变量的值。而为了不便脚本编写人员理解并更改所需的参数,咱们通过 getDefaultParameters 办法将这些参数在界面上裸露进去:

public Arguments getDefaultParameters() {  Arguments arguments = new Arguments();  arguments.addArgument("broker", "tcp://broker.emqx.io:1883");  arguments.addArgument("user", "emqx");  arguments.addArgument("password", "public");  arguments.addArgument("clientid", "publish_client");  return arguments;}

setupTest 办法

跟写 JUnit 测试的 setup 办法相似,这里次要运行针对单个虚构用户的一次性起始、筹备性的操作。

teardownTest 办法

与 JUnit 测试的 teardown 办法相似,这里次要运行针对单个虚构用户的收尾的操作。须要留神的是,该办法的调用不是在单个虚构用户的线程里,而是所有虚构用户都在一个线程里程序执行该办法。

编译、部署与应用

实现了代码的编写,须要将代码进行编译和部署。pom.xml 的 build 设置及编译具体方法也可参见此前的文章 JMeter 扩大开发:自定义函数。

编译实现后,在 target 目录下会生成一个 jar 包。请留神通过示例的 pom.xml,编译进去的 jar 包里蕴含了所需的第三方类库,如 org.eclipse.paho.client.mqtt 库,防止 JMeter 运行时找不到第三方提供的类的问题。

将编译好的 jar 拷贝到 $JMETER_HOME/lib/ext 目录下,重启 JMeter。启动结束,增加一个 Java 申请,在类名称下拉列表框中应该就能看到新扩大的类了。如果不存在,请查看一下 lib/ext 目录下是否正确拷贝了 jar 包,也能够查一下 JMeter 的日志,确认没有报出异样。

至此,咱们实现了通过 JMeter 提供的扩大机制来反对新协定的测试。能够看到 JMeter 对新协定的定制扩大还是比较简单的。不过通过 Java Sampler 形式扩大的协定在界面敌对性上与 JMeter 提供的标准协议相比还是较差,咱们将在本系列专题的后续文章中介绍如何应用 JMeter 更弱小的扩大形式,敬请期待。

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

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