websocket接口自动化集成pytest测试框架
websocket协议
1、介绍
WebSocket是一种在单个TCP通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
2、原理

3、与http协议的比较
相同之处:
-
都是基于TCP的应用层协议;
-
都使用Request/Response模型进行连接的建立;
-
在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码;
-
都可以在网络中传输数据。
不同之处:
-
WS使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用;
-
WS的连接不能通过中间人来转发,它必须是一个直接连接;
-
WS连接建立之后,通信双方都可以在任何时刻向另一方发送数据;
-
WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息;
-
WS的数据帧有序。
4、websocket应用场景
websocket的使用场景:
社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等 需要高实时的场景
websocket接口测试实战
以码同学全栈接口项目中的websocket接口为例,项目地址 http://**.***.**.**:****/pinter/
接口名称 | 接口类型 | URL | 参数 |
匹配接口 |
websocket |
/pinter/imserver/用户id |
{"type":"match","from":"发送者","to":"system"} |
发送聊天消息接口 |
websocket |
/pinter/imserver/用户id |
{"msgId":"消息id","type":"normal","from":"发送者","to":"老师id","msg":"消息内容"} |
抓包查看,熟悉接口业务
1、访问项目首页,打开浏览器的开发者工具,选择Network-->WS
2、点击页面上websocket案例的开始练习,抓包看到以下数据
绿色箭头表示浏览器向服务器发送的数据,红色箭头表示服务器返回的数据
本次请求是的业务是打开聊天窗口后,匹配一个后台的客服老师
请求参数:
-
type为match表示这是个匹配类型的动作
-
from表示客户id
-
to表示该请求发送给谁
-
system为服务器系统
1 2 3 4 5 6 7 8 9 | { "type" : "match" , "from" : "发送者" , "to" : "system" } |
服务器返回数据:
-
code是业务状态码,0表示成功
-
from表示该数据是谁发来的,system表示是系统发来的
-
msg表示系统为客户匹配到的老师id
-
msgId表示的是消息id
-
timestamp当前时间戳
-
to表示该数据是发给谁的,发给客户admin的
-
type表示请求类型,match表示这个匹配请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "code" : "0" , "from" : "system" , "msg" : "cf2137234f3943e3898df8fcd14f099a__mtx" , "msgId" : "4c7ff9b3-ce6b-4891-8c14-41e0f45e0bd0" , "timestamp" : "1665630374482" , "to" : "admin" , "type" : "match" } |
3、聊天窗口发送聊天信息,抓包查看
第1步:对应数字图中的数字1,发送数据到服务器,服务器会根据信息进行推送,将数据发给指定的客服老师
-
type表示请求类型,normal是正常聊天消息的意思
-
from表示这个数据是从谁发来的,从客户admin发出来的
-
to表示这个是发给谁的,发给cf2137234f3943e3898df8fcd14f099a__mtx这个客服老师的
-
msg是发给客服老师具体的信息
1 2 3 4 5 6 7 8 9 10 | { "type" : "normal" , "from" : "admin" , "to" : "cf2137234f3943e3898df8fcd14f099a__mtx" , "msg" : "你好" } |
第2步:对应图中的数字2,服务器将消息推送给客服老师成功后,把成功的信息发送给客户,其中核心字段msg为push success表示推送成功,type为receipt表示服务器返回的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "code" : "0" , "from" : "system" , "msg" : "push success" , "msgId" : "130f4370-6b2b-4634-b3f1-59a9728eb8f1" , "timestamp" : "1665631227681" , "to" : "admin" , "type" : "receipt" } |
第3步:对应图中的数字3,客服老师在收到服务器推送给自己的客户消息后,返回给客户的信息,也是由服务器转发过来的,而并不是直接返回给客户的
-
type表示请求类型,normal是正常聊天消息的意思
-
from表示这个数据是从谁发来的,从客服老师cf2137234f3943e3898df8fcd14f099a__mtx发出来的
-
to表示这个是发给谁的,发给admin这个客户的
-
msg是发给客服具体的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "code" : "0" , "from" : "cf2137234f3943e3898df8fcd14f099a__mtx" , "msg" : "同学,你好,非常高兴为你服务,有什么需要我帮忙的呢?" , "msgId" : "8486956c-e804-42b9-bb9b-d1574f1ca23f" , "timestamp" : "1665631228807" , "to" : "admin" , "type" : "normal" } |
python调用websocket接口
-
接口框架中适配websocket封装
1、封装底层websocket类
在config目录下创建一个websocket.yml的文件,写上如下内容:
在client.py中增加如下代码

2、封装websocket api层
在api包下创建websoket_api包,其下创建imserver_api.py ,写上如下代码
3、编写测试用例层
在testcases目录下创建websocketapi包,在其下创建test_websocket_api.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | # !/usr/bin python3 # encoding: utf-8 -*- # @file : test_websocket_api.py # @author : 沙陌 Matongxue_2 # @Time : 2022-10-19 16:07 # @Copyright: 北京码同学 import json import pytest from api.websoket_api.imserver_api import ImServerApi class TestImServerApi: kfid = '' # 定义客服id,全局变量作为各个测试用例的关联数据 def setup_class( self ): self .im = ImServerApi() # 创建一个websocket协议的接口对象 # 测试客服匹配 def test_match( self ): params = { "msgId" : "111" , "type" : "match" , "from" : "shamo" , "to" : "system" } self .im.send() res = self .im.recv() res = json.loads(res) # 将其转换成json对象 assert res[ 'code' ] = = '0' # 提取msg,msg是匹配到的客服id self .__class__.kfid = res[ 'msg' ] # 测试给客服发送正常消息 def test_message( self ): params = { "msgId" : "111" , "type" : "normal" , "from" : "admin" , "to" : f "{self.__class__.kfid}" , "msg" : "你好" } self .im.send(json.dumps(params)) res = self .im.recv() res = json.loads(res) # 将其转换成json对象 pytest.assume(res[ 'code' ] = = '0' ,f '期望值是0,实际结果是{res["code"]}' ) pytest.assume(res[ 'msg' ] = = 'push success' , f '期望值是0,实际结果是{res["msg"]}' ) # 再次接收客服发来的数据 res = self .im.recv() res = json.loads(res) # 将其转换成json对象 pytest.assume(res[ 'code' ] = = '0' ,f '期望值是0,实际结果是{res["code"]}' ) pytest.assume(res[ 'msg' ] = = '同学,你好,非常高兴为你服务,有什么需要我帮忙的呢?' , f '期望值是0,实际结果是{res["msg"]}' ) # 测试发送数据时消息是空的 def test_message_msgisnull( self ): params = { "msgId" : "111" , "type" : "normal" , "from" : "admin" , "to" : f "{self.kfid}" , "msg" : "" } self .im.send(json.dumps(params)) res = self .im.recv() res = json.loads(res) # 将其转换成json对象 # 断言系统推送消息时对于消息的判断 pytest.assume(res[ 'code' ] = = '1' ,f '期望值是1,实际结果是{res["code"]}' ) pytest.assume(res[ 'msg' ] = = '消息内容为空' , f '期望值是0,实际结果是{res["msg"]}' ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)