JMeter测试WebSocket的经验总结

简介: 最近有一个微信聊天系统的项目需要性能测试,既然是测试微信聊天,肯定绕不开websocket接口的测试,首选工具是Jmeter,网上能搜到现成的方法,但是网上提供的jar包往往不是最新的,既然是用最新版本的Jmeter4.0,那么所依赖的插件jar包也应该追求新的。
最近有一个微信聊天系统的项目需要性能测试,既然是测试微信聊天,肯定绕不开websocket接口的测试,首选工具是Jmeter,网上能搜到现成的方法,但是网上提供的jar包往往不是最新的,既然是用最新版本的Jmeter4.0,那么所依赖的插件jar包也应该追求新的。所以提供了以下链接供大家下载(甚至连源码都提供):

(1)Jmeter工具

(2)websocket请求模板 JMeterWebSocketSamplers 

(3)jetty-http

(4)jetty-io

(5)jetty-util

(6)websocket-api

(7)websocket-client

(8)websocket-common

将(2)~(4)中下载的jar包放到Jmeter以下目录下,就能够被调用了:

#将你下载的所有jar包,复制到
apache-jmeter-4.0\lib\ext
#该目录下

一、启动JMeter

windows环境打开 bin下的jmeter.bat
linux环境打开bin下的jmeter.sh

由于Jmeter4.0的界面是深色的(看不清字体),默认语言是英语,我们可以调一下。先修改语言:在bin\jmeter.properties中找到#language=en,将前面的注释【#】去掉,改为language=zh_CN。这样启动后就是中文版的,然后到选项-->外观中选择Metal,这就变成传统Jmeter样式。

二、添加websocket Sampler

先在测试计划中添加线程组,然后右键添Sampler时就能看到websocket的模板:

常用的就是websocket request-response Sampler(连接+发送data或者只发data),其次是WebSocket Open Connection(只连接,不发送data)

配置举例如下:

说明:(1)Connection:有两项,第一项是使用已有连接,就是上一个websocket请求所建立的连接通道,选择后Server URL全置灰只读不可操作。第二项是新建连接通道。

(2)Server URL:可以发送ws协议和wss协议(加密的websocket),以上图的配置所对应的连接串如下:

ws://192.18.24.211:8888/testPath   (这一点比旧版本的websocket插件配置要清晰明了)

(3)Data:支持文本(包括JSON)和Binary二进制数据的发送。默认请求响应的超时时间为6S,超过这个时间报错。(对于Data的文本格式最好是自己抓包获取,比如谷歌浏览器的F12开发者工具或Fiddler,不要太相信开发提供的接口文档)。

三、使用小技巧

1、Path和Requst data要注意编码格式

websocket发送数据到后端,与http请求的原理是相通的,所以发送的数据如果含有非常字符,如"/"、"+"、"%"、引号等,就会引起解析错误,所以需要特别注意,比如:

如上所示,websocket请求的上一个请求TR-token可以获取一个token串(通过正则表达式提取器提取),而这个串的格式可能是这样的:Ivj6eZRx40+MTx2Zv/G8nA,可以发现含有"+"、"/"字符,而我们需要把这个串作为Path的一部分来发送,那么我们就需要对${token}变量进行URL转码,用到jmeter的函数 __urlencode()

2、可以通过逻辑控制器来模拟群发消息

(1)通过循环控制器调取参数化文件(CSV)里的用户信息表来实现群发消息,如下所示:

(2)或者先通过发送请求来获取用户信息(正则表达式提取),再用ForEach调取用户组变量发送消息,如下所示:

3、以时间戳来查看当前聊天记录应注意websocket的response延时

在并发的情况下,websocket请求延时可能要远大于http请求,比如延时2秒以上(从发送消息到看到聊天面板已经过了2秒以上)。所以在jmeter中用时间戳函数${__time(,)}来表示最新一条聊天记录的时间是不可靠的。我们应该在websocket请求中插入正则表达式提取器,通过在response中获取其时间才能确保消息接收时间准确(即不要用客户端时间来判断你的聊天时间)。

