Django+vue自动化测试平台(27)-- 封装websocket测试

news2024/11/15 6:56:01

websocket概述:

WebSocket 是一种在单个 TCP 连接上进行全双工通信(Full Duplex 是通讯传输的一个术语。通信允许数 据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进 行信号的双向传输( A→B 且 B→A )。指 A→B 的同时 B→A,是瞬时同步的)的协议。

WebSocket 通信协议于 2011 年被 IETF 定为标准 RFC 6455,并由 RFC7936 补充规范。WebSocket API (WebSocket API 是一个使用WebSocket 协议的接口,通过它来建立全双工通道来收发消息) 也被 W3C 定为标准。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。

而 HTTP 协议就不支持持久连接,虽然在 HTTP1.1 中进行了改进,使得有一个 keep-alive,在一个 HTTP 连接中,可以发送多个 Request,接收多个 Response。

但是在 HTTP 中 Request = Response 永远是成立的,也就是说一个 request 只能有一个response。而且 这个response也是被动的,不能主动发起。

websocket 常用于社交/订阅、多玩家游戏、协同办公/编辑、股市基金报价、体育实况播放、音视频聊 天/视频会议/在线教育、智能家居与基于位置的应用。

websocket 接口不能使用 requests 直接进行接口的调用,可以依赖第三方库的方式来实现调用,以下内 容介绍如何调用第三方库实现 websocket 的接口自动化测试。

实战效果预览:

在这里插入图片描述

后端逻辑实现(前端就不展示了,各有各的想法):

# -*-coding: gbk-*-
import io
import json
import socket
from datetime import datetime
from uuid import uuid4
from django.http import JsonResponse
import websocket
import threading
from django.views import View

# 定义一个dict字典,用来存储websocket的连接对象
websocket_info = {}


