Jmeter获取Websocket多帧消息的实现方法

由于需要对WebSocket进行压力测试,因此又回归到了JMeter的使用。网络上缺少具体的获取多帧消息的操作,且自己也踩了两个坑,总结一下可行的操作供大家参考。
一、情况说明
被测试的WebSocket会根据客户端发起的信息进行回复,回复帧数不确定。现在需要把所有回复的内容都获取到
二、工具
经过调查,可以使用JMeter自带的插件WebSocket Sampler by Maciej Zaleski或者WebSocket Samplers by Peter Doornbosch。
在JMeter的Plugin Manager里面的Available Plugins搜索关键字"WebSocket"即可搜索出来,进行安装。

这两个插件都可以使用,下面以WebSocket Samplers by Peter Doornbosch的使用进行说明。
三、具体操作
科普一下: WebSocket 以 frame 为单位传输数据, frame 是客户端和服务端数据传输的最小单元, 当一条消息过长时, 通信方可以将该消息拆分成多个 frame 发送。
那现在我们要解决的就是怎么接收这不确定帧数的多帧内容,下面贴上返回的多帧数据样式

从返回消息来看,我们可以通过判断response值是否为空,或者flag是否等于end来判断
思路:从上面的返回数据可以看出来,我们需要使用while循环来获取返回的数据。那判断条件可以选择判断response值是否为空,或者flag是否等于end。下面就以response值是否为空作为条件来进行判断。
具体步骤:

  1. 我们先加入WebSocket的Open Connection,用于建立WebSocket通道

  2. 加入WebSocket Single Write Sampler,用于发送一个(文本或二进制)WebSocket 帧

  3. 加入WebSocket Single Read Sampler,用于接收一个(文本或二进制)WebSocket 帧。在这里我们用于接收第一帧消息。到这个步骤,可以跑一遍,检查是否能正常发送和接收消息。如果可以,再继续下面步骤。

  4. 建用户自定义变量(即User Defined Variables)

  5. 建JSON Extractor,用于接收Websocket返回内容中json字段的值。我这里是返回的json,所以就用的JSON Extractor。把用于判断的值取出来放到步骤4创建的用户自定义变量里面。

  6. 建循环(While Controller),条件写{__jexl3("{WSresponse}"!="")},代表只要返回的值非空的情况就继续执行循环里的读取消息操作,即步骤7。

    7.循环里创建第二个WebSocket Single Read Sampler,用于接收第二帧及其以后的消息。

  7. 建WebSocket Close,用于正常关闭 websocket 连接。

    9.结束,运行结果:

    四、下面说下踩过的坑,供大家参考

  8. 最大的坑:Debug Sampler
    为了调试,我加了几个Debug Sampler,如图Debug1,Debug11。
    出现了奇怪的事情,跑完以后看View Results Tree里面的 Debug1,WSresponse 里面有值且正确;但是查看Debug11的WSresponse值就为空了。
    我认为是JSON Extractor的顺序,以及里面的设置"Apply to"导致,做了很多次调整都没有解决此问题,直到把两个Debug1,Debug11给disable了才解决。
    具体原因后续再做调查。

  9. while controller
    表达式写错了,但是没有看JMeter的console,进入循环后就无限循环。被这个奇怪的现象困扰了很久最后才发现console里面在报错。
    得到的经验是:

  • 一定要打开console
  • while表达式写错了也会进入循环