Jmeter测试MQTT协议方法

发表于:2020-5-29 08:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:张鸿    来源:51Testing软件测试网原创

  一、MQTT协议简介
  1.1 概述
  MQTT英文全称:Message Queuing Telemetyr Transport  ,中文全称:消息队列遥测传输协议。它是;一个极其轻量级的发布/订阅(Publish/Subscribe)消息传输协议。对于需要较小代码占用空间和网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。它构建于TCP/IP协议之上,属于应用层协议。目前常用的协议最新版本为MQTT5.0,5.0版本的协议在之前版本的基础上增加了会话/消息延时功能、原因码、主题别名、in-flight流控、属性、共享订阅等功能,增加了用于增强认证的AUTH报文,该协议目前也成为了OASIS的官方标准。
  1.2 特点
  MQTT的特点总结起来主要有以下几点:
  开放消息协议,简单易实现
  发布订阅模式,一对多消息发布
  基于TCP/IP网络连接,提供有序,无损,双向连接
  1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量
  消息QoS支持,可靠传输保证
  1.3 应用范围
  由于MQTT轻量化的设计,能够较好的保证消息的可靠传输,因此它被广泛应用于应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域,特别是在物联网领域的广泛应用,其次它在移动互联网上的运用也比较广泛,主要运用到手机消息的推送和订阅等服务,较好了为移动互联网的发展提供了更好的技术支持,相信在未来该协议的发展将会适用于越来越多的场景。
  二、Jmeter测试MQTT协议方法
  2.1 脚本调试前的准备工作
  前面简单的提到了MQTT协议的相关特性和应用范围,相信大家对这个协议有了一个大致的初步了解,如果我们要测试使用了MQTT协议技术的项目时,拿Jmeter来说,如果我们使用tcp协议来测试会发现无法成功发送,因为该协议的在操作过程需要进行connect的长链接,并需要多个线程进行订阅及发布操作,而平时的tcp协议是无法满足的,MQTT协议流程图如下所示:
  图1 MQTT协议流程图
  从上面可以看出使用MQTT通信协议的过程是多线程的操作的而这些线程都是长连接的情况,直到所有连接都被disconnect整个通讯才算彻底断掉,因此我们在进行这种协议的测试需要单独开发该协议的插件才能很好对使用该协议的项目进行测试,所幸我们国内的厂商xmeter已经开发了适用于Jmeter的插件,其插件可以在https://github.com/emqx/mqtt-jmeter上进行下载,目前该插件最新的版本是v1.13版本,协议支持3.1和3.1.1暂未对最新的5.0协议进行支持。
  在开始进行测试脚本的编制前,需要从上述的网址下载mqtt-jmeter插件,会获取一个mqtt-xmeter-1.13-jar-with-dependencies的jar包,把这个jar包拷贝到jmeter安装目录下的\lib\ext中,启动jmeter就可以使用MQTT协议了,插件正确安装后,可以在jmeter的取样器中看到如下的几个取样器(注:Jmeter版本为5.2.1)。
  图2 MQTT插件图
  2.2 MQTT插件详细说明
  安装成功MQTT插件后,我们在Jmeter的取样器中发现了如图2所示中的四个选项,分别为:MQTT Connect(MQTT连接操作取样器)、MQTT Disconnect(MQTT断开操作取样器)、MQTT Pub Sampler(MQTT发布操作取样器)、MQTT Sub Sampler(MQTT订阅操作取样器),下面我就对这四个取样器界面中的各个项含义进行详细的说明。
  2.2.1 MQTT Connect(MQTT连接操作取样器)
  图3  MQTT连接操作取样器界面
  Server name or IP:  指向被测MQTT服务器地址。【注】为灵活起见,属性值都可以引用JMeter的系统或自定义变量。
  Port number:  通常TCP连接的端口时1883, SSL连接则是8883。请参照服务器的具体配置。
  MQTT version:MQTT版本的选择,默认为3.1,还有一个选项为3.1.1,该版本暂未支持5.0,后继应该会支持。
  Timeout(s):  连接超时设置,以秒为单位。
  Protocols:  客户端与服务器通过SSL加密通道连接时,可以选择单向或者双向认证(Dual)。双向认证时,您还需要指定相应的信任秘钥库(Trust Key Store), 客户端证书,以及对应的文件保护密码(Secret)。这些文件可以通过服务器的证书配置转化得到。
  User authentication:  如果服务器配置了用户认证,您需要提供相应的用户名和口令。
  ClientId prefix:  标识客户端的固定前缀,每个连接(虚拟用户)再添加一个uuid串,整个作为客户标识。
  Keep alive(s):  心跳信号发送间隔。例如,300表示客户端每隔300秒向服务器发出ping请求,以保持连接活跃。
  Connect attempt max:  第一次连接过程中,尝试重连的最大次数。超过该次数则认为连接失败。
  Reconnect attempt max:  后继连接过程中,尝试重连的最大次数。超过该次数则认为连接失败。
  Clean session:该值为false表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销;该值为true表示创建一个新的临时会话,在客户端断开时,会话自动销毁。
  2.2.2 MQTT Pub Sampler(MQTT发布操作取样器)
  图4  MQTT发布操作取样器界面
  QoS Level:服务质量,取值为0,1,2,分别代表MQTT协议规范里的至多一次(AT_MOST_ONCE),至少一次(AT_LEAST_ONCE),精确一次(EXACTLY_ONCE)。
  Retained Messages:该值为TRUE表示保留消息,保留的消息会驻留在消息服务器,后来的订阅者订阅主题时仍可以接收该消息;该值为false表示不保留消息,当payload为空且该值是true,则会删除这条持久化的消息,如果当payload为空且该值是false,则不会删除这条持久化的消息。
  Topic name:发布消息所属的话题 (订阅方可以根据话题不同选择订阅)。
  Add timestamp in payload:如果勾选,发布的消息体开头会附带当前时间戳,利用它可以在消息接收端计算消息达到的延时。不勾选则只发送实际的消息体。
  Message type:目前支持三种消息类型
  * String: 普通字符串 (如上面截图所示)
  * Hex String: 以16进制数值表示的串,比如字符串Hello, 可以表示为48656C6C6F (其中,48在ascii表中对应字母H,依次类推)。通常16进制串用来构造非文本的消息体,例如描述某些私有的协议交互和控制信息等等。
  * Random string with fixed length: 按指定长度生成随机的串作为消息体。
  2.2.3 MQTT Sub Sampler(MQTT订阅操作取样器)
  图5  MQTT订阅操作取样器界面
  QoS Level:服务质量,含义与发布操作取样器相同。
  Topic name:订阅消息所属的话题。
  Payload includes timestamp:如果勾选,会从消息体开头处解析发送时间戳,用于计算消息的接收延时。
  Sample on:采样方式,它控制如何采样。默认值为“elapsed with specified time(ms)”,这意味着子采样器将每指定毫秒发生一次(默认值为1000ms)。在1000 ms期间,可以接收多条消息,结果生成报告是1000 ms期间的摘要数据。如果该值设置为2000,则表示2000 ms期间的摘要报告。另一个选项是“number of received messages”,这意味着子采样器将在接收到这些指定数量的消息后发生(默认值为1)。
  Debug response:如果勾选,消息内容会打印在JMeter的响应结果中,用于调试目的。正式运行测试建议不勾选。
  2.2.4 MQTT Disconnect(MQTT断开操作取样器)
  图6  MQTT断开操作取样器界面
  这个采样器非常简单,它只是清除先前创建的连接。因此,下次运行Connect sampler时,它将为您启动一个新的MQTT服务器连接。如果此时未检测到连接,则断开采样将立即失败。
  2.3 Jmeter测试MQTT协议方法
  上面详细介绍了MQTT插件各项的详细含义,如果我进行测试只需要在jmeter的测试计划中添加相应的取样器就能够进行相应的测试,为了测试MQTT插件是否可用,我在本机搭建了一个简单的MQTT服务器,使用的Apache的ActiveMQ,该工具集成了多种消息服务协议,为了测试我只使用到其中的MQTT协议,在Jmeter中我们加入如下的取样器。
  图7  Jmeter脚本试样
  其中连接、发布、订阅和断开各设置如图3-图6所示,然后运行了这个MQTT脚本,得到如下的结果,从返回的结果可以看到本次测试我们连接均调通,说明该脚本可以正常进行MQTT相关的通信测试。
  图8  测试脚本运行结果

      版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号