我们需要在少数几个传输模式为长轮询的组件中使用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()}
作为时间戳,如链接-How to capture signalR connection string in Jmeter
除了这些,我还可以看到在连接steptid和frameid中还有2个参数正在发送。尽管除了连接步骤外其他地方都没有使用这两个参数,我们还需要同时关联这两个参数吗?
或者我的脚本缺少什么?
在各种文章中,我都看到了使用websocket采样器插件的建议,但我相信,如果您的SignalR使用websocket机制,而不是长时间轮询,这可能会有所帮助。
请帮助我解决此问题。感谢您的帮助。谢谢
答案 0 :(得分:0)
根据How does long-polling work?的答案:
<div style='width: 110px; border: solid 1px #f0f0f0' class='my-text'> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam voluptua </div> <b>You can change the "width" and see the result.</b>
:接收到请求(轮询)后,服务器没有可供客户端使用的任何信息。
Case
:服务器不发送空响应,而是保持请求打开并等待响应信息可用。完成后,服务器会立即向客户端发送HTTP / S响应,从而完成打开的HTTP / S请求。
因此,您的“挂起”可能表示服务器没有数据。
您可能想查看5 Ways to Load Test Popular Chat Plugins with JMeter的文章,该文章假定使用Parallel Controller来实现长轮询场景测试,甚至有example test plan
无论如何,您的测试都需要复制真实浏览器的功能,因此我建议使用Wireshark之类的嗅探工具捕获JMeter和真实浏览器发送的请求,如果有差异,请修正JMeter配置,因此请求将与真实浏览器发出的请求100%匹配
答案 1 :(得分:0)
此解决方案适用于LoadRunner用户。 1.tid不需要参数,也不必参数frame ID。 TID从1到11随机生成Java脚本
您的时间戳是12位随机数
挂起的原因是,永久帧是Signalr的异步功能,您必须使用此语句来注册PUSH。如果“推”不起作用,则进行“轮询”。像这样
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);
然后修改您的callback.c函数
int Push_0_ResponseBodyBufferCB(
const char * aLastBufferStr,
int aLastBufferLen,
const char * aAccumulatedStr,
int aAccumulatedLen,
int aHttpStatusCode)
{
//在此处输入ResponseBodyBufferCB()的实现。
lr_vuser_status_message("This is accumulated String %s", aAccumulatedStr);
lr_vuser_status_message("This is response body %s", aLastBufferStr);
下次在录制中启用“使用Asyn”选项时,您将看到此内容,但是您必须在录制结束时关闭浏览器窗口,否则将不会在脚本中发布和创建异步内容!我是用Fiddler发现的。