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,是一家领先技术的性能测试持续集成咨询与服务提供商。我们致力于提供给客户可靠,简单,低成本的性能测试解决方案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 本文版权归xmeter.net 所有。欢迎转载,转载请注明出处。 摘要## JMeter本身提供了插件机制,允许第...
    XMeter性能测试云服务阅读 11,221评论 7 9
  • 在使用Jmeter进行接口的性能测试时,由于Jmeter 是JAVA应用,对于CPU和内存的消耗比较大,所以,当需...
    燕京博士阅读 4,162评论 0 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 千年箜篌,亘古柔情 弹琴,谈情 情动于心,而形于声 琴声,情声 那婉转轻扬的箜篌声,那曲尽妙处的箜篌声 更是那清冷...
    浆桥阅读 526评论 2 4
  • 夏季半夜停电, 天热大汗挥扇, 胳膊酸痛难忍, 快点来电来电!
    张玥zhangyue阅读 250评论 0 0