测试人必备技能:如何进行WebSocket接口测试?
目录
前言
WebSocket介绍
HTTP与WebSocket的区别
二者关系
WebSocket测试方法
使用Postman
使用Jmeter
使用Python
结语
前言
随着Web应用的日益普及,WebSocket作为一种全双工通信协议,在移动端、游戏、视频会议等方面得到广泛应用。
而对于需要实时通信的Web应用来说,WebSocket接口测试是非常重要的一环。然而,许多测试人员在进行WebSocket接口测试时,可能会遇到很多困惑和挑战。这些问题包括如何模拟WebSocket消息、如何进行连接和断开操作以及如何验证返回结果等。
今天,我将分享一些关于WebSocket接口测试的心得和技巧,帮助大家更好地掌握这个技能,无论你是初学者还是有经验的测试人员,相信这篇文章都会给你带来不少启发。
WebSocket介绍
WebSocket 是一种基于在单个 TCP 连接上进行全双工通信的协议,是从HTML5开始提供的一种浏览器与服务器之间进行全双工通讯的网络技术,解决了HTTP协议不适用于实时通信的缺点,相较于 HTTP 协议,WebSocket 协议实现了持久化网络通信,可以实现客户端和服务端的长连接,能够进行双向实时通信,协议名为"ws"。
HTTP与WebSocket的区别

- 两者都是基于TCP协议进行数据传输,具有可靠的传输能力,而且都是应用层协议
- HTTP是单向的通信,只能由客户端向服务端发送请求,服务端无法主动向客户端发送消息
- WebSocket是双向通信,客户端和服务端是通过握手建立连接,可实现全双工通信,双方可以同时主动向对方发送消息
- WebSocket在建立连接时数据是通过HTTP协议传输的,但是建立之后,真正传输数据时使用的是更加可靠的TCP协议
二者关系
- WebSocket在建立连接时,HTTP通过Upgrade消息头来通知客户端需要采用WebSocket协议来完成这个请求,在发送完此响应最后的空行后,服务器就会切换到WebSocket协议,接口返回状态码为
101,表示服务器已经理解了客户端的请求,需要升级协议
WebSocket测试方法
使用在线工具
在线工具有很多,自行百度吧!个人习惯用这个工具

使用Postman
Postman支持测试WebSocket协议的接口,此文章发布时还处于公测阶段,需要登录后才能使用,入口如下图所示

操作跟测试HTTP请求类似,不过多介绍啦!如下图所示

使用Jmeter
使用Jmeter既可以单独测接口,也可以进行性能测试,但测试WebSocket协议需要安装插件,下载插件后放到Jmeter安装路径中的lib/ext目录下,重启Jmeter后在【选项】菜单中会出现【Plugins Manager】,然后在可用插件Tab页搜索WebSocket,进行安装即可,如下图所示

安装后新建【线程组】,在添加【取样器】中会出现6项WebSocket的组件
- WebSocket Close:用于关闭WebSocket连接
- WebSocket Open Connection:只建立WebSocket连接,不发送数据
- WebSocket Ping/Pong:用于心跳检测,为了保持长连接,防止客户端被服务端判定为不活跃而被断开
- WebSocket Single Read Sampler:用于接收一个(文本或二进制)数据
- WebSocket Single Write Sampler:用于发送一个(文本或二进制)数据
- WebSocket request-response Sampler:用于执行基本的请求和响应交换,既能发送数据又可以接收数据
若有使用过Jmeter就肯定能明白这些组件的使用方法,以WebSocket request-response Sampler为例,页面信息介绍如下图所示

