01、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的使用场景:
社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等 需要高实时的场景
02、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":"消息内容"} |
01、抓包查看,熟悉接口业务
1、访问项目首页,打开浏览器的开发者工具,选择Network-->WS
2、点击页面上websocket案例的开始练习,抓包看到以下数据
绿色箭头表示浏览器向服务器发送的数据,红色箭头表示服务器返回的数据
本次请求是的业务是打开聊天窗口后,匹配一个后台的客服老师
请求参数:
-
type为match表示这是个匹配类型的动作
-
from表示客户id
-
to表示该请求发送给谁
-
system为服务器系统
{
"type":"match",
"from":"发送者",
"to":"system"
}
服务器返回数据:
code是业务状态码,0表示成功
from表示该数据是谁发来的,system表示是系统发来的
msg表示系统为客户匹配到的老师id
msgId表示的是消息id
timestamp当前时间戳
to表示该数据是发给谁的,发给客户admin的
type表示请求类型,match表示这个匹配请求
{
"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是发给客服老师具体的信息
{
"type":"normal",
"from":"admin",
"to":"cf2137234f3943e3898df8fcd14f099a__mtx",
"msg":"你好"
}
第2步:对应图中的数字2,服务器将消息推送给客服老师成功后,把成功的信息发送给客户,其中核心字段msg为push success表示推送成功,type为receipt表示服务器返回的
{
"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是发给客服具体的信息
{
"code":"0",
"from":"cf2137234f3943e3898df8fcd14f099a__mtx",
"msg":"同学,你好,非常高兴为你服务,有什么需要我帮忙的呢?",
"msgId":"8486956c-e804-42b9-bb9b-d1574f1ca23f",
"timestamp":"1665631228807",
"to":"admin",
"type":"normal"
}
02、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
# !/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(json.dumps(params))
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"]}')
学习安排上!
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走
面试资料
我们学习软件测试必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
上面是我整理的配套资源,这些资源对于软件测试的的朋友来说应该是最全面最完整的备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。