websocket接口自动化集成pytest测试框架

发表于:2022-11-08 09:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:AlamZ    来源:博客园

  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/
  抓包查看,熟悉接口业务
  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"
  }
  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()       
         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"]}')
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号