使用Python
首先需要安装websocket-client
pip install websocket-client
对于只是测试WebSocket接口发送接收消息是否正常,不需要长时间连接,可以使用下面的短连接方法,在请求结束后会主动断开连接
from websocket import create_connectionuser1 = create_connection("ws://localhost:6688/1") # 用户1打开连接
user2 = create_connection("ws://localhost:6688/2") # 用户2打开连接print("获取响应状态码:", user1.getstatus()) # 正常应返回101
print("获取响应头:", user2.getheaders())user1.send("你好呀!") # 用户1向服务端发送消息res1 = user1.recv() # 查看服务端推送的消息
res2 = user2.recv()if res1 == res2:print("服务端消息推送成功!\n")
else:print("消息获取异常!\n")print("查看用户1收到的消息:",res1,"\n查看用户2收到的消息:",res2)
若是要对WebSocket接口做持续监听工作,需要长连接,但不需要传参,只是监听消息,使用WebSocketApp类就更合适啦!方法如下
import websocketdef on_open(ws): # 定义用来处理打开连接的方法print("打开连接")def on_message(ws, message): # 定义用来监听服务器返回消息的方法print("监听到服务器返回的消息,:\n", message)def on_error(ws, error): # 定义用来处理错误的方法print("连接出现异常:\n", error)def on_close(ws): # 定义用来处理断开连接的方法print("关闭连接")if __name__ == "__main__":websocket.enableTrace(True) # 可选择开启跟踪,在控制台可以看到详细的信息ws = websocket.WebSocketApp("ws://localhost:6688",on_open=on_open,on_message=on_message,on_error=on_error,on_close=on_close)ws.run_forever() # 调用run_forever方法,保持长连接
还可以使用Pytest对WebSocket接口实现自动化测试,示例如下
import pytest
from websocket import create_connectionclass TestDyd():url = "ws://localhost:6688"@classmethoddef setup_class(cls):cls.ws = create_connection(cls.url) # 建立连接cls.ws.settimeout(5) # 设置超时时间def test_connect(self):# 通过状态码判断连接是否正常assert self.ws.getstatus() == 101def test_send(self):params = "你好呀!" # 定义传参self.ws.send(params) # 发送请求result = self.ws.recv() # 获取响应结果print("收到来自服务端的消息:", result) # 打印响应结果# 因为该测试项目传参会显示在响应中,所以通过判断传参是否在响应结果中进行断言assert params in resultif __name__ == '__main__':pytest.main(["-vs"])
传参可以使用@pytest.mark.parametrize()装饰器,示例如下
import pytest
from websocket import create_connectionclass TestDyd():data = [("/user/2", "今天开直播卖鱼!!!!"),("/user/3", "鱼可以买来放生吗?"),("/user/4", "那条翻白肚的鱼有死亡证明吗?"),("/user/5", "你的鱼会唱歌吗?"),("/user/6", "你的鱼上大学了吗?"),("/user/7", "你的鱼买回来需要隔离吗?")]@pytest.mark.parametrize("user, word", data)def test_send(self, user, word):ws = create_connection("ws://localhost:6688"+user)params = word ws.send(params) # 发送请求result = ws.recv() # 获取响应结果print("来自服务端的消息:", result)assert params in result # 断言

先简单介绍这些吧,关于Python脚本,可以参考官方文档,里面有示例和常见问题解决方法

