测试人必备技能:如何进行WebSocket接口测试?

news2024/11/26 22:28:24

目录

前言

WebSocket介绍

HTTP与WebSocket的区别

二者关系

WebSocket测试方法

使用Postman

使用Jmeter

使用Python

结语


前言

随着Web应用的日益普及,WebSocket作为一种全双工通信协议,在移动端、游戏、视频会议等方面得到广泛应用。

而对于需要实时通信的Web应用来说,WebSocket接口测试是非常重要的一环。然而,许多测试人员在进行WebSocket接口测试时,可能会遇到很多困惑和挑战。这些问题包括如何模拟WebSocket消息、如何进行连接和断开操作以及如何验证返回结果等。

今天,我将分享一些关于WebSocket接口测试的心得和技巧,帮助大家更好地掌握这个技能,无论你是初学者还是有经验的测试人员,相信这篇文章都会给你带来不少启发。

WebSocket介绍

WebSocket 是一种基于在单个 TCP 连接上进行全双工通信的协议,是从HTML5开始提供的一种浏览器与服务器之间进行全双工通讯的网络技术,解决了HTTP协议不适用于实时通信的缺点,相较于 HTTP 协议,WebSocket 协议实现了持久化网络通信,可以实现客户端和服务端的长连接,能够进行双向实时通信,协议名为"ws"。

HTTP与WebSocket的区别

  1. 两者都是基于TCP协议进行数据传输,具有可靠的传输能力,而且都是应用层协议
  2. HTTP是单向的通信,只能由客户端向服务端发送请求,服务端无法主动向客户端发送消息
  3. WebSocket是双向通信,客户端和服务端是通过握手建立连接,可实现全双工通信,双方可以同时主动向对方发送消息
  4. 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_connection

user1 = 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 websocket

def 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_connection

class TestDyd():
    url = "ws://localhost:6688"

    @classmethod
    def setup_class(cls):
        cls.ws = create_connection(cls.url)  # 建立连接
        cls.ws.settimeout(5)  # 设置超时时间

    def test_connect(self):
        # 通过状态码判断连接是否正常
        assert self.ws.getstatus() == 101

    def test_send(self):
        params = "你好呀!"  			# 定义传参

        self.ws.send(params)			# 发送请求
        result = self.ws.recv()			# 获取响应结果
        print("收到来自服务端的消息:", result)	# 打印响应结果
        # 因为该测试项目传参会显示在响应中,所以通过判断传参是否在响应结果中进行断言
        assert params in result

if __name__ == '__main__':
    pytest.main(["-vs"])

传参可以使用@pytest.mark.parametrize()装饰器,示例如下

import pytest
from websocket import create_connection

class 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脚本,可以参考官方文档,里面有示例和常见问题解决方法

结语

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《程序员面试金典(第6版)》面试题 16.03. 交点(直线的一般式方程,克莱姆法则,行列式,C++)

