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

news2024/12/28 5:21:51

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,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

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

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

相关文章

【2020-10-26】JS逆向之同盾滑块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言总结前言 用官网的做个例子吧:https://sec.xiaodun.com/onlineExperience/slidingPuzzle?Rbdjj?sourcetongdun&keywordtongdun 简单分析下这个…

项目整体管理

项目整体管理 1.1 项目整体管理概述 1.项目整体管理知识领域包括识别、确定、结合、统一与协调各项目管理过程组内不同过程与项目管理活动所需进行的各种过程和活动。 2.“整体管理”的基本任务就是为了按照实施组织确定的程序实现项目目标,将项目管理过程组中需要…

CalBioreagents 艾美捷芽孢杆菌多克隆抗体说明书

艾美捷CalBioreagents 芽孢杆菌多克隆抗体英文说明: CATALOG NUMBER: P043 PRODUCT DESCRIPTION: Rabbit anti-Bacillus polyclonal antibody. IMMUNOGEN: Immunogen was prepared from a pool of purified spores from Bacillus subtilis and Bacillus cereus.…

一句话需求,让你去抄人家产品,你遇到了咋办

打工者联盟为了抵抗996、拖欠工资、黑心老板、恶心公司,让我们组成打工者联盟。客观评价自己任职过的公司情况,为其他求职者竖起一座引路的明灯。https://book.employleague.cn/话说:工地有个包工头,找来两个瓦匠要承包工程。 瓦…

ZooKeeper基础

一、概念 架构: Client/ServerEnsemble(集群,ZK服务器组),最小节点数为3ZK LeaderaZK Follower ZooKeeper数据模型 znode:用于存储数据,分为持久的(default)、临时的…

一次服务器非法重启后导致的故障排查记录

作者:JackTian 来源:公众号「杰哥的IT之旅」 ID:Jake_Internet 转载请联系授权(微信ID:Hc220088) 原文地址:一次服务器非法重启后导致的故障排查记录 大家好,我是杰哥。 前段时间遇…

贪婪算法(Huffman编码)

如果一个算法分阶段的工作,并且在每一个阶段都认为所做的决定是最好的,而不考虑将来的后果,这样的算法就叫做贪婪算法。贪婪算法只考虑当前局部的最优解,而不去考虑全局的情况,如果最终得到的结果是全局最优的&#xf…

麻雀优化CNN超参数用于回归MATLAB

在CNN模型的构建中,涉及到特别多的超参数,比如:学习率、训练次数、batchsize、各个卷积层的卷积核大小与卷积核数量(feature map数),全连接层的节点数等。直接选择的话,很难选到一组满意的参数&…

如何理解关系型数据库的常见设计范式?

目录理清基础概念实体属性元组分组函数依赖完全函数依赖部分函数依赖传递函数依赖码全码理解六范式第一范式(1NF)第二范式(2NF)第三范式(3NF)巴斯-科德范式(BCNF,Boyce-Codd Normal …

基于STM32的智能家居系统设计

目录 第1章 前言 1 1.1 课题研究的背景和实际意义 1 1.1.1课题背景 1 1.1.2实际意义 1 1.2国内外发展现状、存在问题以及前景 2 1.2.1发展现状 2 1.2.2存在问题 2 1.2.3发展前景 2 1.3 主要工作、内容安排及预期成果 3 1.3.1主要研究工作 3 1.3.2预期成果 3 第2章 总体设计方案…

安卓4.X版本ssl: sslv3 alert handshake failure 握手失败

低版本https握手失败错误查看接口的协议改写代码(网络访问采用原生的HttpsURLConnection)参考博文:https://www.cnblogs.com/lwbqqyumidi/p/12063489.htmlhttps://blog.csdn.net/qq_16117167/article/details/52621112错误 如图所示&#xf…

linux进程概念

目录 1、进程的基本概念 2、进程控制块 - PCB task_struct内容分类 3、查看进程 通过ps命令查看进程 通过proc查看进程 4、通过系统调用获取进程标示符 5、通过系统调用创建进程-fork初识 6、进程状态 操作系统进程状态 linux进程状态 僵尸进程 孤儿进程 僵尸进…

计算机网络-谢希仁-第7版 第1章 概述

计算机网络-谢希仁-第7版 第1章 概述1.011.021.031.071.081.091.101.111.121.131.141.161.171.181.191.201.211.221.241.251.26计算机网络谢希仁版(第七版)答案 1.01 计算机网络可以向用户提供哪些服务? 计算机网络使用户在计算机之间传送数…

【Linux】Linux下的编译器——gcc/g++

💬推荐一款模拟面试、刷题神器 、从基础到大厂面试题:👉点击跳转刷题网站进行注册学习 目录 一、编译的过程 1、预处理阶段 1.1预处理的工作——头文件展开、去注释、宏替换、条件编译 1.2外部定义宏(-D选项) 1.…

会话跟踪技术(Cookie、Session)

目录一、CookieCookie的基本使用发送Cookie获取CookieCookie原理Cookie使用细节二、SessionSession基本使用Session原理Session使用细节三、小结四、登录注册案例会话:用户打开浏览器,访问Web服务器的资源,会话建立,直到有一方断开…

数据结构之堆的应用

系列文章目录 数据结构之堆_crazy_xieyi的博客-CSDN博客 文章目录 前言一、Top-k问题 1.前K个最小数(第k个最小数) 2.前K个最大数(第K个最大数)二、堆排序 1.从小到大排序(建大根堆)2.从大到…

【2022研电赛】安谋科技企业命题一等奖:基于EAIDK-610的中国象棋机器人对弈系统

本文为2022年第十七届中国研究生电子设计竞赛安谋科技企业命题一等奖作品分享,参加极术社区的【有奖活动】分享2022研电赛作品扩大影响力,更有丰富电子礼品等你来领! 基于EAIDK-610的中国象棋机器人对弈系统 参赛单位:西安邮电大学…

硬件开发趋势与技术探索

LiveVideoStackCon 2022 音视频技术大会 北京站将于11月25日至26日在北京丽亭华苑酒店召开,本次大会将延续【音视频无限可能】的主题,邀请业内众多企业及专家学者,将他们在过去一年乃至更长时间里对音视频在更多领域和场景下应用的探索、在实…

2023届C/C++软件开发工程师校招面试常问知识点复盘Part 8

目录52、vector<string>是怎么存储的&#xff1f;53、epoll的底层原理53.1 对比select和poll53.2 ET和LT的工作模式54、进程、线程、协程的理解和他们的通信方式54.1 进程的含义54.2 线程的含义54.3 协程的含义54.4 进程间通信IPC54.5 线程间通信方式55、define宏定义的用…

【JavaDS】优先级队列(PriorityQueue),堆,Top-k问题

✨博客主页: 心荣~ ✨系列专栏:【Java实现数据结构】 ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录一. 堆1. 堆的概念2. 堆的存储方式3. 堆的创建4. 元素入堆5. 元素出堆6. 获取堆中元素二. 优先级堆列(PriorityQueue)1. 优先级队列2. PriorityQueue的特性3. 集合框架中P…