随着在线聊天、实时推送等应用的普及,传统的HTTP协议已经无法满足双向、低延迟的通信需求。WebSocket协议允许客户端和服务器之间建立持久连接,实现全双工通信。对于这类即时通讯(IM)应用,怎样进行有效的压力测试,是很多测试人员关心的问题。湖南卓码软件测评有限公司(有CMA和CNAS双资质,可出具全国通用的软件测试报告)的工程师在实践中总结了一套根据JMeter的测试方法。
一、为什么WebSocket测试和HTTP不同?
在HTTP协议中,每次请求都是客户端主动发起,服务器被动响应。而WebSocket建立连接后,服务器可以主动向客户端推送消息。这意味着在测试IM应用时不能简单地用一个请求模拟发送消息,还需要模拟接收消息的用户,并且要考虑消息是不是能完整、及时地送达。JMeter原生不支持WebSocket,需要借助专门的插件来模拟这种双向通信。
二、准备工作安装WebSocket插件
JMeter默认不支持WebSocket协议,需要安装插件。最常用的是JMeter WebSocket Samplers插件。
下载插件:从JMeter插件管理器中搜索并安装,或者手动下载 JMeterWebSocketSamplers-x.x.x.jar 文件。
放置插件:将下载的jar包放到JMeter安装目录的 lib/ext 文件夹下。
重启JMeter:重启后,在“添加 -> 取样器”菜单中,如果能看到 WebSocket Open Connection、WebSocket Single Write Sampler 等选项,说明插件安装成功。
三、脚本设计模拟用户聊天
在测试一个典型的聊天室或一对一聊天场景时,脚本需要模拟两个重要动作:发送消息和接收消息。由于WebSocket是长连接,JMeter插件的设计是维护一个“响应队列”,收到的消息会按顺序排队,读取样器从队列中取数据。
以下是一个基础的线程组结构,用于模拟一个用户的行为:
WebSocket Open Connection:这是第一步,用于和服务器建立WebSocket连接。需要填写服务器的URL、端口和途径。
WebSocket Single Write Sampler:用于发送消息,比如发送一条聊天文本。这个取样器只负责发送,不等待响应。
WebSocket Single Read Sampler:用于接收消息。由于服务器可能会推送多条消息(比如别人发的消息),你需要放置一个或多个读取样器来从队列中读取响应。如果队列为空,它会等待直到超时。
WebSocket Close:在迭代结束时,关闭连接。
四、实战怎样模拟真实场景
要更真实地模拟即时通讯的压力,还需要注意以下几点:
模拟多用户登录:通过JMeter的线程组设置并发用户数。每个线程(虚拟用户)都应独立维护一个WebSocket连接。可以在每个线程的脚本开头,使用CSV数据文件为每个用户配置不同的用户名和Token,用于登录认证。
处理心跳机制:很多IM应用有心跳机制(Ping/Pong)来保持连接存活。你可以在线程组中添加 WebSocket Ping/Pong 取样器,定期发送Ping帧,以保证连接在长时间测试中不会被服务器断开。
重视标准:运行测试后,除了常规的响应时间和吞吐量,还要特别重视以下WebSocket特有标准:
连接建立时间:用户从发起连接到握手成功的时间。
消息时延:从A用户发送消息到B用户收到消息的时间差。
消息可靠性:发送的消息是不是100%被接收方收到,有无丢包。
连接稳定性:测试过程中连接意外断开的次数。
处理二进制数据:如果应用发送的是图片、语音等二进制消息,需要在Sampler中选择“二进制发送数据”方式,并可以设置从文件中读取二进制数据作为请求体。