自动化测试框架搭建-单次接口执行-三部曲
目的
判断接口返回值和提前设置的预期是否一致,从而判断本次测试是否通过
代码步骤设计
第一步:前端调用后端已经写好的POST接口,并传递参数
第二步:后端接收到参数,组装并请求指定接口,保存返回
第三步:预期结果对比接口返回,一致返回测试通过,不一致返回接口本次测试的真实数据
代码实现思路
第一步
1、接口的请求的方式是post
2、前端以post形式提交参数信息
3、接口将单个参数信息读取放到后端代码的变量中
第二步
1、根据解析的后端变量填入接口调用的参数中
2、访问指定接口,保存接口返回的json数据
第三步
1、读取忽略字段,如果没有,对接口返回的json数据(json转化为字典数据类型)做全量校验
2、读取忽略字段,如果有,对接口返回的json数据(json转化为字典数据类型)做校验,遇见匹配的忽略字段跳过
3、返回对比结果
4、对比一致,返回接口测试通过
返回差异数据(为空)
5、对比不一致,接口测试不通过
返回差异数据(不为空)
代码实现
步骤一
1、接收post请求的参数
from flask import request
from flask_restful import Resourcefrom app.api.common.utils import res
from app.commen.resopDiff import resp_diff
from app.interfaces.interfaces import interfacesclass TestCase(Resource):def post(self):data = request.get_json()if not data:# 返回明确的错误信息,避免引用未定义的 result# 400 Bad Requestreturn res(message="请求数据为空", success=False, code=400)try:# 打印接收到的数据(调试用)# print("Received data:", data)# 提取必要字段(建议增加字段存在性校验)method = data.get('method')url = data.get('url')params = data.get('params', {}) # 默认空字典headers = data.get('headers', {}) # 默认空字典expected = data.get('expected') # 注意字段名拼写是否正确ignore_keys = data.get('ignore_keys', [])# 调用接口请求resp = interfaces.request(method=method,url=url,headers=headers,params=params)# 确保获取响应文本内容resp_text = resp.text# 调试输出响应内容# print("Response text:", resp_text)# 对比预期结果与实际响应# 假设 resp_diff 返回可序列化的字典(需确保实现正确)result = resp_diff(expected, resp_text, ignore_keys)# 构建返回结果if not result: # 等价于 result == {}return res(data=result, message="接口对比一致,测试通过!", success=True, code=200)else:return res(data=result, message="接口对比不一致,测试不通过!", success=True, code=200)except KeyError as e:# 处理字段缺失错误return res(message=f"请求数据缺少必要字段: {str(e)}", success=False, code=500)except Exception as e:# 捕获其他异常(如接口请求失败)return res(message=f"服务器内部错误: {str(e)}", success=False, code=500)
步骤二
2、resp_diff(预期结果与实际响应求差异值)
from deepdiff import DeepDiff
import json# 参数要求,需要对比的是json字符串,以及需要忽略的字段def resp_diff(expected, realResp, ignore_keys):"""比较两个 JSON 数据的差异,并忽略指定的键。:param expected: 第一个 JSON 数据(字符串或字典):param realResp: 第二个 JSON 数据(字符串或字典):param ignore_keys: 需要忽略的键的列表(例如 ["extra", "age"]):return: 返回比较结果的描述和差异(如果有)"""# 如果输入是字符串,将其解析为字典if isinstance(expected, str):dict1 = json.loads(expected)else:dict1 = expectedif isinstance(realResp, str):dict2 = json.loads(realResp)else:dict2 = realResp# 构造 exclude_paths 参数exclude_paths = {f"root['{key}']" for key in ignore_keys}# print(f"ignore_keys{ignore_keys}")# # 使用 DeepDiff 进行比对# print(f"dict1{dict1}")# print(f"dict2{dict2}")# print(f"exclude_paths:{exclude_paths}")diff = DeepDiff(dict2, dict1, exclude_paths=exclude_paths)# 返回比较结果,直接返回diff需要对diff做判断return rename_diff_keys(diff)def rename_diff_keys(diff_dict):"""递归遍历 DeepDiff 结果,将 new_value/old_value 替换为自定义名称"""if not isinstance(diff_dict, dict):return diff_dictrenamed = {}for key, value in diff_dict.items():# 直接替换字段名if key == "new_value":renamed["realResp"] = valueelif key == "old_value":renamed["expected"] = value# 递归处理嵌套结构elif isinstance(value, dict):renamed[key] = rename_diff_keys(value)elif isinstance(value, list):renamed[key] = [rename_diff_keys(item) if isinstance(item, dict) else item for item in value]else:renamed[key] = valuereturn renamed
3、在蓝图上注册接口,访问路径
api.add_resource(TestCase, '/interfaces/post1')
4、通过Postman传递参数测试效果
-
结果与预期一致

-
结果与预期不一致

