在 JMeter 中通过 WebSocket (WS) 协议发送和接收 Protocol Buffers (Proto) 消息,需要使用 JMeter WebSocket 插件,并结合 JSR223 脚本处理 Proto 的序列化和反序列化。以下是完整步骤:
1. 准备工作
1.1 安装 WebSocket 插件
下载插件:
JMeter WebSocket Samplers(推荐使用WebSocket Samplers by Maciej Zaleski
)将插件的 JAR 文件放入 JMeter 的
lib/ext
目录,重启 JMeter。
1.2 添加 Protocol Buffers 依赖
将
protobuf-java-x.x.x.jar
放入 JMeter 的lib
目录(与之前步骤一致)。
1.3 生成 Proto Java 类
使用
protoc
生成 Java 类(与之前步骤一致)。
2. 发送 Proto 消息(WebSocket)
2.1 配置 WebSocket 连接
WebSocket Open Connection
配置 WebSocket 服务器地址(如
ws://your-server:port/endpoint
)。设置连接超时和消息超时。
WebSocket Request-Response Sampler
用于发送消息并等待响应(同步模式)。
2.2 使用 JSR223 脚本发送 Proto 消息
在 WebSocket Request-Response Sampler 中,使用 JSR223 PreProcessor 生成 Proto 二进制数据:
import com.your.package.RequestProtoMessage;
// 1. 构建 Proto 对象
def request = RequestProtoMessage.newBuilder()
.setField1("value1")
.setField2(123)
.build();
// 2. 序列化为字节数组
byte[] payload = request.toByteArray();
// 3. 将字节数组设置为 WebSocket 请求内容
vars.putObject("wsRequestPayload", payload);
在 WebSocket Request-Response Sampler 中配置:
Request Data:
${__byteToString(${vars.getObject("wsRequestPayload")}, "ISO-8859-1")}
(将二进制转换为字符串,确保不丢失数据)Message Type: Binary(必须选择二进制消息类型).
3. 接收 Proto 消息(WebSocket)
3.1 使用 JSR223 PostProcessor 解析响应
在 WebSocket Request-Response Sampler 后添加 JSR223 PostProcessor:
import com.your.package.ResponseProtoMessage;
// 1. 获取 WebSocket 响应(二进制格式)
byte[] responseBytes = prev.getResponseData() as byte[];
if (responseBytes == null || responseBytes.length == 0) {
throw new Exception("WebSocket 响应为空!");
}
try {
// 2. 反序列化 Proto 对象
ResponseProtoMessage response = ResponseProtoMessage.parseFrom(responseBytes);
// 3. 提取字段到 JMeter 变量
vars.put("responseStatus", response.getStatus().toString());
vars.put("responseData", response.getData().toString());
// 4. 断言示例
if (response.getStatus() != 200) {
AssertionResult.setFailure(true);
AssertionResult.setFailureMessage("状态码非 200");
}
} catch (Exception e) {
log.error("解析 Proto 响应失败: " + e.getMessage());
throw e;
}
4. 完整测试计划示例
线程组
└─ WebSocket Open Connection(建立连接)
└─ WebSocket Request-Response Sampler
├─ JSR223 PreProcessor(生成 Proto 请求)
└─ JSR223 PostProcessor(解析 Proto 响应)
└─ WebSocket Close Connection(关闭连接)
5. 关键注意事项
5.1 WebSocket 消息类型
必须选择 Binary 消息类型(Proto 消息为二进制格式)。
文本消息类型可能导致数据损坏。
5.2 异步消息处理
如果服务端主动推送消息(非请求-响应模式),使用 WebSocket Single Read Sampler 监听消息。
示例配置:
// WebSocket Single Read Sampler 的 JSR223 PostProcessor byte[] asyncResponse = prev.getResponseData() as byte[]; if (asyncResponse != null) { ResponseProtoMessage asyncMsg = ResponseProtoMessage.parseFrom(asyncResponse); log.info("收到异步消息: " + asyncMsg.toString()); }
5.3 性能优化
复用 WebSocket 连接(避免重复握手)。
在 WebSocket Open Connection 中勾选 Re-use connection。
使用 Groovy 语言并启用脚本缓存。
6. 调试技巧
6.1 日志记录
// 记录 Proto 请求内容(Base64 编码方便查看)
import java.util.Base64;
String requestBase64 = Base64.getEncoder().encodeToString(payload);
log.info("Proto 请求内容 (Base64): " + requestBase64);
6.2 保存二进制响应到文件
new FileOutputStream("/tmp/websocket_response.bin").write(responseBytes);
6.3 模拟二进制消息
使用
__FileToString
函数加载本地 Proto 文件:byte[] filePayload = FileInputStream.readAllBytes(new File("/path/to/request.bin")); vars.putObject("wsRequestPayload", filePayload);
7. 常见错误
ClassNotFoundException: com.your.package.XXXProto
检查 Proto 生成的 Java 类是否在
classpath
中(JAR 文件位置正确)。
WebSocket 连接失败
确认服务器地址和端口是否支持 WebSocket。
检查防火墙或代理设置。
消息解析失败
确认客户端和服务端的
.proto
文件版本一致。检查消息类型是否为 Binary。
通过以上步骤,可以在 JMeter 中实现基于 WebSocket 的 Protocol Buffers 消息测试。