结语
这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
相关文章:
测试人必备技能:如何进行WebSocket接口测试?
目录 前言 WebSocket介绍 HTTP与WebSocket的区别 二者关系 WebSocket测试方法 使用Postman 使用Jmeter 使用Python 结语 前言 随着Web应用的日益普及,WebSocket作为一种全双工通信协议,在移动端、游戏、视频会议等方面得到广泛应用。 而对于需…...
【Android FrameWork (三)】- SystemServer
文章目录 知识回顾启动第一个流程initZygote的流程 前言源码分析1.system_server2.SystemServer.main3,startBootstrapServices4,startService 拓展知识LoadApkcontext 对于Android context 大家是怎么理解的?LocalServices.java: addServece方法中 ArrayMap和HashM…...
Docker容器部署及基本使用
文章目录 一、环境初始化配置二、安装Docker三、优化配置四、基础命令 一、环境初始化配置 1、关闭防火墙 systemctl stop firewalld systemctl disable firewalldsetenforce 0sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config sed -i s/SELINUXenforcing/S…...
【机智云物联网低功耗转接板】+模拟MCU快速上手
GE211是机智云自研的定制化转接板,使用 ESP32-C3-WROOM-02 通讯模块,适用于白色智能家电等设备应用。 转接板已经烧录了机智云连云的最新GAgent固件,所以不需要烧写任何软件就可以快速上手使用。 GE211板卡带有一个串口,一般是把这…...
ai免费写作在线平台-ai免费伪原创文章生成器软件
ai伪原创能检测出来吗 人工智能技术可以检测伪原创,但是不是所有的伪原创都可以被检测出来。 现在有许多自然语言处理(NLP)算法和技术可以用来检测伪原创内容,例如文本相似度比较算法,语气分析算法等。这些算法可以检…...
Web自动化测试简介及web自动化测试实战交教程
一、认识web自动化测试 1.什么是自动化测试? 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段,按照测试人员的预定计划对软件产品进行自动化测试,他是软件测试的一个重要组成部分,能够完成许多手工测试无法完成或…...
基于单片机的家庭应急电源设计
基于单片机的家庭应急电源 摘 要 本设计基于STC89C52单片机设计得应急电源,以应急电源为研究对象,单片机设计为控制集成IC,ADC为模数转换控制模块,无源蜂鸣器作为报警电路。系统分为单片机设计最小系统,AD转换控制模…...
线程七大状态
线程生命周期(七大状态) 新建状态(New):当Java线程被创建时,它处于新建状态。此时,线程对象已被创建,但尚未启动。在这个状态下,线程并没有开始执行任何代码,…...
Linux第一章
文章目录 前言一、操作系统概述二、Linux初识1.Linux系统的诞生2.Linux系统内核3.Linux发行版 三、虚拟机介绍四、安装vmware workStation1.VMware WorStation软件2.安装 五、vm安装linux六、远程连接Linux系统1.图形化、命令行2.为什么使用命令行操作linux3.使用FinalShell软件…...
Microsoft Defender for Identity部署方案
目录 前言 一、重要组件 二、部署步骤 1、准备 Azure 订阅 2、配置 Microsoft Defender for Identity 门户...
超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!
众所周知,实时目标检测( Real-Time Object Detection )一直由 YOLO 系列模型主导。 飞桨在去年 3 月份推出了高精度通用目标检测模型 PP-YOLOE ,同年在 PP-YOLOE 的基础上提出了 PP-YOLOE 。后者在训练收敛速度、下游任务泛化能力以及高性能部署能力…...
基于Docker安装Redis【保姆级教程、内含图解】
Redis官网:Redis Redis中文官网:CRUG网站 两者选其一即可,建议使用 Redis官网:Redis 学习任何框架和技术,一定要参考相应的官网学习,一定要参考官网学习!!! 目录 一、拉取…...
电子表格软件与一站式BI的区别
看完本节内容,相信您能够了解到电子表格软件(代号电子表格软件)与「一站式 BI」的主要区别。所谓一站式BI在官网上的名称就是Smartbi V10.5,代号就是Smartbi一直在使用insight。 这两个产品都属于商业智能BI软件的品类࿰…...
SpringCache
一、介绍 Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。 Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就…...
Android Framework—Service
介绍 Service是一种可以在后台执行长时间运行操作而不提供界面的应用组件。服务可以由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可以通过绑定到服务与之进行交互,甚至是执行进程之间的通信…...
leetcode (重排数组使得)连续子数组的权值和最小
题目描述:请重新排列某个仅包含2和3的数组,使得数组的所有连续子数组权值之和最小数组的权值定义为,数组中所有元素之积的因子个数,例如:rank([2,3])4 x p 1 c 1 p 2 c 2 p 3 c 3 ⋅ ⋅ ⋅ p k c k r a n k ( c 1 1 ) ( c …...
JSP计算机等级考试查询系统(源代码+论文+答辩PPT)
第一章 引言 计算机等级考试查询系统是有其开发的必要性的,它的应用将大大节省了学校的人力资源,从而从人工劳动中解脱出来。我们这次开发的软件系统一共包括了三个部分:等级考试的报名系统、查询系统和管理系统。其中管理系统是另外两部分…...
python 基础系列篇:七、以函数方式编写一个数字华容道
python 基础系列篇:七、以函数方式编写一个数字华容道 数字华容道游戏分析开始编写完整代码代码解说定义方法的规律 小结 数字华容道 嗯,就是一个简单的益智游戏,把数字按照特定规律排列,并比矩阵少一个格,用来进行移…...
2023年前端面试题
1.position都有哪些属性 2.1px等于多少rem,rem根据根元素的大小,根元素是谁 3.Es6操作数组的方法 4.防抖和节流以及应用场景 5.Vue和ajax最大的区别是什么(Vue和ajax怎么操作dom的,vue虚拟dom) 6.js数据类型有哪些&…...
快速入门量化交易
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 原作者:袁霄|慕课网讲师 近来“量化交易”这个词听得越来越频繁,多数人对量化交易的第一印象是“高大上的技术”…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
