我是一个编程新手,有必要编写程序来使用 JMeter 进行负载测试,因为我找不到现有的 GUI 工具来执行我想做的事情。
我正在尝试使用 JMeter 插件“JMeter WebSocket Sampler”来加载测试 WebSocket 应用程序”。
我需要建议如何处理从 WebSocket 服务器发送的消息。
这里有一些条件。
- 与WebSocket服务器建立连接后,服务器在任意时间发送JMeter消息。
- 当JMeter收到消息时,它必须返回消息以通知消息已收到。
- 根据来自服务器的消息内容,JMeter 必须修改局部变量。
这是我当前的 JMeter 配置概述。
使用Parallel Controller划分接收消息和发送消息的线程。
在接收消息线程中,我尝试使用 JSR223 Listner在空的WebSocket采样器下编写JavaScript来处理接收到的数据。服务器以JSON格式发送数据。
在发送消息线程中,我使用 While Loop Controller ,该 Controller 将根据服务器的消息,在接收消息线程中等待变量值发生更改。
例如,当服务器向 JMeter 发送消息“Event_A_Notify”时,接收消息线程检查并将事件变量设置为“A”。然后,发送消息线程将“Event_A_Received”发送到服务器。
我遇到的问题是如何处理收到的消息。
在 JSR223 Lisner 中,我可以使用 sampleResult.getResponseDataAsString()方法以字符串格式从 WebSocket 服务器检索消息。
这是数据的样子。 (我修改了内容,使其看起来更简单。实际消息内容更大,属性更多)。
[Message 1]
{"Sample1":"A","uuid":"a5c77959-0284-40eb-9523-8706c947b620"}
[Message 2]
{"Sample2":"B","uuid":"93330fff-13fe-4040-9fe7-0e6d7054ee4a"}
[Message 3]
{"Sample3":"C","uuid":"099cea81-6f8f-4417-b0c5-29199f42a6f3"}
[Message 4]
{"Sample4":"D","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a1"}
当收到的消息超过 10 条时,JMeter 会删除较旧的消息以保留最新的 10 条消息。
[Message 8]
{"Sample8":"H","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a1"}
[Message 9]
{"Sample9":"I","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a2"}
[Message 10]
{"Sample10":"J","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a3"}
[Message 11]
{"Sample11":"K","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a4"}
[Message 12]
{"Sample12":"L","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a5"}
[Message 13]
{"Sample13":"M","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a6"}
[Message 14]
{"Sample14":"N","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a7"}
[Message 15]
{"Sample15":"O","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a8"}
[Message 16]
{"Sample16":"P","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a9"}
[Message 17]
{"Sample17":"Q","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a50810"}
这是 JSR223 Listner 处理接收到的消息的内容。
基本上,我会执行以下操作。
- 使用sampleResult.getResponseDataAsString();检索响应。
- 使用 String(responseData).split(/[Message [0-9]+]/); 并通过删除 [Message\d] 将字符串拆分为消息数组。<
- 使用数组对象messageArray来存储来自WebSocket服务器的所有响应。并在for循环中一一处理。
var responseData = sampleResult.getResponseDataAsString(); var counter = parseInt(vars.get("counter1")); var messageList = new String(responseData).split(/\[Message [0-9]+\]/); messageList.shift(); var messageArray = vars.getObject("messageArray"); messageList.forEach(function(message, index) { if (messageArray.indexOf(message) >= 0) { return true; } else { messageArray.push(message); } }); for (i = counter; i < messageArray.length; i++) { if (messageArray[i].match(/(someEvent).*/)) { vars.put("userVariable",true); counter += 1; break; } else { vars.put("userVariable",false); counter += 1; } } vars.put("counter1",counter); vars.putObject("messageArray", messageArray);
这段代码的问题是:
- 由于messageArray对象存储所有消息,messageArray变得太大,JMeter最终会因OutOfMemory异常而崩溃。
- 检查收到的消息是否存在于 messageArray 中的代码太慢,并且随着存储的消息数量的增加,性能呈指数下降。
有人可以建议更有效、更智能的方法来处理 JMeter 中的 WebSocket 消息吗?
非常感谢您的意见。
谢谢
最诚挚的问候,
最佳答案
After establish the connection with a WebSocket server, server sends JMeter messages in an arbitrary timing. When JMeter receives a message, it has to return message to notify the message is received. Based on a message contents from the server, JMeter has to modify local variables.
使用这个插件可以很简单地实现这一点:https://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/ 。 它提供了一个“读取采样器”,您可以使用它来等待消息,然后从接收到的消息中提取所需的任何内容,并使用“写入采样器”将消息返回到服务器。
关于javascript - 处理 JMeter WebSocket Sampler 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52270745/