# 主类,使用的django的视图类,将其视为http对象
class WebSocketTestView(View):
    def create_websocket(self, request):
        try:
            data = json.loads(request.body)
            # 生成websocket唯一标识
            uuid = str(uuid4())

            def on_data(ws, frame_data, frame_opcode, frame_fin):
                # WebSocketApp方法的on_data,没用上,做着玩
                print("frame_data:", frame_data)
                print("frame_opcode:", frame_opcode)
                print("frame_fin:", frame_fin)

            # 初始化 WebSocket 连接及相关回调
            def on_message(ws, message):
                websocket_info[uuid]['history'].append({"message": message, "type": 2,
                                                        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})

            # 异常函数回调
            def on_error(ws, error):
                websocket_info[uuid]["history"].append({"message": error, "type": 2,
                                                        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})

            # websocket连接关闭回调
            def on_close(ws, close_status_code, close_message):
                websocket_info.pop(uuid, None)

            # 建立连接回调
            def on_open(ws):
                try:
                    websocket_info[uuid]['status'] = True
                except Exception as e:
                    print(e)
                    websocket_info[uuid]['status'] = False

            # websocket.WebSocketApp建立连接
            # params是url的传参,我用的是params=[{"key": "value"}, {"key": "value"}]
            # headers是websocket中传的请求头
            ws = websocket.WebSocketApp(f"{data['url']}?"
                                        f"{'&'.join([f'{k}={v}' for param in data['params'] for k, v in param.items()])}",
                                        on_open=on_open,
                                        on_message=on_message,
                                        on_error=on_error,
                                        on_close=on_close,
                                        on_data=on_data,
                                        header=data["headers"])

            websocket_info[uuid] = {
                'ws': ws,
                "status": False,
                "history": [],
            }
            # 启动多线程进行websocket的长久连接
            thread = threading.Thread(target=ws.run_forever)
            thread.start()
            on_open(ws)

            if websocket_info[uuid]['status']:
                websocket_info[uuid]["history"].append(
                    {'uuid': uuid, "message": "websocket Connecting", "type": 2, "code": 200,
                     "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
                return JsonResponse({'uuid': uuid, "message": "websocket Connecting", "type": 2, "code": 200,
                                     "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
            else:
                websocket_info[uuid]["history"].append(
                    {"message": "disconnected", "type": 2, "code": 100,
                     "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
                return JsonResponse({"message": "disconnected", "type": 2, "code": 100,
                                     "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
        except Exception as e:
            return JsonResponse({'Exception': e, "message": "disconnected", "type": 2, "code": 100,
                                 "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})

    # 发送websocket信息
    def send_message(self, request):
        try:
            data = json.loads(request.body)
            uuid = data["uuid"]
            if uuid in websocket_info:
                if data["type"] == 1:
                    websocket_info[uuid]['ws'].send(data["message"])
                elif data["type"] == 2:
                    websocket_info[uuid]['ws'].send(json.dumps(data["message"]))
                websocket_info[uuid]["history"].append({"message": str(data["message"]), "type": 1,
                                                        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
                return JsonResponse({'message': f'Message sent: {str(data["message"])}', "code": 200,
                                     "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
            else:
                return JsonResponse({'message': 'WebSocket 不存在', "code": 100,
                                     "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
        except Exception as e:
            return JsonResponse({f'message': {str(e)}, "code": 100,
                                 "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})

    # 获取服务端返回的消息
    def get_response(self, request):
        data = json.loads(request.body)
        uuid = data["uuid"]
        if uuid in websocket_info and websocket_info[uuid]['history']:
            return JsonResponse({'response': websocket_info[uuid]['history'][::-1], "code": 200,
                                 "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})
        else:
            return JsonResponse({'error': '未查询到结果', "code": 100,
                                 "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")})

    # 主动断开websocket的连接
    def disconnect_websocket(self, request):
        data = json.loads(request.body)
        uuid = data["uuid"]
        if uuid in websocket_info:
            websocket_info[uuid]['ws'].close()
            websocket_info.pop(uuid, None)
            return JsonResponse({'message': 'WebSocket 已断开连接', "code": 200})
        else:
            return JsonResponse({'message': 'WebSocket 不存在', "code": 100})

总结

1 . websocket.WebSocketApp没有定义返回连接状态的函数结果,只能自己根据实际来做判断
2. 以上代码完成了对websocket测试的基本封装,个人愚见,仅供参考。
3. 更多好的内容,尽在个人主页,欢迎沟通交流!!!!

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

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

相关文章

Linux第四节课(指令与权限)

1、date指令(时间) 程序运行到自己的每一个关键时刻,都要自己打日志! 日志包括时间、日志等级、日志具体信息、其他信息等,然后按照行为单位写入文件中,这个文件被称为日志文件! 在日志文件中筛选信息时&#xff0c…

idea springBoot启动时覆盖apollo配置中心的参数

vm options -Dorder.stat.corn“0/1 * * * * ?” 只有vm options, -D参数才能覆盖apollo参数 program arguments –key01val01 --key02val02 environment varibales envFAT;key02val02;key03val03

视觉巡线小车——STM32+OpenMV(四)

目录 前言 一、整体控制思路 二、代码实现 1.主函数 2.定时器回调函数 总结 前言 通过以上三篇文章已将基本条件实现,本文将结合以上内容,进行综合控制,实现小车的视觉巡线功能。 系列文章请查看:视觉巡线小车——STM32OpenMV系列…

BUUCTF [WUSTCTF2020]朴实无华

首先进来不知道要干啥,上dirsearch扫出个机器人协议,一看有点东西 直接访问很明显这不是flag 主页面看他说什么不能修改头部,看一下数据包 发现了好东西 看到源码,又得绕过了。不过这编码有点问题导致乱码了 找个在线网站稍微恢复…

QtQuick-第一个程序

新建Qt Quick Application。 main.cpp(保持原有的即可): #include <QGuiApplication> #include <QQmlApplicationEngine>int main (int argc, char *argv[]) {QGuiApplication app (argc, argv);QQmlApplicationEngine engine;const QUrl url (QStringLiteral (&…

南平建网站公司推荐 好用的b2b独立站模板

床品毛巾wordpress独立站模板 床单、被套、毛巾、抱枕、靠垫、围巾、布艺、枕头、乳胶枕、四件套、浴巾wordpress网站模板。 https://www.jianzhanpress.com/?p4065 打印耗材wordpress自建独立站模板 色带、墨盒、碳粉、打印纸、硒鼓、墨盒、墨水、3D打印机、喷头wordpress…

基于 Apache 的 httpd 文件服务器

基于 Apache 的 httpd 文件服务器 文件服务器的简介 httpd&#xff08;HTTP Daemon&#xff0c;超文本传输协议守护进程的简称&#xff09;&#xff0c;运行于网页服务器后台&#xff0c;等待传入服务器请求的软件。 httpd 能够自动回应服务器的请求&#xff0c;并使用 http…

<PLC><Python>使用python与汇川PLC基于socket通讯程序:传感器数据传送与监控

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…

一文读懂英伟达A800的性能及应用场景

随着人工智能&#xff08;AI&#xff09;和高性能计算&#xff08;HPC&#xff09;领域的快速发展&#xff0c;对处理器的性能要求日益提高。英伟达&#xff08;NVIDIA&#xff09;作为全球领先的图形处理器&#xff08;GPU&#xff09;和人工智能技术公司&#xff0c;不断推出…

【C++】C++类和对象详解(上)

目录 思维导图大纲&#xff1a; 思维方面&#xff1a; 1. 类的定义&#xff1a; 2. 类的特点&#xff1a; 3. this指针&#xff1a; 4. 类的默认成员函数 默认构造函数 1.构造函数 2.析构函数 3.拷贝构造函数 4. 赋值运算符重载 1. 运算符重载 5. 日期类实现&#…

abc363+cf960div.2+牛客周赛49轮

C - Avoid K Palindrome 2 (atcoder.jp) 思路&#xff1a; 罗列出排列的每一种情况&#xff0c;再根据题目要求进行判断 代码&#xff1a; void solve() {ll n, k;cin >> n >> k;string s;vector<char>a;cin >> s;for (int i 0; i < n; i)a.pus…

在Windows安装、部署Tomcat的方法

本文介绍在Windows操作系统中&#xff0c;下载、配置Tomcat的方法。 Tomcat是一个开源的Servlet容器&#xff0c;由Apache软件基金会的Jakarta项目开发和维护&#xff1b;其提供了执行Servlet和Java Server Pages&#xff08;JSP&#xff09;所需的所有功能。其中&#xff0c;S…

hcip报名费用多少?该如何备考hcip?

现在很多行业都比较萧条&#xff0c;但是有个行业正是热门的时候&#xff0c;那就是网络领域&#xff0c;那么想进入这个领域&#xff0c;肯定知道hcip是什么&#xff0c;那么小编就针对几个常常被问到两个话题&#xff0c;hcip报名费用多少?该如何备考hcip?给大家好好聊聊其…

JavaScript进阶之深入面向对象

目录 深入面向对象一、编程思想1.1 面向过程1.2 面向对象&#xff08;oop&#xff09; 二、构造函数三、原型3.1 原型3.2 constructor属性3.3 对象原型3.4 原型继承3.5 原型链 深入面向对象 一、编程思想 1.1 面向过程 面向过程是分析解决问题所需要的步骤&#xff0c;用函数…

Python爬虫实战 | 爬取携程网景区评论|美食推荐|景点列表数据

本文采用Selenium库爬取携程网的景区评论。 携程接口接入 Selenium介绍 Selenium是一个Web的自动化测试工具&#xff0c;可以按指定的命令自动操作&#xff0c;如让浏览器加载页面、获取数据、页面截屏等。Selenium本身不自带浏览器&#xff0c;需要与第三方浏览器结合才能使…

Mysql高价语句

一.高级语法的查询语句 1.排序语法&#xff08;默认的排序方式就是升序&#xff09;。 升序ASC&#xff1a;select * from test01 order by name; 降序DESC&#xff1a;select * from test01 order by name desc; 多个列排序&#xff1a;以多个列作为排序&#xff0c;只有第一…

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…

【Python】爬虫实战02:电影市场票房情况分析与可视化

1. 前言 在信息爆炸的时代&#xff0c;数据分析已成为各行各业的重要工具。特别是在电影行业&#xff0c;票房数据不仅反映了电影的市场表现&#xff0c;也是电影产业健康发展的关键指标。为了更好地理解和分析中国大陆电影市场的票房情况&#xff0c;本代码提供了一个自动化数…

【Linux/Windows】Wireshark抓包工具下载、安装、使用、数据分析、常用知识点

文章目录 Linux版下载Windows版下载Wireshark使用Wireshark测试Tcp三次握手Wireshark常见过滤条件本篇小结 更多相关内容可查看 在一个阳光明媚的周五清晨&#xff0c;一起快乐的玩耍一下Wireshark Linux版下载 1.使用yum安装wireshark yum -y install wireshark2.使用yum安…

全网最简单的Mysql 8.3 安装及环境配置教程

Windows系统计算机环境配置 第一篇关于环境配置的文档之MySQL 8.3&#xff08;msi版本和zip版本略有不同&#xff0c;本文档介绍msi版本&#xff0c;若zip版本有需求&#xff0c;请在评论区留言&#xff0c;我后续会出相关文档。&#xff09; 前言 网上的MySQL配置教程非常多…