JMeter websocket接口测试

前言

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

有可能造成数据更新不及时,如果前端轮询频率为5s,也许数据在这5s内已经更新多次了。

有可能对数据库造成额外压力,例如一个用户资产长时间不变化,但客户端还是要定时去查询,这种无意义查询占比相当高,对服务器造成不必要的压力。

要经过请求和响应两次交互,增加了耗时,而且http请求可能携带大量的header信息,增加网络带宽占用

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

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

也就是说,http轮询机制,主动权完全在客户端,而WebSocket机制中,主动权可以交给服务端,数据推送可以更精确,包括何时推送(定时推送还是更新即推送),推送什么数据。

准备工作

JMeter可以非常便利地进行WebSocket接口测试,但需要引入下列依赖:

jetty-http

jetty-io

jetty-util

websocket-api

websocket-client

websweocket-common

相关依赖下载:

https://pan.baidu.com/s/1PTOyTBzmOwLPNhxB-TxR7g ,提取码:uq25

下面内容基于JMeter5.1.1

将相关jar包放入JMeter安装目录的/lib/etc中,重启JMeter。在取样器中,可以看到比之前多了websweocket相关的取样器。

脚本编写

在编写脚本之前,先要搞清楚推送服务的逻辑,它的逻辑是这样的:

首先,客户端向服务端发送请求,建立连接

建立连接后,客户端需要定时向服务端发送ping-pong消息,维持心跳

客户端发送主动断开连接的请求,服务端断开该连接

建立连接,使用【WebSocket request-response Sampler】,顾名思义,这个取样器既能发送请求也能接收响应。

说明一下各项内容:

Connection:有use existing connection和setup new connection两种模式,前者是使用已有连接,即上一个websocket请求所建立的连接通道,选择后Server URL全置灰只读不可操作。后者指新建连接通道。

Server URL:ws协议和wss(加密的websocket)可选,sever name or IP(服务器地址)、Port(端口号)、Path(路径)、Connection timeout(连接超时时间)这些含义也很明了。

Data:发送数据,可以选择Text(文本,包括JSON)和Binary(二进制)形式,也可以通过勾选Read request data from file来从文件中获取data。

这个请求要与连接请求是同一个线程,并且要定时运行,因此设计脚本结构如下:

注意两点:

1.想要建立3000个连接的话,一定是将【线程数】设置为3000,循环次数设置为1,而不是相反,这是许多人容易弄混淆的。

2.【Ramp-up 时间】这个参数是全部线程启动的时间,如果想给服务器较大的瞬时压力,就把时间设置短一些。经过实测,这个时间太短的话,最终成功建立的连接会明显少于设置的【线程数】,所以一般设置长一点。

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

因为线程循环次数是1次(多次的话,就是一个线程反复建立连接了),因此我们要把【心跳检测】放到一个循环控制器中。

而【固定定时器】的作用,就是控制【心跳检测】发送的频率:
心跳检测:

尤其要注意两点:

1.Connection项一定要选择 use existing connection,表示使用该线程已经建立的连接,否则就重新创建连接了。

2.Request data 根据服务端的实现而定。

相关推荐
Lzg_na13 小时前
ARP 地址解析协议详解
网络·网络协议
北京盛世宏博14 小时前
通信异常深度排查:以太网温湿度设备 TCP 粘包、UDP 丢包根治方案
单片机·网络协议·tcp/ip·udp·以太网·传感器·温湿度
paopaokaka_luck16 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
CCblandy16 小时前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
雪雪爱冲浪17 小时前
2026 年网络爬虫领域的Puppeteer vs. Playwright
爬虫·网络协议·测试工具·接口隔离原则
zxanz117 小时前
SSL 证书申请下来快吗?
网络·网络协议·ssl
网络小江20 小时前
上网第五十二课:加密隧道与拨号专网——安全接入的通俗解释
网络协议
盛世宏博智慧档案1 天前
TCP以太网温湿度传感器:从RS485痛点突围到工业组网实战
网络·网络协议·tcp/ip
AIFQuant1 天前
Python A股实时行情API接入:沪深股票数据与WebSocket推送实战
开发语言·python·websocket·金融·a股行情
wdfk_prog1 天前
LWIP教程 13:从 `dhcp_start()` 到 `DHCP_STATE_BOUND`——DHCPv4、ACD、Timer 与真实抓包
运维·网络协议