JMeter中如何验证User1接收User2 WebSocket连接的服务器通知?
验证跨线程组WebSocket消息接收的解决方案
你的测试计划结构如下:
TestPlan |-Thread1 |--HTTP Sample 1 |--HTTP Sample 2 |--WebSocket Connection Open for User1 |-Thread2 |--HTTP Sample 1 |--HTTP Sample 2 |--WebSocket Connection Open for User2
需求明确:当Thread2中User2完成WebSocket连接后,服务器会向Thread1中的User1推送“User2已连接”的消息,需要验证User1是否成功收到该消息。以下是可行的实现方法:
方法一:WebSocket Read Sampler + 全局变量共享
- 在Thread1的
WebSocket Connection Open for User1之后,添加WebSocket Read Sampler:设置监听超时为足够长的时间(比如30秒),确保能覆盖Thread2的连接流程,捕获服务器推送的消息。 - 在Thread1的WebSocket Read Sampler中,用
__setProperty()函数将捕获到的消息存入全局变量,示例:__setProperty(user1_received_msg, ${response_data}, true) - 调整线程组执行顺序:开启测试计划的“Run Thread Groups consecutively”选项,强制Thread1先启动监听,再执行Thread2的连接流程。
- 在Thread2的
WebSocket Connection Open for User2之后,添加JSR223 Sampler,读取全局变量并验证内容:def receivedMsg = props.get("user1_received_msg") if (!receivedMsg.contains("User2已连接")) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("User1未收到User2连接通知,收到的消息:${receivedMsg}") }
方法二:WebSocket Listener全局监听
- 在测试计划根节点添加WebSocket Listener,配置连接匹配规则(比如通过User1的WebSocket URL或连接ID),用以捕获所有推送消息。
- 在Thread1建立WebSocket连接后,用正则表达式提取连接ID,存入全局变量(比如
user1_connection_id)。 - Thread2完成连接后,添加JSR223 Assertion,遍历WebSocket Listener捕获的消息,筛选出User1连接对应的消息并验证:
def allMessages = ctx.getSamplerContext().get("WebSocketListener.messages") def user1Msg = allMessages.findAll { it.connectionId == props.get("user1_connection_id") } if (!user1Msg.any { it.payload.contains("User2已连接") }) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("未找到User1收到的User2连接通知") }
关键注意点
- 必须保证Thread1的WebSocket连接在Thread2执行期间持续活跃,不要提前关闭,可在Thread1末尾添加
WebSocket Close Sampler并设置延迟执行。 - 使用JSR223元件时优先选择Groovy语言,避免性能问题。
- 监听超时时间需根据实际业务场景调整,避免因网络延迟导致漏捕消息。
内容的提问来源于stack exchange,提问作者Oleksandr Holyshevskyi
相关产品推荐
相关产品推荐

