自动化测试实践:揭秘WebSocket在接口测试中的应用

如何写接口自动化?这个问题,但凡涉足过自动化测试的人员都能娓娓道来。Requests、urlib、jmeter、curl等等,不在话下。那么,如何获取接口的url、参数、响应等信息呢?!答案就更是随口而出:看接口文档、swagger/apifox等管理工具接口定义。再不济,如果是web应用,通过浏览器看接口请求啊。的确如此,有“一万”种方法可以帮助我们获取到想要的接口信息。

可是,接口文档和接口定义/说明的有无,往往取决于开发人员的自觉性。我们虽然能够要求,但也不能百分百确定一定能够获得。因此,通过浏览器等工具获取请求接口就成了我们常用的手段。

我们以访问“51testing”网站为例,简单说明浏览器获取接口请求的常见方式。

如下图1所示,为访问51testing网站首页时的浏览器面板截图。通过network>Fetch/XHR就能获得http请求的url、status、response等信息。在我们编写自动化测试用例时,这是常用且熟知的获取接口请求信息的方法。

图1访问51testing首页的浏览器network面板信息

但是,上述寻找接口路径/方法,是完全可行的吗?

让我们以下图2为例。图2为51testing客服对话窗口,当我们想模拟自动化测试,获取发送请求的接口信息时,却发现唯一一个通过Fetch/XHR获得的接口(https://chat2445.talk99.cn/chat/msg.dll cmd=xx)请求体Payload和响应体Response中,没有任何与窗口对话中发送的内容(“测试”)有关的信息。那么,这条信息,是如何发送出去的呢?!

图2 51testing客服对话窗口

继续对话,查看Fetch/XHR,仍无任何接口请求。直到……在WS条目中发现了真相。原来,是websocket啊;果然,是websocket啊!

图3 51testing客服对话窗口

那么,什么是websocket呢?又为何要用websocket呢?

WebSocket是一种在Web应用程序中提供双向通信的协议。它允许在客户端和服务器之间创建持久性的连接,从而使得数据能够以低延迟和高效率进行双向传输。一些常见应用场景包括:1)即时通讯应用程序:像聊天应用、在线游戏等需要实时双向通信的应用场景中,WebSocket能够提供更好的性能和用户体验;2)实时数据更新:像股票市场、天气预报、实时地图等需要实时数据更新的应用中,WebSocket可以用来推送实时数据给客户端,而不需要客户端不断地发起请求;3)在线协作工具:像GoogleDocs、Trello等在线协作工具可以使用WebSocket来实现多用户实时编辑、更新等功能;4)实时游戏:在线多人游戏需要实时的玩家位置、动作等信息同步,WebSocket可以帮助实现这些功能。显而易见,客服对话窗属于第1种。

那么,websocket的url、请求内容和响应如何在浏览器中获取呢?!

如下图4所示,可以点击ws的链接,通过Request URL得到的url,再通过Messges获得发送的请求(All下拉列表选择“send”)和收到的响应(All下拉列表选择“receive”)。

图4 websocket的url、请求和响应等查看方式

如此,我们知道了,我们一些“看不见”的接口是如何发送请求的了。但是问题又来了:知道了websocket的请求方式,如何使用自动化脚本方式模拟呢?

我们以python为例,使用websocket库,模拟websocket请求,发送聊天信息。代码样例如下所示:

import websocket

import json

def on_message(ws,message):

print(f"Received message:{message}")

def on_error(ws,error):

print(f"Error occurred:{error}")

def on_close(ws):

print("Connection closed")

def on_open(ws):

print("Connection established")

#发送消息

message={

"c":20001818,

"u":"e6054702278504214c792f583376d5ab",

"v":"6817201c3614948f68de93ab151e53e5",

"role":2,

"meeting":False,

"cId":876105175,

"site":0,

"g":10063915,

"winId":"b6f2f684f577413abb2ab166433b060e",

"flag":False,

"robot":False,

"msg":"你好"

}

ws.send(json.dumps(message))

