Jmeter | 使用 Jmeter 进行 Websocket 测试

Jmeter 本身不支持发送 Websocket 请求,需要下载第三方依赖包来配合实现

Posted by Haauleon on July 20, 2022

一、Websocket

  在一个网站中,很多数据需要即时更新,比如期货交易类的用户资产。在以前,这种功能的实现一般使用 http 轮询,即客户端用定时任务每隔一段时间向服务器发送查询请求来获取最新值。这种方式的弊端显而易见:

  • 有可能造成数据更新不及时,如果前端轮询频率为5s,也许数据在这5s内已经更新多次了。
  • 有可能对数据库造成额外压力,例如一个用户资产长时间不变化,但客户端还是要定时去查询,这种无意义查询占比相当高,对服务器造成不必要的压力。
  • 要经过请求和响应两次交互,增加了耗时,而且http请求可能携带大量的header信息,增加网络带宽占用。

  HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议- WebSocket,很好地解决了 http 轮询的弊端。

  在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。也就是说,http 轮询机制,主动权完全在客户端,而 WebSocket 机制中,主动权可以交给服务端,数据推送可以更精确,包括何时推送(定时推送还是更新即推送),推送什么数据。



二、操作步骤

1、下载第三方依赖包

链接: https://pan.baidu.com/s/1s2UN1u2VnD83AQzIgT0-VA?pwd=r9vy
提取码: r9vy

Jmeter版本:当前使用 JMeter5.5
下载后进行解压,将解压后的目录中所有 jar 包放入 JMeter5.5 安装目录的 /lib/etc 中,重启 JMeter。在取样器中,可以看到比之前多了 websweocket 相关的取样器。


2、添加线程组

右键点击 测试计划,添加 > 线程(用户) > 线程组

注意两点:

  1. 想要建立 3000 个连接的话,一定是将【线程数】设置为 3000,循环次数设置为 1,而不是相反,这是许多人容易弄混淆的。
  2. 【Ramp-up 时间】这个参数是全部线程启动的时间,如果想给服务器较大的瞬时压力,就把时间设置短一些。经过实测,这个时间太短的话,最终成功建立的连接会明显少于设置的【线程数】,所以一般设置长一点。这里用 30 秒。


3、建立 ws 连接

右键点击 线程组,添加 > 取样器 > WebSocket Open Connection

添加 WebSocket Open Connection 可以建立连接,把 http 通信协议切换成 websocket。


4、添加 ws 请求

右键点击 线程组,添加 > 取样器 > WebSocket request-response Sampler

  1. connection
    • use existing connection:使用已有连接,即上一个 websocket 请求所建立的连接通道,选择后 Server URL 全置灰只读不可操作
    • setup new connection:新建连接通道
  2. Server URL:ws 协议和 wss(加密的 websocket)可选,sever name or IP(服务器地址)、Port(端口号)、Path(路径)、Connection timeout(连接超时时间)
  3. Data:发送数据,可以选择 Text(文本,包括 JSON)和 Binary(二进制)形式,也可以通过勾选 Read request data from file 来从文件中获取 data


5、添加查看结果树

使用查看结果树查看结果



三、设计定时心跳检测机制

  一般的 websocket 推送服务,会设计定时心跳检测机制,也就是客户端定时向服务端发送一条特定的消息,这样服务端就会保持这个连接,否则的话,这个客户端就被服务端判定为不活跃而被断掉连接。因此,为了让我们的脚本持续跑下去,就需要加入心跳检测请求。


1、添加循环控制器


2、添加固定定时器

  因为当前线程组设置的 线程循环次数 是 1 次(多次的话,就是一个线程反复建立连接了),因此我们要把【心跳检测】放到一个循环控制器中。而【固定定时器】的作用,就是控制【心跳检测】发送的频率。


3、添加心跳检测

添加 WebSocket request-response Sampler,尤其要注意两点:

  1. Connection 项一定要选择 use existing connection,表示使用该线程已经建立的连接,否则就重新创建连接了。
  2. Request data 根据服务端的实现而定。


以上参考自 https://blog.csdn.net/qq_38129621/article/details/121335407