相关文章:
自动化测试框架搭建-单次接口执行-三部曲
目的 判断接口返回值和提前设置的预期是否一致,从而判断本次测试是否通过 代码步骤设计 第一步:前端调用后端已经写好的POST接口,并传递参数 第二步:后端接收到参数,组装并请求指定接口,保存返回 第三…...
【阮一峰】2.数组
数组 简介 所有成员的类型必须相同,但是成员数量是不确定的。 由于成员数量可以动态变化,所以 TypeScript 不会对数组边界进行检查,越界访问数组并不会报错。 第一种写法: let arr: (number | string)[];第二种写法ÿ…...
DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)
前言 在当今数字化时代,AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型,凭借其出色的性能和开源免费的优势,成为许多开发者的首选。今天,就让我们一起探索如何将DeepSeek接入PyCharm,实现高效、智…...
【Java Card】Applet 使用Shareable进行数据分享以及部分问题处理
文章目录 前言一、定义接口二、server端实现三、client端实现四、遇到的问题 前言 在进行开发时,可能会将业务放到不同的applet中,这时常常会需要进行数据的分享。 比如在一个applet中存储了密钥,而在另一个业务applet中需要进行签名时&…...
国产FPGA开发板选择
FPGA开发板是学习和开发FPGA的重要工具,选择合适的开发板对学习效果和开发效率至关重要。随着国产FPGA的发展,淘宝上的许多FPGA开发板店铺也开始进行国产FPGA的设计和销售,本文将对国产FPGA和相关店铺做个简单梳理,帮助有需要使用…...
com.typesafe.config
com.typesafe.config 是 Typesafe Config 库的核心包,主要用于 统一、灵活地管理应用程序配置,支持从多种格式(如 HOCON、JSON、Java Properties)加载配置,并提供类型安全的访问接口。以下是其核心功能的详细解析&…...
Ubuntu学习备忘
1. 打开Terminal快捷键 ctrl alt t 2.Ubuntu22.04的root没有默认初始密码, 为root设置密码,下面链接的step1, How to allow GUI root login on Ubuntu 22.04 Jammy Jellyfish Linux - LinuxConfig...
【C++】— 掌握STL vector 类:“Vector简介:动态数组的高效应用”
文章目录 1.vector的介绍和使用1.1vector的介绍1.2 vector的特点1.3vector的使用1.3.1vector的定义1.3.2vector iterator的使用1.3.3vector 的空间增长问题1.3.4 vector 的增删查改1.3.5vector 迭代器失效问题 1.vector的介绍和使用 1.1vector的介绍 vector是一个顺序容器&am…...
Docker__持续更新......
Docker 1. 基本知识1.1 为什么有Docker?1.2 Docker架构与容器化 画图解释 画图解释2. 项目实战 1. 基本知识 1.1 为什么有Docker? 用一行命令跨平台安装项目,在不同平台上运行项目。把项目打包分享运行应用。 1.2 Docker架构与容器化 准备机器,在机…...
【R语言】主成分分析与因子分析
一、主成分分析 主成分分析(Principal Component Analysis, PCA)是一种常用的无监督数据降维技术,广泛应用于统计学、数据科学和机器学习等领域。它通过正交化线性变换将(高维)原始数据投影到一个新的坐标系ÿ…...
ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测
文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw:原始的、未经处理的图像数据。 /camera/image_rectÿ…...
STM32 如何使用DMA和获取ADC
目录 背景 摇杆的原理 程序 端口配置 ADC 配置 DMA配置 背景 DMA是一种计算机技术,允许某些硬件子系统直接访问系统内存,而不需要中央处理器(CPU)的介入,从而减轻CPU的负担。我们可以通过DMA来从外设…...
【JAVA实战】JAVA实现Excel模板下载并填充模板下拉选项数据
背景 有这样一个场景:前端下载Excel模板,进行数据导入,这个下载模板过程需要经过后端接口去数据库查询数据进行某些列的下拉数据填充,下拉填充的数据过程中会出现错误String literals in formulas can’t be bigger than 255 cha…...
java面试笔记(一)
1. 一万个string类型的数据,设计一个算法如何按照String长度来排序 以使用 Arrays.sort() 方法,并结合一个自定义的比较器。以下是实现的示例代码: public class StringLengthSort {public static void main(String[] args) {// 定义一万个字符串的示例…...
【C++】36.C++IO流
文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。pri…...
Qt5开发入门指南:从零开始掌握跨平台开发
目录 Qt框架概述 开发环境搭建 基础语法与核心机制 第一个Qt窗口程序 常见问题解答 一、Qt框架概述 1.1 什么是Qt? Qt是一个1995年由挪威Trolltech公司开发的跨平台C图形用户界面应用程序框架。最新Qt5版本主要包含: GUI模块:支持Wind…...
Rook-ceph(1.92最新版)
安装前准备 #确认安装lvm2 yum install lvm2 -y #启用rbd模块 modprobe rbd cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules do[ -x \$file ] && \$file done EOF cat > /etc/sysconfig/modules/rbd.modules &l…...
深度学习在蛋白质-蛋白质相互作用(PPI)领域的研究进展(2022-2025)
一、蛋白质-蛋白质相互作用(PPI)的定义与生物学意义 蛋白质-蛋白质相互作用(Protein-Protein Interaction, PPI)是指两个或多个蛋白质通过物理结合形成复合物,进而调控细胞信号传导、代谢、免疫应答等生命活动的过程。PPI是生物体内复杂功能网络的核心,例如酶与底物的结…...
网络安全学习架构 网络安全架构内容
网上买的《信息安全原理及应用》的书还没到,就找了一本《密码编码学与网络安全》的电子书,写的也不错,计划今天和明天把第一章绪论和第二章的数论给看完 1. 计算机网络安全概念 计算机安全的三个核心是:完整性(只要特…...
硕成C语言24
不管风吹浪打,胜似闲庭信步! 1.选择排序: 不管风吹浪打,胜似闲庭信步!1.选择排序: // 这个宏定义用于忽略 Visual Studio 中一些安全相关的警告,使得可以使用像 scanf 这样的函数而不产生警告…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
Python异步编程:深入理解协程的原理与实践指南
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…...