(1)先提取websocket反馈的服务端时间戳

(2)再作为查询当前聊天记录的时间戳依据

4、最后说一下jmeter4.0,如果是要做分布式测试,jmeter4.0默认是要求RMI传输必须SSL加密的,否则jmeter-server就启动不了,我们可以用简单的配置来回避这个问题。就是server端和client端的jmeter我们统一做如下配置:

(1)用编辑器打开bin/user.properties文件
(2)找到server.rmi.ssl.disable,将#注释符去掉,改成 server.rmi.ssl.disable=true

现在可以奔跑了,我直接用以下shell脚本实现在linux下分布式调用jmeter-server进行测试,并生成html报告:

#!/bin/bash
testAPI="websocket-test.jmx" #jmeter测试脚本
Cur_Dir=$(cd "$(dirname "$0")"; pwd)
sed -i "s/csvData\\\/csvData\//g" $Cur_Dir/jmeter4.0/bin/${testAPI} #替换参数路径斜杠\为/
$Cur_Dir/jmeter4.0/bin/jmeter -n -t $Cur_Dir/jmeter4.0/bin/${testAPI} -R 172.16.1.67,172.16.5.241 -l $Cur_Dir/DashReport/log-$(date -d "today" +"%Y%m%d%H%M%S").csv -e -o $Cur_Dir/DashReport/htmlReport-$(date -d "today" +"%m%d%H%M%S")

       另外测试还开启了jmeter监控工具(influxDB+grafana),具体安装配置方式参见我的另一篇文章《关于Jmeter长时间压测的可视化监控报告》(区别是这篇文章用的是windows版的,而我这次测试用的是Linux版的,网上有相关下载,开源工具)。

       添加配置后,监控后的效果如下:

 补充:除了常用的WebSocket Open Connection和WebSocket request-response 这两个Sampler,WebSocket Single Read Sampler也比较常用,一般是用在群聊消息已读回执的发送。比如在微信群里发一条消息,通过抓包分析,可以看到客户端是发出了两条消息(同时服务端也回发了两条消息),如下所示:

 第二条消息表示发送消息已读回执,按以往的方式,我们需要通过正则表达式提取器提取第一条消息的返回值,然后发送第二条消息,这样的效率就不高,我们可以直接用WebSocket Single Read Sampler来模拟消息的已读回执:

为了避免这条已读回执消息偶尔出现超时报错,我们可以将Optional read勾选。 

目录
相关文章
|
1月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【10月更文挑战第1天】Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
131 3
|
2月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
108 2
|
15天前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
41 3
|
14天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
30 1
|
2月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【10月更文挑战第1天】告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
61 4
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
239 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【9月更文挑战第10天】随着软件应用的不断扩展,性能测试成为确保系统稳定运行的关键环节。本文通过对比Apache JMeter和Locust,探讨了如何在Python环境中利用这两款工具挖掘更多性能测试潜力。JMeter是一款成熟且功能强大的开源工具,支持多种协议,适用于各种应用的测试;而Locust则基于Python,通过简单脚本模拟HTTP请求,更适合Web应用测试。
93 3
|
2月前
|
消息中间件 监控 测试技术
惊呆了!Python性能测试高手都用这些神器:JMeter+Locust,效率翻倍📈
【9月更文挑战第8天】在软件开发中,性能测试对确保应用稳定性和高效运行至关重要。对于Python开发者而言,选择合适的性能测试工具能显著提升测试效率并精准定位性能瓶颈。本文深入探讨了JMeter和Locust这两款工具的独特优势。JMeter作为跨平台的性能测试工具,支持多种协议,具备高度可定制性和扩展性;而Locust则专为Python应用设计,利用协程实现高并发,提供实时监控和分布式测试功能。两者结合使用,可在实际项目中实现1+1>2的效果,帮助开发者构建全面高效的测试方案,保障应用稳定运行。
176 1
|
9天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
38 3