通过Apache JMeter和对应的插件编写脚本,并在PTS中上传这些脚本、插件JAR包和其他相关文件,即可发起压测。 本文以JMeter WebSocket Samplers插件为例,主要介绍如何在本地使用Apache JMeter编写、调试压测脚本,以实现WebSocket协议的业务场景压测。
前提条件
已有正在运行的WebSocket服务。本示例使用Python搭建一个简易的WebSocket服务来做演示。
server.py
代码如下:
import asyncio
import websockets
async def echo(websocket, path):
async for message in websocket:
message = "Your message: {}".format(message)
await websocket.send(message)
asyncio.get_event_loop().run_until_complete(websockets.serve(echo, '0.0.0.0', 8080))
asyncio.get_event_loop().run_forever()
使用python server.py
运行服务端程序。
背景信息
WebSocket的插件较多,本文仅以JMeter WebSocket Samplers为例。JMeter WebSocket Samplers具有以下特性:
提供了六种WebSocket Sampler,这些Sampler不会新建额外的线程,节省资源。
支持WSS (WebSocket over TLS)。
JMeter的SSLManager能设置WSS,包括客户端证书。
支持二进制的WebSocket数据帧。
支持二进制响应的断言。
View Results Tree里可以查看二进制结果。
支持使用JMeter的Header Manager设置WebSocket Upgrade Request上额外的HTTP Header。
支持使用JMeter的Cookie Manager设置升级协议的请求里的Cookie。
支持代理。
支持过滤数据帧。
关于本文没有涉及的代理、过滤、分片等信息,请参见 JMeter WebSocket Samplers 插件介绍。
操作步骤如下:
步骤一:安装插件JMeter WebSocket Samplers
下载JMeter WebSocket Samplers,建议下载最新版本。本示例中使用 JMeterWebSocketSamplers-1.2.10.jar
将下载的插件.jar包存放在<JMeter安装目录>/lib/ext路径下。
重要在PTS中发起压测时,此处下载的插件.jar包需要上传到PTS。请参见步骤五:上传脚本、插件JAR包和其他文件至PTS进行压测。
重启JMeter。
重启JMeter之后,按照以下步骤查看插件是否安装成功:
右键单击左侧导航树中的Test Plan,选择
,可看到新增的配件元件选项WebSocket Binary Frame Filter、WebSocket Ping/Pong Frame Filter和WebSocket Text Frame Filter。右键单击左侧导航树中的Test Plan,选择
,可看到新增的断言选项 Binary Response Assertion。右键单击左侧导航树中的Test Plan,选择
,在编辑页面左下方的下拉列表中,可看到新增的选项Binary。右键单击左侧导航树中的Test Plan,选择
,右键单击Thread Group,选择 ,可看到以下新增的采样器选项,具体说明如下。Sampler名称
说明
WebSocket Open Connection
建立一个WebSocket连接
WebSocket Ping/Pong
控制帧,发送Ping并接收Pong
WebSocket request-response Sampler
发送和接收文本或二进制WebSocket帧
WebSocket Single Write Sampler
发送文本或二进制WebSocket帧
WebSocket Single Read Sampler
接收文本或二进制WebSocket帧
WebSocket Close
关闭WebSocket连接
重要因为WebSocket是长连接流式通讯,所以可能存在发送一个请求收到多条响应的情况。收到的响应会以先后顺序排在一个响应队列中。当执行一个有读操作的Sampler时,就从队列头部取出一个响应;每当收到一个响应时,就将其放到队列尾部。
WebSocket Single Read Sampler是一个只读Sampler,它只从队列头部读取一个响应,如果读不到就等待,直至超时。
WebSocket Single Write Sampler是一个只写Sampler,它只向连接通道发送一个请求且不等待响应。
WebSocket Request Response Sampler是一个读写Sampler,它向连接通道发送一个请求,然后从响应队列头部读取一个响应,如果读不到就等待,直至超时。
如果放置的读Sampler和写Sampler数量不合适,可能会出现读到的数据错位的现象。
步骤二:创建脚本
这里将演示如何在测试场景中添加并配置Sampler。以下为简单示例,您可以根据业务需要进行调整。
在JMeter页面中,右键单击Test Plan,选 ,将一个线程组添加到测试计划中。
在线程组中依次添加采样器(Sampler),并进行配置。右键单击Thread Group,选择 。当前的Sampler将建立WebSocket连接。
相关的配置如下:
配置项
示例值
说明
协议
WS
协议可以是WS或WSS(Secure WebSocket)。使用WSS进行加密连接。
Server name or IP
echo.example.com
域名或IP
Port
8080
端口
Path
-
可为空
Connection timeout(ms)
20000
建连的超时时间
Read timeout(ms)
6000
等待服务器响应的超时时间
右键单击Thread Group,选择 。该Sampler用来测试Ping/Pong功能。
相关配置如下:
Pong(读)超时(ms):6000
Pong(读)超时表示如果JMeter在6秒内没有收到Pong消息,则Sampler将失效。此Sampler会复用已有连接。
右键单击Thread Group,选择 。
相关配置如下:
配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接。
数据类型
文本
指定数据类型、请求数据和响应超时值。
Request data
PTS
请求数据,这里以文本为例
Response (read) timeout (ms)
6000
响应超时时间
右键单击Thread Group,选择 。此请求是非阻塞的,只是将数据发送到服务端不需要等待响应。
相关配置如下:
配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接
数据类型
文本
指定数据类型、请求数据和响应超时值
Request data
PTS
请求数据,这里以文本为例
Response (read) timeout (ms)
6000
响应超时时间
右键单击 Thread Group,选择 。接收服务端的消息响应需要使用这个Sampler。
相关配置如下:
配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接
数据类型
文本
指定数据类型、请求数据和响应超时值
Response (read) timeout (ms)
6000
响应超时时间
右键单击Thread Group,选择 。接收服务端的消息响应需要使用这个Sampler。
相关配置如下:
配置项
示例值
说明
Close Status
二进制
关闭连接时定义的状态码,数据帧的头两个字节
Response (read) timeout (ms)
6000
响应超时时间
此采样器将关闭现有的WebSocket连接,由于是协商关闭,显示原因为“1000:sampler requested close”。
如果您需要在通信中添加Token等Header,右键单击Thread Group,选择JMeter官方文档。 ,在线程组中添加配置元件HttpHeaderManager,并添加对应的Header。具体详情,请参见
右键单击Thread Group,选择 ,在线程组中添加监听器View Results Tree。接收服务端的消息响应需要使用这个Sampler。
步骤三:运行脚本
脚本编辑完成后,单击页面顶部的开始按钮,运行脚本。
通过View Results Tree监听器查看脚本是否运行正常。在左侧导航树中,选择View Results Tree,检查所有Sampler是否都配置正确并符合预期。在该监听器中,如果Sampler前面有绿色对勾表示运行正常。
如出现运行异常的Sampler,请参见步骤二:创建脚本进行调试。
部分示例结果如下:
WebSocket request-response Sampler
根据脚本配置,Request信息如下:
根据脚本配置,Text格式的Response data如下:
WebSocket Single Read Sampler
根据脚本配置,Text格式的Response data如下:
步骤四:导出脚本
当本地脚本调试成功后,选择顶部菜单栏的
,将脚本文件保存至本地。步骤五:上传脚本、插件JAR包和其他文件至PTS进行压测
您需准备以下文件,上传到PTS:
导出的JMeter脚本(.jmx文件)。
JMeter WebSocket Samplers的JAR包。
(可选)脚本中使用的其他数据文件。
关于在PTS中压测的操作步骤,请参见创建JMeter场景。