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 jsonimport pytestfrom api.websoket_api.imserver_api import ImServerApiclass 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"]}')

pytest+websocket自动化集成实践相关推荐

  1. Android 持续集成实践(三)——编写 .gitlab-ci.yml 实现自动化

    文章目录 前言 系列文章 Android 持续集成实践(三)--编写 .gitlab-ci.yml 实现自动化 要实现的效果 定义 gitlab-ci 工作场景阶段 定义 build 任务 定义 re ...

  2. 基于Armitage的MSF自动化集成攻击实践

    基于Armitage的MSF自动化集成攻击实践 目录 0x01 实践环境 0x02 预备知识 0x03 Armitage基础配置 0x04 Nmap:Armitage下信息搜集与漏洞扫描 0x05 A ...

  3. 基于Jenkins的开发测试全流程持续集成实践

    今年上半年一直在公司实践CI,本文将上半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续下半年还会深入实践和引入Kuberne ...

  4. 达观数据超自动化机器人实践分享 | 达观数据产品总监邵万骏

    8月13日,由苏州市金融科技协会指导,RPA中国主办,达观数据作为顶级联合主办的「第二届中国RPA+AI开发者大赛」在苏州观园流苏酒店圆满落幕.达观数据产品总监邵万骏作为特邀嘉宾,在会上做主题演讲&l ...

  5. Android 持续集成实践(二)——配置 Docker + gitlab-runner 实现线上自动编译

    文章目录 前言 系列文章 Android 持续集成实践(二)--配置 Docker + gitlab-runner 实现线上自动编译 安装 Docker 安装 gitlab-runner 安装 注册 ...

  6. python+requests+pytest 接口自动化框架(一)

    目录 一.Pytest详解以及常用的插件安装 二.Pytest默认的测试用例的规则 三.Pytest用例运行方式以及参数 1.命令行模式运行 命令:pytes 2.主函数模式运行 3.基于pytest ...

  7. Android 持续集成实践(四)——配置 WebHook 通知编译结果

    文章目录 前言 系列文章 Android 持续集成实践(四)--配置 WebHook 通知编译结果 团队沟通工具 创建团队 创建讨论组 添加 BearyChat 机器人 配置 WebHook gitl ...

  8. 游戏陪玩系统源码,陪玩APP开发系统自动化代码实践

    android端游戏陪玩系统源码主流的Butternife ,Dragger2等很好的实现了AOP的编程理念. 在陪玩APP开发中我们利用这种思想将陪玩间很多的共有逻辑变为不可见,不需要开发人员去关注 ...

  9. 最全最新pytest接口自动化框架

    pytest接口自动化框架介绍: Python+pytest+allure+log+yaml(默认数据和动态传参)+数据驱动+关键字驱动+pymysql(数据清理尽量接口清理)+一键切换环境+多角色随 ...

最新文章

  1. PHP 毫秒级定时器,实现php毫秒定时器方法详解
  2. 分享 10 道 Nodejs 进程相关面试题
  3. P2P中DHT网络原理
  4. ACDream - Dynamic Inversions II
  5. 丢瓶盖(洛谷-P1316)
  6. 云贝连锁V2独立版V2.1.5源码-优化扫码登陆流程
  7. 记一次YY笔试中卡住得知识点
  8. 软件工程网络15个人阅读作业1 (201521123107)
  9. (19)ISE14.7软件生成bit失败永久解决方法(FPGA不积跬步101)
  10. Activity实现 高亮显示活动节点,和所有已完成过的节点
  11. python 国产_再体验国产最好的Python IDE之NovalIDE
  12. 天思经理人ERP日化行业应用方案
  13. matlab qam信号仿真,基于Matlab/Simulink的QAM通信系统的仿真
  14. 光栅(Raster)性能优化
  15. 解决oracle分布式锁,oracle DLM分布式锁技术
  16. 如何让生活充满充实感
  17. 支持全球游戏加速 飞鱼星发烧级玩家路由G7上市
  18. netlogon 服务未启动
  19. 每天一个开发小技巧~
  20. 文档操作---添加页码、编辑页脚

热门文章

  1. 服务器远程端口怎么修改
  2. 阿里云HPC助力新制造 | 上汽仿真计算云SSCC 1
  3. 麻将通用胡牌算法详解(拆解法)
  4. 证考网:一建与二建的具体区别是什么?
  5. 鲁珀特之泪(由来,原理以及特点)
  6. 【转载】CSDN修改用户名、昵称
  7. HTML中的文本标签及样式
  8. 编译 Facebook SDK for Unity
  9. app上架被拒的各种原因
  10. 托福听力考试与大学英语六级听力考试的对比浅析|8:15~8:50