1、安装插件:JMeter WebSocket Samplers
pjtr / JMeter WebSocket Samplers / Downloads — Bitbuckethttps://bitbucket.org/pjtr/jmeter-websocket-samplers/downloads/
将下载的Jar包放在安装jmeter的/lib/ext路径下,重启生效
查看测试计划--》配置元件--》webSocket相关内容
查看用户组--》取样器--》webSocket相关内容
Sampler名称 | 说明 |
WebSocket Open Connection | 建立一个WebSocket连接 |
WebSocket Ping/Pong | 控制帧,发送Ping并接收Pong |
WebSocket request-response Sampler | 发送和接收文本或二进制WebSocket帧 |
WebSocket Single Write Sampler | 发送文本或二进制WebSocket帧 |
WebSocket Single Read Sampler | 接收文本或二进制WebSocket帧 |
WebSocket Close | 关闭WebSocket连接 |
注:
-
因为WebSocket是长连接流式通讯,所以可能存在发送一个请求收到多条响应的情况。收到的响应会以先后顺序排在一个响应队列中。当执行一个有读操作的Sampler时,就从队列头部取出一个响应;每当收到一个响应时,就将其放到队列尾部。
-
WebSocket Single Read Sampler是一个只读Sampler,它只从队列头部读取一个响应,如果读不到就等待,直至超时。
-
WebSocket Single Write Sampler是一个只写Sampler,它只向连接通道发送一个请求且不等待响应。
-
WebSocket Request Response Sampler是一个读写Sampler,它向连接通道发送一个请求,然后从响应队列头部读取一个响应,如果读不到就等待,直至超时。
-
如果放置的读Sampler和写Sampler数量不合适,可能会出现读到的数据错位的现象。
2、创建常规脚本
在JMeter页面中,右键单击Test Plan,选Add > Thread (Users) > Thread Group,将一个线程组添加到测试计划中。
右键单击Thread Group,选择Add > Sampler > WebSocket Open Connection,用于建立ws连接
-
配置项
示例值
说明
协议
WS
协议可以是WS或WSS(Secure WebSocket)。使用WSS进行加密连接。
Server name or IP
echo.websocket.org
域名或IP
Port
443
端口
Path
-
可为空
Connection timeout(ms)
20000
建连的超时时间
Read timeout(ms)
6000
等待服务器响应的超时时间
右键单击Thread Group,选择Add > Sampler > WebSocket Ping/Pong。该Sampler用来测试Ping/Pong功能。
相关配置如下:
Pong(读)超时(ms):6000
Pong(读)超时表示如果JMeter在6秒内没有收到Pong消息,则Sampler将失效。此Sampler会复用已有连接。
右键单击Thread Group,选择Add > Sampler > WebSocket request-response Sampler。
-
相关配置如下:
配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接。
数据类型
文本
指定数据类型、请求数据和响应超时值。
Request data
PTS
请求数据,这里以文本为例
Response (read) timeout (ms)
6000
响应超时时间
右键单击Thread Group,选择Add > Sampler > WebSocket Single Write Sampler。此请求是非阻塞的,只是将数据发送到服务端不需要等待响应。
相关配置如下:
配置项 | 示例值 | 说明 |
Connection | use existing connection | 创建新的连接或复用已有连接 |
数据类型 | 文本 | 指定数据类型、请求数据和响应超时值 |
Request data | PTS | 请求数据,这里以文本为例 |
Response (read) timeout (ms) | 6000 | 响应超时时间 |
右键单击 Thread Group,选择Add > Sampler > WebSocket Single Read Sampler。接收服务端的消息响应需要使用这个Sampler。
相关配置如下:
配置项 | 示例值 | 说明 |
Connection | use existing connection | 创建新的连接或复用已有连接 |
数据类型 | 文本 | 指定数据类型、请求数据和响应超时值 |
Response (read) timeout (ms) | 6000 | 响应超时时间 |
右键单击Thread Group,选择Add > Sampler > WebSocket Close。接收服务端的消息响应需要使用这个Sampler。
相关配置如下:
配置项 | 示例值 | 说明 |
Close Status | 二进制 | 关闭连接时定义的状态码,数据帧的头两个字节 |
Response (read) timeout (ms) | 6000 | 响应超时时间 |
此采样器将关闭现有的WebSocket连接,由于是协商关闭,显示原因为“1000:sampler requested close”。
右键单击Thread Group,选择Add > Listener > View Results Tree,在线程组中添加监听器View Results Tree,查看请求响应状态。
3、优化脚本,模拟100个真实用户持续连接ws
开启100个线程同时登录并打开websocket
从文件中获取获取信息--》右键添加Config元素--》csv数据文件设置
登录后添加后置Json提取器,获取登录的token
添加后置处理器,将值存起来
1、存到文件里,后面再从文件读取
FileWriter fstream = new FileWriter("D:/Software/jmeter-5.4.3/bin/Myworkspace/token.csv",false);
//这里结尾的true表示续写,即数据每次写入都在最末行续上;默认值为false:每次跑这个脚本都会覆盖原有内容再写入
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("access_token")+","+"\n");
//将提取出来的token写入,注意加上\n换行
out.close();
fstream.close();
2、存到变量里
${__setProperty(access_token_new,${access_token},true)}
后面参数调用方式:${__property(access_token_new,,)}
开启一个websocket,注意设置连接超时时间,最多不超过10分钟,也就是这次压测最长10分钟
但是我们想让他持续的压测,token不失效就一直有100个用户的websocket在连接中
加一个循环器,一直循环的定时在自动断开websocket连接时再开一个连接。
到这里就整体完成了