if__name__=="__main__":

websocket.enableTrace(True)

ws=websocket.WebSocketApp("wss://chat2445.talk99.cn/chat/room/20001818/876105175/b6f2f684f577413abb2ab166433b060e",

on_message=on_message,

on_error=on_error,

on_close=on_close)

ws.on_open=on_open

ws.run_forever()

至此,我们简单总结一下。浏览器开发者工具功能十分强大,除了我们熟知的http请求,还可以捕获websocket请求。然后,我们可以通过得到的请求信息,使用Python或其他开发语言帮助我们完成相关的接口测试。由此,完成我们“看不见”的接口自动化测试。

文末了:

可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。同时我邀请你进入我们的软件测试学习交流平台,大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,了解测试行业的最新趋势,助你快速进阶Python自动化测试/测试开发,稳住当前职位同时走向高薪之路。

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

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

相关文章

ts: 映射类型

映射类型会携带接口的可选和只读属性 interface User { name: string; age?: number; readonly email: string; } interface User { name: string; age?: number; readonly email: string; } type change<T> {[P in keyof T]: T[P] } type obj change<…

深入学习 torch.distributions

0. 引言 前几天分几篇博文精细地讲述了《von Mises-Fisher 分布》, 以及相应的 PyTorch 实现《von Mises-Fisher Distribution (代码解析)》, 其中以 Uniform 分布为例简要介绍了 torch.distributions 包的用法. 本以为已经可以了, 但这两天看到论文 The Power Spherical dist…

microk8s 报错tls: failed to verify certificate: x509:

问题&#xff1a; ssh命令出现如下图所示 输入任何microk8s的容器命令几乎都是x509报错 kubectl get pods -ALL 原因&#xff1a; 证书过期 相关文档&#xff1a; MicroK8s - 服务和端口 Microk8S v1.24 - refresh-certs 似乎无法刷新证书 问题 #3241 规范/microk8s Git…

【Linux系统】--- Linux内核日志等级详解

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Linux系统】--- Linux内核日志等级详解…

Linux开放防火墙端口

1、防火墙开放3306端口 firewall-cmd --zonepublic --add-port3306/tcp --permanent2、关闭防火墙 service iptables stop3、开启防火墙 service iptables start4、开机不自启防火墙 chkconfig --del iptables5、重启防火墙 chkconfig iptables on或者 firewall-cmd --re…

yuv420转yuv422使用neno加速的示例代码

一、使用none实现yuv420快速转换为yuv422 #include <arm_neon.h> static vs_int32_t yuv420_yuv422_conver(vs_uint8_t *p_yuv420_y, vs_uint8_t *p_yuv420_uv, vs_uint32_t yuv420_y_stride, vs_uint32_t yuv420_uv_stride, vs_int32_t width, vs_int32_t height, vs_…

HarmonyOS SDK助力中国建设银行探索金融领域创新场景

今年年初&#xff0c;中国建设银行&#xff08;以下简称建行&#xff09;手机银行首批适配HarmonyOS NEXT&#xff0c;并高效实现其应用的核心功能迁移。同时&#xff0c;建行手机银行在HarmonyOS SDK的加持下&#xff0c;充分发挥鸿蒙原生应用在原生智能方面的优势&#xff0c…

小白跟做江科大32单片机之LED流水灯

1.复制下面地址新建的工程&#xff0c;改名为3-2 LED流水灯 小白跟做江科大32单片机之LED闪烁-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139295351?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2213929…

python学习:python做一个用户管理系统操作mysql

今天继续学习python&#xff0c;操作mysql数据库 AI搜索&#xff1a;python做一个用户管理系统mysql 以下是过程和结果&#xff1a; import mysql.connector from mysql.connector import Error import time def connect_to_database():try:conn mysql.connector.connect(h…

Opencv图像处理技术(图像轮廓)

