我们如何使用JMeter运行多个并发会话WebSocket测试?

g52tjvyc  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(434)

我使用JMeter WebSocket Samplers来执行WebSocket延迟测试。我的测试计划包含4个线程组。
首先,这是我生成的操作的顺序,每个步骤都被分组到一个线程组中。Presenter上第一个操作的连接在执行第二个操作之前被缓存,因为第三个操作,同一个Presenter,将继续使用这个连接。

def connection = sampler.threadLocalCachedConnection
props.put('presenterConnection', connection.get())

对于参与者的第二个和第四个连接也是同样的想法。步骤4中的参与者将继续使用步骤2中创建的连接。
1.演示者连接到WS,创建会话并保存会话ID
1.参与者连接到WS并订阅已保存的会话
1.演示者发出命令
1.参与者读取演示者发送的命令
它在单个会话中按预期工作。但是,当我运行2个并发会话时,在读取从Presenter发送的命令的第4次操作中,我遇到了WebSocket单个读取采样器的问题。
我将每个线程组的线程属性中的“线程数”改为2。演示者能够在第一次操作中创建2个会话ID。我添加了“线程间通信后处理器”,以将会话ID存储在队列中,以便能够将其传递给其他线程组。它在前3个操作中正常工作,直到在阅读从Presenter发送的命令的最后一个操作中转到WebSocket单读采样器。
在步骤2中,我使用了一个JSR223预处理器来使用缓存的连接。

def connection = props.get('Participant1Connection')
sampler.threadLocalCachedConnection.set(connection)

在最后一个操作的2个线程的响应正文中发现了此问题。未使用第一个会话ID。第一个用户在步骤4中使用第二个会话ID,而第二个响应正文为空,因为这2个用户使用的是同一个会话。要解决此问题,使2个用户从相应创建的2个会话阅读数据,该怎么做?
第一页第二页

daolsyd0

daolsyd01#

当人们复制粘贴代码而不理解它在做什么时,通常会发生这种情况。此外,如果你需要在线程组之间传递数据,很可能是你的测试设计有问题。
随便啦
根据JMeter Documentation
属性与变量不同。变量是线程的局部变量;属性对所有线程通用
因此,当您有1个以上的线程(虚拟用户)时,第二个线程将覆盖presenterConnection属性的值,因此,无论您有多少个线程,它们都将尝试使用presenterConnection的单个示例
我希望每个线程都有一个连接,在这种情况下,应该添加当前线程号作为属性键的前缀/后缀,这样:

  • 第一个线程将使用presenterConnection1
  • 第二个线程将使用presenterConnection2
  • 等等。

对“您的”代码的修改如下所示:

props.put('presenterConnection' + ctx.getThreadNum(), connection.get())

类似地用于接入连接。
在上面的示例中,ctx表示JMeterContext类示例,有关此缩写和其他可用于JSR 223测试元素的JMeter API缩写的更多信息,请参见Top 8 JMeter Java Classes You Should Be Using with Groovy文章。

相关问题