JMeter自定义协议扩展之Java Sampler
本文版权归xmeter.net所有。欢迎转载,转载请注明出处。原文请参见这里。
摘要
在利用JMeter实施性能测试的时候,除了下列JMeter支持的标准协议之外(HTTP/HTTPS,FTP,JDBC,JMS,SOAP和TCP等),可能需要支持一些别的协议,本文介绍了如何利用JMeter提供的Java Sampler扩展机制来方便地扩展对新协议的支持。除了本文介绍的Java Sampler扩展方式之外,更加标准的方式是扩展标准的Sampler,读者可以参见xmeter君写的这篇文章来了解如何扩展Kafka协议的支持。
简介
JMeter跟商业化的软件相比,有些表达方式比较拗口、难以理解,比如我们这篇文章里的主角“Java Sampler”。如果只是看文字的表面意思读者可能会一头雾水,不知道这是个什么东东。Sampler的中文字面翻译是“采样机”或者“取样器”,在JMeter的中文版本里对这个Sampler没有做任何翻译,可能当时中文版本的翻译者对这个如何翻译也不太确信,干脆直接在菜单里就不翻译了。Sampler在别的类似的产品中,更为普通的表达方式是“协议”。不过Java Sampler的意思不是指支持所谓的“Java协议”,或者说“Java取样器”,比较准确的意思是利用自定义的Java类来扩展对新协议的支持,这些扩展的协议通过“Java请求”加入到测试脚本中,如下面两个步骤所示。
步骤1: 在测试脚本中加入“Java请求” 步骤2: 在列表中选择自定义的Sampler下面xmeter君以MQTT的pub为例介绍具体使用Java Sampler来扩展步骤。
准备开发环境
在给JMeter开发插件的时候大部分情况不需要把JMeter的源代码下载,只需要对相关的JMeter库进行引用就可以了。请参见文章JMeter扩展插件实现对自定义协议进行支持中的“JMeter插件实现步骤1 - 准备开发环境”来准备开发环境。需要注意的是除了引用“ApacheJMeter_core”和“ApacheJMeter_java”之外,还需要引入访问MQTT服务器所需的Java类库,在此例中使用的是fusesource的mqtt-client库,这些额外的类库的引用完全取决于被扩展的协议和协议扩展者的偏好。
读者可以参考该链接的pom.xml来了解本文所需的Maven依赖。
开发Java Sampler
开发一个自己的Java Sampler包括下面几个步骤:
1)扩展JMeter的类org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient
2)实现下面的4个方法:
/**必需实现的方法**/
publicSampleResult runTest(JavaSamplerContext context)/**可选实现的方法**/
public Arguments getDefaultParameters()
public void setupTest(JavaSamplerContext context)
public void teardownTest(JavaSamplerContext context)
runTest方法
runTest方法的返回结果为SampleResult,就是每次调用返回的结果。这个方法的实现逻辑一般如下:
SampleResult result=newSampleResult();
result.sampleStart();
try{
...
//发出请求
result.sampleEnd();
//请求成功,设置测试结果为成功
result.setSuccessful(true);
result.setResponseData("data...");
result.setResponseMessage("message..)";
result.setResponseCodeOK();
}catch(Exceptione){
//请求失败,设置测试结果为失败
result.sampleEnd();
result.setSuccessful(false);
result.setResponseCode("500");
...
}
return result;
如上述代码所示,代码逻辑主要是:
1)对目标系统发送正确的协议数据。
2)根据目标系统返回的数据,给SampleResult设置正确的开始、结束时间,这样JMeter引擎知道测试成功与否,并正确地显示到JMeter的报告结果中。
getDefaultParameters方法
在运行测试的时候,需要用户提供一些输入,这些输入甚至可能是JMeter的变量,这个方法的用处就在于允许用户在测试开始,或者运行期间指定变量的值。如下图所示的sampler例子就暴露了一些参数,允许测试人员在测试编辑和执行期间更改参数值。
Java sampler暴露的参数setupTest方法
跟写JUnit测试的setup方法类似,这里主要运行一些针对一个虚拟用户的一次性起始、准备性的操作,比如建立连接的过程在测试阶段可能只需要一次,那么这段建立连接的逻辑可以放在该方法里。
teardownTest方法
与JUnit测试的teardown方法类似,这里主要运行一些针对一个虚拟用户的收尾的操作,比如清除连接等。这里需要注意的是,该方法的调用不是在单个虚拟用户的线程里执行的操作,而是所有虚拟用户在一个线程里顺序执行的。
编译、部署与使用
完成了代码的编写,需要将代码进行编译和部署。右击项目》Run As 》Maven install,在target目录下会生成一个jar包。请注意在本文所提供的pom.xml里,编译出来的jar包里包含了所需的第三方jar包,比如说fusesource的mqtt-client库,这样避免在JMeter运行的时候单独去寻找别的jar包,使得部署过程更加方便。
将编译好的target/mqtt-jmeter-jar-with-dependencies.jar拷贝到$JMETER_HOME/lib/ext目录下,如果开着JMeter则重启,启动完毕,加入一个Java请求,在“类名称”下拉列表框中应该能看到新扩展的类了。如果不能发现,请查看一下lib/ext目录下是否拷贝了jar包,再者也可以看一下JMeter的日志,确认没有报出异常。
具体的该Java Sampler的使用可以参考这篇文章,这里就不再赘述。所有的源代码请参见这里。
总结
至此,本文已经介绍完如何通过JMeter提供的扩展机制来支持全新协议的性能测试支持,读者可以了解到JMeter对新协议的定制扩展还是比较简单的。当然,通过Java Sampler方式扩展的支持在界面友好性上跟JMeter提供的标准的协议支持提供的功能上面还是差一些,如果想对JMeter提供更加强大的扩展方式,请参考这篇文章。
另外,本文所提到的MQTT Java Sampler的实现有一个更加完整的功能实现,XMeter已经将其开源,有兴趣的读者可以了解一下如何将Java Sampler改造成更加易用的JMeter插件。
关于我们
XMeter成立于2016年,核心团队都来自于IBM,是一家领先技术的性能测试持续集成咨询与服务提供商。我们致力于提供给客户可靠,简单,低成本的性能测试解决方案。