扩展JMeter TCP Socket支持定长的返回字节流

本文版权归xmeter.net 所有。欢迎转载,转载请注明出处。

摘要

xmeter君写的JMeter测试TCP/IP Socket应用的性能介绍了如何利用JMeter提供的“TCP取样器”来测试基于TCP Socket的应用程序的性能,大部分情况下可以满足测试的需求,但是xmeter君也发现JMeter提供的“TCP取样器”不能满足测试需求,比如服务器端返回的内容并不是有一个明确的终止符(在“TCP取样器”中设定的“End of line(EOL) byte value”),但是可能返回的是一个定长的字节流等。那本文就介绍一下如何对“TCP取样器”做一个扩展,来支持定长的返回字节流。

前提

在进入实际工作之前,读者最好能了解一下以下的知识,并且做好相应的准备工作。

1. 创建JMeter的开发环境。我们这次做的是基于“TCP取样器”的扩展,需要对其进行代码修改,因此首先需要准备好JMeter的开发环境。读者可以参考xmeter君之前写的JMeter Eclipse开发环境安装、配置过程来配置一个开发环境

2. 了解JMeter第三方协议插件扩展的方法。JMeter提供了插件的扩展机制来支持不同的协议测试,TCP Socket作为JMeter内置支持的协议,也是按照插件扩展的规范来实现的,读者可以参考xmeter君写的这篇文章来了解JMeter插件的开发方法,从而更好的理解本文的内容。

3. 最后需要对“TCP取样器”插件本身需要有所了解,当然,如果读者有扩展“TCP取样器”的需求的话,应该已经对本插件已经比较熟悉了。

效果

先来看一下修改后的效果,在“End of line(EOL) byte value: ”之后增加了一个“响应长度”的字段。如果“End of line(EOL) byte value: ”和“响应长度”同时设置了的话,现在的代码实现会优先考虑使用“End of line(EOL) byte value: ”的配置,“响应长度”里的设置会被忽略。下图所示的例子是xmeter君之前在文章写的TextServer中返回: "Echo: " + 客户端发送的数据。如下图所示,客户端发送的是"hello",那么服务器返回的是"Echo: hello\n",其中"\n"是回车符,所以总共长度为12位。当然,如果碰到了服务器端的字节流结束符的话,不到指定的响应长度也会直接返回。如果指定的长度小于实际的字符流的长度,那么超过指定长度的字符就会被截掉。

开发过程

JMeter对TCP协议的支持都放在了tcp目录下,因此本次开发的所做的更改都集中于该目录,如下图所示,或者参考此链接

改造过程跟一般的协议扩展非常相似,读者可以参考xmeter君写的这篇文章。本次更改主要为,

1) TCPConfigGui.java中加入了UI,增加了新的字段

2)TCPSampler.java加入了对“响应长度”字段向TCPClient.java以及相关的扩展类的设置

3)TCPClient.java以及相关的扩展类,增加了对返回的内容中“响应长度”的处理

具体的代码不在此做详细介绍,读者可以参考这个源码库,如果读者想直接使用,可以在此下载编译好的JAR包(基于JMeter 4.1版本),并覆盖你本地的$JMETER_HOME/lib/ext/ApacheJMeter_tcp.jar即可。读者在使用过程中有任何问题,可以在项目中直接提bug。读者请注意:本文只作为一个参考,如果在实际的生产测试中使用此修改后的插件请仔细评估!

读者如果要基于xmeter君的版本进行修改,只需要在创建好JMeter的集成开发环境之后,从本代码库下载源代码,然后覆盖你工作区里的源代码就可以了,然后基于xmeter君的版本进行修改、编译。

推荐阅读更多精彩内容