如何在Gatling中捕获GraphQL触发的后续WebSocket响应?
Gatling WebSocket 多响应捕获解决方案
问题描述
- 发送一次WebSocket原始消息后,收到多条同ID但内容不同的响应,后续响应由GraphQL POST请求触发
- 现有
.exec(ws("Web Socket Request").await(5))仅能捕获第一条响应,无法捕获后续触发的第二条响应 - 开发者控制台显示:发送ID为"11"的消息后,先收到同ID响应,执行GraphQL调用后又收到另一条同ID响应
- 当前测试代码如下:
.exec(graphQlRequests.onlineStatus(false)) .exec(graphQlRequests.chatRooms()) .exec( ws("Video Watch").sendText(subscriptionQueries.videoWatch()).await(5) .on(ws.checkTextMessage("Video Watch").check(jsonPath("\$..choices[0].id") .saveAs("choice"))) ) .exec(ws("New Messages").sendText(subscriptionQueries.newMessages())) .pause(1) .exec(graphQlRequests.startVideo()) .exec(graphQlRequests.chatRoom()) .exec(graphQlRequests.onlineStatus(false)) .exec(graphQlRequests.chatRoom()) .exec(graphQlRequests.onlineStatus(true)) .pause(9) .exec(graphQlRequests.onlineStatus(true)) .pause(3) .exec(graphQlRequests.videoChoice()) // Capture the second WebSocket message here..... .exec(graphQlRequests.onlineStatus(true)) .pause(15) .exec(graphQlRequests.onlineStatus(false))
解决方案
- 不需要单独建立SSE连接:所有响应都是通过已建立的WebSocket连接推送的,复用现有连接即可。
- 在触发响应的GraphQL请求后显式调用
ws.await捕获:在graphQlRequests.videoChoice()之后,添加单独的WebSocket等待检查步骤,针对第二条响应设置匹配条件(比如ID、内容特征):
.exec(graphQlRequests.videoChoice()) // Capture the second WebSocket message here..... .exec(ws("Capture Second Video Watch Response").await(5) .on(ws.checkTextMessage("Second Video Watch Check") .check(jsonPath("$.id").is("11")) // 匹配响应ID .check(jsonPath("$..choices[0].id").saveAs("updatedChoice")))) // 捕获目标字段 .exec(graphQlRequests.onlineStatus(true))
- 关键说明:
await(5)指定等待响应的超时时间(单位秒),可根据实际情况调整- 通过
jsonPath检查响应的ID或内容,确保捕获的是第二条目标响应 - 如果需要区分多条同ID响应,可以结合响应中的其他字段(比如更新后的choices值)来设置检查条件
内容的提问来源于stack exchange,提问作者christopher harris
相关产品推荐
相关产品推荐

