乐趣区

关于物联网:JMeter-扩展开发自定义-Java-Sampler

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,也就是每次“取样“的后果。办法实现的个别代码构造如下:

@Override
public 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

退出移动版