一、环境准备
-
安装 Java
-
JMeter 依赖 Java 环境,确保已安装 JDK 8+。
-
验证安装:终端输入
java -version
,显示版本信息即可。
-
-
下载 JMeter
-
官网下载最新版:Apache JMeter
-
解压到任意目录(如
/opt/jmeter
)。
-
-
安装插件管理器
-
下载
jmeter-plugins-manager-1.10.jar
,放入JMETER_HOME/lib/ext
目录。 -
重启 JMeter,菜单栏 Options → Plugins Manager 可见。
-
-
安装 WebSocket 插件
-
打开插件管理器,搜索 WebSocket,安装以下插件:
-
WebSocket Samplers by Peter Doornbosch
-
Custom Thread Groups(可选,用于复杂压测模型)
-
-
-
Protocol Buffers (proto) 支持
-
下载
protobuf-java-x.x.x.jar
(版本需与服务器匹配),放入JMETER_HOME/lib
。 -
在测试计划中通过
JSR223 Sampler
或 BeanShell 调用 proto 序列化/反序列化。
-
二、压测实例:WebSocket + Proto 协议
场景描述
-
模拟 100 用户并发连接 WebSocket 服务器(
ws://your-server:8080/chat
)。 -
每个用户发送 proto 编码的消息(如
ChatMessage.proto
),并接收响应。
步骤 1:定义 Proto 文件
// ChatMessage.proto
syntax = "proto3";
message ChatMessage {
string user_id = 1;
string content = 2;
int64 timestamp = 3;
}
步骤 2:生成 Java 类
protoc --java_out=./src ChatMessage.proto
- 将生成的
ChatMessage.java
编译为.class
文件,打包成chat-message.jar
,放入JMETER_HOME/lib
。
步骤 3:配置 JMeter 测试计划
-
创建线程组
-
右键 Test Plan → Add → Threads (Users) → Thread Group
-
参数:
-
Number of Threads (Users): 100
-
Ramp-Up Period: 10 (秒内启动全部用户)
-
Loop Count: Forever(持续压测)
-
-
-
添加 WebSocket 连接控制器
-
右键 Thread Group → Add → Config Element → WebSocket Connection Configuration
-
参数:
-
Server URL:
ws://your-server:8080/chat
-
Protocol:
ws
-
Connection Timeout: 5000 (ms)
-
-
-
添加 WebSocket 请求采样器
-
右键 Thread Group → Add → Sampler → WebSocket Open Connection
-
Name: Open Connection
-
Implementation:
RFC6455 (WebSocket v13)
-
-
发送 Proto 编码消息
-
添加 JSR223 Sampler(使用 Groovy 脚本处理 proto):
import com.example.ChatMessage;
// 创建 proto 对象
def message = ChatMessage.newBuilder()
.setUserId("user_${ctx.getThreadNum()}")
.setContent("Hello from JMeter")
.setTimestamp(System.currentTimeMillis())
.build();// 序列化为字节流
byte[] payload = message.toByteArray();
vars.put("protoPayload", payload); // 存储到变量
-
-
发送二进制消息
-
添加 WebSocket Send Sampler:
-
Message Type:
Binary
-
Payload:
${protoPayload}
(引用脚本生成的变量)
-
-
-
接收响应并断言
-
添加 WebSocket Read Sampler:
-
Timeout: 2000 ms
-
Expect Close: No
-
-
添加 JSR223 Assertion 解析 proto:
import com.example.ChatMessage;
byte[] response = prev.getResponseData();
ChatMessage parsed = ChatMessage.parseFrom(response);
if (!parsed.getContent().contains("ACK")) {
AssertionResult.setFailure(true);
AssertionResult.setFailureMessage("Invalid response: " + parsed.getContent());
}
-
-
添加监听器
-
View Results Tree(调试用,压测时禁用)
-
Summary Report / Aggregate Report
-
Response Time Graph
-
三、执行压测
-
保存测试计划为
websocket-proto.jmx
。 -
命令行运行(避免 GUI 资源消耗):
jmeter -n -t websocket-proto.jmx -l result.jtl
-
使用 JMeter Plugins 生成报告:
JMETER_HOME/bin/jmeter -g result.jtl -o report/
四、常见问题
-
Proto 类未找到 :确认
chat-message.jar
在lib
目录。 -
WebSocket 连接失败 :检查防火墙、服务器是否支持
ws
(非wss
)。 -
高并发下连接拒绝:调整服务器最大连接数,或使用分布式压测。
通过以上步骤,即可完成基于 ws+proto
协议的 WebSocket 压测。根据实际业务调整消息内容、并发模型及断言逻辑。