在之前的文章中,我介绍了 JMeter 如何内置支持 HTTP、HTTPS、TCP 和其他常用协议,并具有插件扩展机制。
通过插件,您可以支持更多内置功能,包括 MQTT。
MQTT 是物联网领域的主流协议。虽然它不是 JMeter 自带的协议类型,但在物联网测试场景中却非常常见。为了支持 MQTT 协议的负载测试,EMQ 开发了一个基于 JMeter 的开源 MQTT 协议测试插件。
本文介绍了如何在 JMeter 中使用 MQTT 插件。
在 JMeter 上安装 MQTT 插件
MQTT 插件的安装与其他 JMeter 第三方插件类似
- 从 GitHub 下载最新版本的插件
mqtt-xmeter-2.0.2-jar-with-dependencies.jar
。该插件支持 JMeter 3.2 及以上版本。 - 将插件 jar 包复制到 JMeter 的插件目录:
$JMETER_HOME/lib/ext
。 - 重启 JMeter。
在撰写本文时,JMeter MQTT 插件支持多种取样器,例如连接、消息发布和消息订阅。
这些可以组合起来构建更复杂的测试场景。
MQTT 连接取样器
连接取样器模拟一个物联网设备并启动 MQTT 连接。

(尹崇元,CC BY-SA 4.0)
服务器名称或 IP: 被测 MQTT 服务器的地址。
端口号: 以 EMQX Broker 为例,TCP 连接的默认端口为 1883,SSL 连接的默认端口为 8883。具体端口请参考服务器的具体配置。
MQTT 版本: 目前支持 MQTT 3.1 和 3.1.1 版本。
超时: 连接超时设置,单位为秒。
协议: 支持与 MQTT 服务器的 TCP、SSL、WS 和 WSS 连接。当选择 SSL 或 WSS 加密通道连接时,可以选择单向或双向身份验证(双向)。如果需要双向身份验证,请指定相应的客户端证书(p12 证书)和相应的文件保护密码(Secret)。
用户身份验证: 如果 MQTT 服务器配置了用户身份验证,请提供相应的用户名和密码。
ClientId: 虚拟用户的身份标识。如果启用为 ClientId 添加随机后缀,则 UUID 字符串将作为后缀添加到每个 ClientId 和整个虚拟用户标识符。
保持连接: 发送心跳信号的间隔。例如,300 表示客户端每 300 秒向服务器发送 ping 请求以保持连接活动。
最大连接尝试次数: 首次连接期间的最大重连尝试次数。如果超过此次数,则认为连接失败。如果用户希望保持尝试重新连接,请将其设置为 -1。
最大重连尝试次数: 后续连接期间的最大重连尝试次数。如果超过此次数,则认为连接失败。如果用户希望保持尝试重新连接,请将其设置为 -1。
Clean session(清除会话): 当用户希望在连接之间保持会话状态时,将此选项设置为 false;当用户不希望在新连接中保持会话状态时,将其设置为 true。
MQTT 消息发布取样器 (MQTT Pub Sampler)
消息发布取样器重用在连接取样器中建立的 MQTT 连接,以将消息发布到目标 MQTT 服务器。

(尹崇元,CC BY-SA 4.0)
QoS Level(服务质量等级): 服务质量,取值为 0、1 和 2,分别代表 MQTT 协议规范中的 AT_MOST_ONCE
、AT_LEAST_ONCE
和 EXACTLY_ONCE
。
Retained messages(保留消息): 如果您想使用保留消息,请将此选项设置为 true,以便 MQTT 服务器存储插件使用给定的 QoS 发布的保留消息。当在相应主题上发生订阅时,最后一条保留消息将直接传递给订阅者。因此,订阅者不必等待即可获得发布者的最新状态值。
Topic name(主题名称): 发布消息的主题。
Add timestamp in payload(在负载中添加时间戳): 如果启用,则当前时间戳将附加到发布的消息体的开头。与消息订阅取样器的Payload includes timestamp(负载包含时间戳)选项一起使用,可以计算消息在消息接收端到达的延迟时间。如果禁用,则仅发送实际消息体。
Payloads(负载) 和 Message type(消息类型): 目前支持三种消息类型
- 字符串:普通字符串。
- Hex String(十六进制字符串):字符串以十六进制值表示,例如 Hello 可以表示为 48656C6C6F(其中 48 对应于 ASCII 表中的字母 H,依此类推)。通常,十六进制字符串用于构造非文本消息体,例如描述某些私有协议交互、控制信息等等。
- 固定长度的随机字符串:生成指定长度(以字节为单位)的随机字符串作为消息体。
MQTT 消息订阅取样器 (MQTT Sub Sampler)
消息订阅取样器重用在连接取样器中建立的 MQTT 连接,以订阅来自目标 MQTT 服务器的消息。

(尹崇元,CC BY-SA 4.0)
QoS Level(服务质量等级): 服务质量,其含义与消息发布取样器中的含义相同。
Topic name(主题名称): 订阅消息所属的主题。单个消息订阅取样器可以订阅多个主题,以逗号分隔。
Payload includes timestamp(负载包含时间戳): 如果启用,则从消息体的开头解析时间戳,这可以与消息传递取样器的Add timestamp(添加时间戳)选项一起使用,以计算消息的接收延迟。如果禁用,则仅解析实际消息体。
Sample on(采样依据): 对于采样方法,默认值为specified elapsed time (ms)(指定经过时间(毫秒)),例如每毫秒采样一次。也可以选择number of received messages(接收消息数),例如每接收到指定数量的消息采样一次。
Debug response(调试响应): 如果选中,消息内容将打印在 JMeter 响应中。此选项主要用于调试目的。为了避免影响测试效率,不建议在正式运行时选中此选项。
MQTT 断开连接取样器 (MQTT DisConnect)
断开在连接取样器中建立的 MQTT 连接。

(尹崇元,CC BY-SA 4.0)
为了灵活性,上述取样器中的属性值可以引用 JMeter 的系统变量或自定义变量。
MQTT 和 JMeter
在本文中,我介绍了 JMeter MQTT 插件的各种测试组件。在另一篇文章中,我将详细讨论如何使用 MQTT 插件为不同的测试场景构建测试脚本。
本文最初发表于 How to Use the MQTT Plug-in in JMeter,经授权转载。
评论已关闭。