题目描述 给定两条线段(表示为起点start {X1, Y1}和终点end {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。 要求浮点型误差不超过10^-6。若有多个交点(线段重叠)则返回 X 值最…

为什么软件测试外包公司更受软件企业欢迎?软件测试报告需要多少钱?

劳动派遣或劳务派遣的用工模式古已有之,是人力资源销售市场不可避免的态势。软件测试顺应时代开展检测业务外包这一行业细分领域,越来越多软件外包公司尤其是小微型企业慢慢意识到了软件测试业务外包通常能够持续减少企业的各种成本费,使企业…

video 视屏播放器详细控制

介绍 canplay、play、pause是video提供的API,在视频加载完成后需要设置视频的总时长duration也是来源于自身的API但是需要格式化时间 设置当前播放时间通过自身API,currentTime function playing(){#id.innerHTMl 格式化时间函数(video.currentTime)…

《用于估计血压变化的光电体积描记图和心电图的特征》阅读笔记

目录 一、摘要 二、十大问题 Q1论文试图解决什么问题? Q2这是否是一个新的问题? Q3这篇文章要验证一个什么科学假设? Q4有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? Q5论文中提…

maven简单使用

实验课的作业用一大堆框架/库,统统要用maven管理。 头一次用,真痛苦。 所幸得以解决,maven真香~ 一步一步来。 1. maven 不是java人,只能说说粗浅的理解了。 简单来说,maven是一个管理项目的工具&…

自定义编码生成

自定义自增编码规则生成 需求场景开发需求需求实现其它 在项目中遇到的需求,这里记录下实现。以下仅供参考,代码有所删减,但核心代码在需求场景 1.需要多个编号规则,不同的场景使用的编码规则不同。 2.编码需要可自定义灵活选择配…

ts定义对象类型Record<string, any>;和object、Object的区别

Record Record 是 TS 内置的一个高级类型&#xff0c;是通过映射类型的语法来生成索引类型的&#xff1a; type Record<K extends string | number | symbol, T> { [P in K]: T; } 比如传入 a | b 作为 key&#xff0c;1 作为 value&#xff0c;就可以生成这样索引类…

Linux安装tomcat以及 对tomcat服务的操作

目录 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 2、解压安装包&#xff08;解压到指定位置&#xff0c;-C后面指定位置即可&#xff09; 3、进入Tomcat的bin目录去启动服务&#xff08;两种方式&#xff09; 4、验证Tomcat启动是否成功 方式一&#…

你如何看待,“国内ChatGPT还没成熟,但ChatGPT的付费模式已经成熟了?”

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 说来奇怪&#x1f914;&#xff0c;我们从0到1的事往往较少&#xff0c;但从1到100的嫁衣神功却很多也很快。就像 ChatGPT 还没有…

自有品牌与新兴渠道双轮驱动,丽人丽妆提速起航

2023年4月12日&#xff0c;上海市电子商务行业协会评选出上海市数字商务优秀企业&#xff0c;丽人丽妆凭借在数智化营销领域的专业能力&#xff0c;荣获“上海市数字商务优秀企业”称号。 此次获奖&#xff0c;也反映了丽人丽妆以科技赋能企业高效运营&#xff0c;已经取得突出…

Vue3技术8之Fragment、Suspense、Vue3中其他的改变

Vue3技术8 FragmentTeleport弹窗案例目录结构App.vueChild.vueSon.vueDialog.vue 总结 Suspense普通写法App.vueChild.vue 使用suspense之后App.vueChild.vue 不再自己调整网络低速Child.vueApp.vue 总结补充setup的一个知识点Suspense总结 Vue3中其他的改变全局API的转移其他改…

62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库

文章目录 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库62.1 创建数据库示例 62.2 查看数据库示例 62.3 选择数据库示例 62.4 删除数据库示例 62.5 备份数据库示例 62.6 恢复数据库示例 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库 62.1 创建数据库…

一个全端通用的折叠面板,个性定制支持复杂表格

使用uniapp框架全端通用的折叠面板&#xff0c;下载地址见文末 介绍 这是一个全端通用的折叠面板组件&#xff0c;可以折叠/展开的内容区域&#xff0c;支持复杂的表格形式展示&#xff0c;简单的设置即可实现&#xff0c;节省效率必备。 插件含全部源码&#xff0c;可以给您…

Java初学篇——Java语言的发展,特性,基本配置

目录 ps&#xff1a; java的发展 java的特性 java技术体系平台 java的跨平台性 JDK 介绍 安装 Java程序的编译和运行 流程 程序基本框架 一些小知识 注释 常用的转义字符 需要注意的小问题 ps&#xff1a; java算是我第二门系统学习的语言&#xff0c;同时也是我以…

【神经网络】tensorflow实验7--回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法 ②掌握多元线性回归模型的实现方法 ③掌握三维数据可视化方法 2. 实验内容 ①使用TensorFlow建立一元线性回归模型&#xff0c;使用商品房销售数据训练模型&#xff0c;并使用训练好的模型预测房价 ②使用TensorFlow建立多元线…

SpringBoot 集成 FastDFS(附安装教程)

1、FastDFS 简介 FastDFS是用 c 语言编写的一款开源的分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文件访问&#xff08;文件上传、文件下载&#xff09;等&#xff0c;解决了大容量存储和负载均衡的问题。特别适合以文件…

Bindiff工具使用-[GDOUCTF 2023]L!s!

目录 题目&#xff1a; 学到的点&#xff1a; 题目&#xff1a; 打了GDOUCTF的比赛&#xff08;被暴打了hhh)&#xff0c;学到很多新东西,这里总结一下 Diff的文件是ida数据库文件&#xff0c;选择i64或者idb文件进行Diff 打开附件&#xff0c;有两个文件&#xff0c;一个…

【Git 入门教程】第二节、Git基础使用

Git是一个分布式版本控制系统&#xff0c;它可以帮助开发者更好地管理和维护代码。在本文中&#xff0c;我们将介绍Git的最基本操作&#xff0c;如安装Git、初始化仓库、添加文件、提交代码、查看记录等。 一、Git安装 1.下载 要使用Git&#xff0c;首先需要在计算机上安装G…

JavaWeb开发 —— 登录认证校验和异常处理

在 JavaWeb开发 —— SpringBootWeb综合案例 中我们通过实例部门管理以及员工管理中的详细操作。而这篇文章我们将会通过综合实例学习登录认证、登录校验以及异常处理的了解和掌握。 目录 一、基本登录功能 二、登录校验 1. 会话技术 1.1 客户端会话跟踪技术Cookie 1.2 …

iview render函数(vue render函数)

iview 的render函数就是vue的render函数&#xff0c;iview常用在表格里面自定义内容&#xff0c;下面来看render函数常用的配置&#xff1a; 1、 h是createdElement的简写&#xff0c;有3个参数&#xff1a; 语法&#xff1a;render:(h,params)>{} render:(h,params) >…