1图像轮廓概念&#xff1a; 图像轮廓是指图像中连续的像素边界&#xff0c;这些边界通常代表了图像中的物体或者物体的边缘。在数字图像处理中&#xff0c;轮廓是由相同像素值组成的曲线&#xff0c;它们连接相同的颜色或灰度值&#xff0c;并且具有连续性。轮廓可以用来描述和…

Java对文件的操作

文件测试 批量对文件直接增加指定后缀(原有后缀变文件名的一部分) import java.io.File;// 批量对文件直接增加指定后缀(原有后缀变文件名的一部分) public class AddFileExt {public static void main(String[] args) {String fileDir "D:\\xxx\\xxx\\xxx";Strin…

CAD石墨烯生成器 V1.0 渊鱼

插件介绍 CAD石墨烯生成器插件可用于在AutoCAD软件内参数化建立石墨烯几何模型。插件建立石墨烯的球棍模型&#xff0c;可控制模型的尺寸、碳原子环的尺寸、原子直径、化学键直径&#xff0c;并可控制模型的起伏形态。插件生成的实体模型可进行修改或绘图渲染&#xff0c;用于…

做视频号小店和达人对接的好,爆单少不了!

大家好&#xff0c;我是喷火龙。 目前&#xff0c;视频号是没有什么自然流量的&#xff0c;所以&#xff0c;想要出单、爆单的话&#xff0c;靠达人带货的方式才是最可靠的&#xff0c;靠达人带货是肯定要对接达人&#xff0c;并和达人沟通带货的。 下面给大家讲一讲应该怎么…

python Z-score标准化

python Z-score标准化 Zscore标准化sklearn库实现Z-score标准化手动实现Z-score标准化 Zscore标准化 Z-score标准化&#xff08;也称为标准差标准化&#xff09;是一种常见的数据标准化方法&#xff0c;它将数据集中的每个特征的值转换为一个新的尺度&#xff0c;使得转化后的…

关于EasyExcel导入数据时表格日期格式识别为数字问题

参考官方地址 自定义日期转字符串转换器 /*** 自定义excel日期转换器** author li* date 2024-05-29*/ public class CustomStringDateConverter implements Converter<String> {Overridepublic Class<?> supportJavaTypeKey() {return String.class;}Overridep…

SQL常用语句(三)-- Now()返回当前本地日期和时间的日期/时间函数,以及时间的加减

#获取当前时间&#xff1a; SELECT NOW() AS newTime; #2019-05-20 14:28:41 #当前时间减30秒&#xff1a; SELECT (NOW() - INTERVAL 30 SECOND) AS newTime; #2019-05-20 14:29:31 #当前时间加30秒&#xff1a; SELECT (NOW() INTERVAL 30 SECOND) AS newTime; …

三十五岁零基础转行成为AI大模型开发者怎么样呢?

以下从3个方面帮大家分析&#xff1a; 35岁转行会不会太晚&#xff1f;零基础学习AI大模型开发能不能学会&#xff1f;AI大模型开发行业前景如何&#xff0c;学完后能不能找到好工作&#xff1f; 一、35岁转行会不会太晚&#xff1f; 35岁正处于人生的黄金时期&#xff0c;拥…

今日选题.

诱导读者点开文章的9引真经&#xff08;二&#xff09; 标题重要么&#xff1f;新媒体、博客文通常在手机上阅读。首先所有的内容不同于纸媒&#xff0c;手机只展现标题&#xff0c;而内容都是折叠。其次读者能像看内容一样看4、5条或者7、8条标题&#xff08;区别于不同的主流…

如何在Web页面中集成AI图像识别功能

前言 在信息时代&#xff0c;Web 页面成为我们与世界交互的重要窗口。AI 技术的迅猛发展&#xff0c;特别是图像识别技术&#xff0c;为 Web 页面带来了革命性的变化。通过在 Web 页面上实现图像识别&#xff0c;我们即将迈入一个更加智能与便捷的时代。这种技术不仅使网页能够…

2024广东省赛 C.DFS序

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 #define ll long long const int maxn 1e6 5, inf 1e9, maxm 4e4 …