我们需要在少数组件中使用
SignalR
对 Web 应用程序进行负载测试,传输模式为长轮询。我的脚本在连接步骤中挂起。连接步骤是 GET- /signalr/connect?transport=foreverFrame&clientProtocol=1.5&connectionToken=ZW6cj17pImmCjGGBQSQNy%2Bdiy7DKDUy4i4R1AE78c%2FTitzS6QgiPoX6fM3zBOrDK11hyx0QNEc92JM6bsLY19MCt5JjaYFgdTDVsbxfnRbkqKp6dpsl64BV1zI8Vu1X%2F&connectionData=%5B%7B%22name%22%3A%22mypreviewhub%22%7D%5D&tid=10&frameId=1
我关联了以下 2 个参数 - 1)从协商步骤捕获连接令牌并在后续请求中使用 2) 使用
${__time()}
作为时间戳,如链接-如何在 Jmeter 中捕获 signalR 连接字符串
除了这些之外,我还可以看到在连接中发送的另外 2 个参数 - tid 和 frameid。我们是否也需要关联这两个参数,尽管除了连接步骤之外,这些参数在其他任何地方都没有使用?
或者我的脚本缺少什么?
在各种帖子中,我看到了使用 websocket 采样器插件的建议,但我相信如果您的 SignalR 使用 websocket 机制而不是长轮询,这会有所帮助。
请帮我解决这个问题。感谢您的帮助。谢谢
根据长轮询如何工作?答案:
所以你的“挂起”可能表明没有来自服务器的数据。:服务器收到请求(轮询)时没有任何可供客户端使用的信息。Case
:服务器不发送空响应,而是保持请求打开并等待响应信息可用。一旦完成,服务器立即向客户端发送 HTTP/S 响应,完成打开的 HTTP/S 请求。Behavior
您可能想查看
使用 JMeter 加载测试流行聊天插件的 5 种方法文章,该文章假设使用并行控制器来实现长轮询场景测试,它甚至有一个示例测试计划
在任何情况下,您的测试都需要复制真实浏览器正在执行的操作,因此我建议使用Wireshark 等嗅探器工具捕获 JMeter 和真实浏览器发送的请求,如果存在差异 - 修改 JMeter 配置,以便请求将与来自真实浏览器的请求 100% 匹配
web_reg_async_attributes("ID=Push_0",
"Pattern=Push",
"URL=https://YOURurl.COM/signalr/connect?transport=foreverFrame&clientProtocol=1.5&connectionToken={CONNECTIONTOKEN}&connectionData=%5B%7B%22name%22%3A%22interactionhub%22%7D%5Dtid={TID}&frameId=1",
"RequestCB=Push_0_RequestCB",
"ResponseHeadersCB=Push_0_ResponseHeadersCB",
"ResponseBodyBufferCB=Push_0_ResponseBodyBufferCB",
"ResponseCB=Push_0_ResponseCB",
LAST);
int Push_0_ResponseBodyBufferCB(
const char * aLastBufferStr,
int aLastBufferLen,
const char * aAccumulatedStr,
int aAccumulatedLen,
int aHttpStatusCode)
{
lr_vuser_status_message("This is accumulated String %s", aAccumulatedStr);
lr_vuser_status_message("This is response body %s", aLastBufferStr);
下次在录音中使用启用的异步选项,您将看到这些内容,但您必须在录音结束时关闭浏览器窗口,否则异步内容将不会在您的脚本中发布和创建!我用 Fiddler 发现了这一点。