【接口自动化连载】使用yaml配置文件自动生成接口case

直接上干货撸代码,有一些是通用的工具类代码,一次性封装永久使用,期待大家的关注,一起加油!!!

配置文件

根据不同的业务需求进行配置,例如Goods服务、Order服务分开配置,每个服务下配置接口信息,每个接口文件里配置各种case。
/conf/GooodsApi/get_shop_info.yaml

# 公共参数
case_common:allureEpic: 商品接口allureFeature: 店铺信息allureStory: 店铺信息get_user_info_01:host: https://goodsapi.e.weibo.comurl: /mp/shop/getShopInfomethod: GETdetail: 获取商家店铺信息headers:
#      Content-Type: multipart/form-data;# 这里cookie的值,写的是存入缓存的名称
#      cookie: $cache{login_cookie}# 请求的数据,是 params 还是 json、或者file、datarequestType: params# 是否执行,空或者 true 都会执行is_run:data:{"shop_id": xxxx}# 是否有依赖业务,为空或者false则表示没有dependence_case: False# 依赖的数据dependence_case_data:assert:# 断言接口状态码errorCode:jsonpath: $.codetype: ==value: 0AssertType:sql:

通用工具类

文件操作

/utils/file_operate.py

import osdef get_root_path():"""获取(项目)根目录"""return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) def ensure_path_sep(path):"""兼容windows和Linux不同环境的操作系统路径"""if '/' in path:path = os.sep.join(path.split('/'))if '\\' in path:path = os.sep.join(path.split('\\'))return get_root_path() + pathdef get_all_yaml_files(file_path, yaml_data_switch=False):"""获取配置的yaml文件路径"""file_name = []for root, dir, files in os.walk(file_path):for _file_path in files:path = os.path.join(root, _file_path)if yaml_data_switch:if 'yaml' in path or '.yml' in path:file_name.append(path)file_name.append(path)return file_name

操作yaml

/utils/yaml_control.py

Class YamlControl:def __init__(self, file_str):self.file_str = file_strdef file_is_exists(self, filepath):if os.path.exists(filepath):return Truereturn Falsedef read_yaml_data(self):"""获取yaml文件数据"""if self.file_is_exists(self.file_str):data = open(self.file_str, "r", encoding="UTF-8")yaml_data = yaml.load(data, Loader = yaml.FullLoader)else:raise FileNotFoundError("文件路径不存在")return yaml_datadef save_yaml_data(self, file_path, data):if self.file_is_exists(file_path):with open(file_path, 'w') as file:yaml.safe_dump(data, file, default_flow_style=False)else:raise FileNotFoundError("文件路径不存在")

自动生成用例代码

/utils/case_automatic_genration.py

import os
from utils.read_file_tools import get_all_yaml_files, ensure_path_sep
from utils.yaml_control import YamlControl
from utils.test_case import write_testcase_fileclass TestCaseAutomaticGeneration:def __init__(self):self.yaml_case_data = Noneself.file_path = None@propertydef allure_epic(self):_allure_epic = self.yaml_case_data.get("case_common").get("allureEpic")assert _allure_epic is not None, ("用例中 allureEpic 为必填项,请检查用例内容, 用例路径:'%s'" % self.file_path)return _allure_epic@propertydef allure_feature(self):_allure_feature = self.yaml_case_data.get("case_common").get("allureFeature")assert _allure_feature is not None, ("用例中 allureFeature 为必填项,请检查用例内容, 用例路径:'%s'" % self.file_path)return _allure_feature@propertydef allure_story(self):_allure_story = self.yaml_case_data.get("case_common").get("allureStory")assert _allure_story is not None, ("用例中 allureStory 为必填项,请检查用例内容, 用例路径:'%s'" % self.file_path)return _allure_story@propertydef case_data_path(self):"""返回 yaml 用例文件路径"""return ensure_path_sep("/conf")@propertydef gen_file_name(self):"""生成文件名 将.yaml替换成.py"""# 例 /get_shop_info.yaml——>/get_shop_info.py# 获取配置文件相对路径l = len(self.case_data_path)yaml_path = self.file_path[l:]file_name = Noneif '.yaml' in yaml_path:file_name = yaml_path.replace('.yaml', '.py')elif '.yml' in yaml_path:file_name = yaml_path.replace('.yml', '.py')return file_name@propertydef get_test_class_title(self):"""自动生成类名"""# 例 get_shop_info——>GetShopInfo_file_name = os.path.split(self.gen_file_name)[1][:-3]_name = _file_name.split("_")_name_len = len(_name)for i in range(_name_len):_name[i] = _name[i].capitalize()_class_name = "".join(_name)return _class_name@propertydef get_func_title(self):"""自动生成方法名"""return os.path.split(self.gen_file_name)[1][:-3]@propertydef spilt_path(self):# 使用"/"分割 获取文件名称path = self.gen_file_name.split(os.sep)path[-1] = path[-1].replace(path[-1], "test_" + path[-1])return path@propertydef get_case_path(self):"""生成测试用例目录"""# 相对路径 test_case/x/test_get_shop_info.pyreturn ensure_path_sep("/test_case" + os.sep.join(self.spilt_path)) @propertydef case_ids(self):return [k for k in self.yaml_case_data.keys() if k != "case_common"]@propertydef get_file_name(self):# 这里通过"/" 符号进行分割,提取出来文件名称# 判断生成的 testcase 文件名称,需要以test_ 开头case_name = self.spilt_path[-1].replace(self.spilt_path[-1], "test_" + self.spilt_path[-1])return case_namedef mk_dir(self) -> None:""" 判断生成自动化代码的文件夹路径是否存在,如果不存在,则自动创建 """# _LibDirPath = os.path.split(self.libPagePath(filePath))[0]_case_dir_path = os.path.split(self.get_case_path)[0]if not os.path.exists(_case_dir_path):os.makedirs(_case_dir_path)def get_case_automatic(self):"""自动生成测试用例代码"""# 获取配置文件下全部yaml文件file_path = get_all_yaml_files(ensure_path_sep("/conf"), yaml_data_switch=True)for file in file_path:# 判断代理拦截的yaml文件,不生成test_case代码if 'proxy_data.yaml' not in file:# 获取配置yaml用例数据self.yaml_case_data = YamlControl(file).read_yaml_data()# yaml文件相对路径self.file_path = file# 判断用例需要用的文件夹路径是否存在,不存在则创建self.mk_dir()print(self.gen_file_name, "\n",self.get_test_class_title,"\n",self.get_func_title,"\n",self.get_case_path,"\n",self.case_ids,"\n",self.get_file_name)write_testcase_file(allure_epic = self.allure_epic,allure_feature=self.allure_feature,allure_story=self.allure_story,class_title=self.get_test_class_title,func_title=self.get_func_title,case_path=self.get_case_path,case_ids=self.case_ids,file_name=self.get_file_name)

下一篇介绍用例内容写入/utils/write_testcase_file.py,使用pytest实现自动化

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

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

相关文章

JZ31 栈的压入、弹出序列

题目来源:栈的压入、弹出序列_牛客题霸_牛客网 题目:如下 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xf…

Spring源码_05_IOC容器启动细节

前面几章,大致讲了Spring的IOC容器的大致过程和原理,以及重要的容器和beanFactory的继承关系,为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的,接下来的每一章都是从总体脉络中, 去研究之前没看的一些重要…

【Linux】进程间通信 -> 匿名管道命名管道

进程间通信的目的 数据传输:一个进程许需要将它的数据发送给另外一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程…

大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库

大模型-使用OllamaDify在本地搭建一个专属于自己的知识库 1、本地安装Dify2、本地安装Ollama并解决跨越问题3、使用Dify搭建聊天助手4、使用Dify搭建本地知识库 1、本地安装Dify 参考往期博客:https://guoqingru.blog.csdn.net/article/details/144683767 2、本地…

黑盒测试/白盒测试知识总结

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 对于很多刚开始学习软件测试的小伙伴来说,如果能尽早将黑盒、白盒测试弄明白,掌握两种测试的结论和基本原理,将对自己后期的学习…

数据结构之线性表之顺序表

定义: 由n(n>0)个数据特性相同的元素构成的有限序列称为线性表 简单来说n个相同数据类型的数据组wsw合在一起的这么一个集合就是一个线性表 线性表包括顺序表和链表 1. 顺序表(我们所有的代码实现都用函数来封装&#xff09…

ReactPress 1.6.0:重塑博客体验,引领内容创新

ReactPress 是一个基于Next.js的博客&CMS系统, Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 体验地址:http://blog.gaoredu.com/ 今天,我们自豪地宣布ReactPress 1.6.0版本的正式发布,…

(echarts)数据地图散点类型根据条件设置不同的标记图片

(echarts)数据地图散点类型根据条件设置不同的标记图片 1.用在线工具将本地图片转化base64格式 data(){return { base64Img:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQ...",} }在线转换地址:https://www.jyshare.com/front-end/59/ 2.symbol属…

傅里叶变换原理

本文学习自YuHWEI最浅显易懂的傅里叶变换公式和原理_采样率和信号频率计算镜像频率-CSDN博客 本文会对公式实现 更加详细的补充 连续与离散 一般人们口中所说的傅里叶变换都是指连续傅里叶变换,针对的是连续时域信号. 对于计算设备的信号处理,因为采样…

STM32高级 以太网通讯案例2:搭建TCP服务端

需求描述 在TCP通讯的时候,客户端必须主动联系服务器,这样才能实现通讯。服务器与客户端之间的连接是一种长连接,一旦连上一般是不会断开的。 在STM32上启动一个TCP的服务端,在电脑上用TCP客户端去连接服务端。客户端给服务端发…

系统架构师考试 常错题记录 01

1.按照《中华人民共和国著作权法》的权利保护期( )受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 正确答案:B 解析:本题考查知识产权法中的《中华人民共和著作权法》保护期限知识点。 《中华人民共和著作权法》中约定署名权…

WebPack3项目升级webpack5的配置调试记录

文章目录 前言一、webpack3环境1.1、知识点记录1.1.1、配置解释1.1.2、webpack与sass版本对应关系1.1.3、CommonJS与ESModule1.1.4、node版本管理nvm1.1.5、sass-loader、sass与node-sass 1.2、其他1.2.1、.d.ts是什么文件1.2.2、react与types/react版本对应关系1.2.3、webpack…

[源码解析] 模型并行分布式训练Megatron (2) --- 整体架构

link [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 目录 [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 0x00 摘要0x01 启动 1.1 分布式启动1.2 构造基础 1.2.1 获取模型1.2.2 获取数据集1.2.3 步进函数 1.2.3.1 广播数据0x02 Pretrain0x03 初始化 3.1 …

事件驱动编程与异步编程:原理、对比及实践案例

在编程领域,事件驱动编程(Event-Driven Programming)与异步编程(Asynchronous Programming)是两种极为关键的编程范式,它们对于提升程序运行效率与响应速度效果显著,尤其在应对I/O密集型任务以及…

基于earthSDK三维地图组件开发

上效果 功能点 测量分析相机位置切换geojson数据加载地图打点&#xff0c;显示信息点击回传数据二三位切换 这里二三维切换通上篇openlayers分享&#xff0c;技术交流V:bloxed <template><div class"h100 w100"><div style"width:100%; heig…

计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

RK3506开发板:智能硬件领域的新选择,带来卓越性能与低功耗

在现代智能硬件开发中&#xff0c;选择一款性能稳定、功耗低的开发板是确保产品成功的关键。Rockchip最新推出的RK3506芯片&#xff0c;凭借其卓越的能效比、多功能扩展性和优秀的实时性能&#xff0c;已经成为智能家电、工业控制、手持终端等领域的热门选择。而基于RK3506的Ar…

【AIGC-ChatGPT进阶副业提示词】星际占卜师:探索星象能量的艺术【限时免费阅读,一天之后自动进入进阶课程】

引言 在这个数字化的时代&#xff0c;我们创造了一个独特的角色 —— 星际占卜师。这不仅是一个简单的运势预测工具&#xff0c;更是一个融合了玄学、预言和能量解读的智能向导。通过精心设计的系统提示词和独特的画境生成机制&#xff0c;星际占卜师能够为用户带来沉浸式的占…

机器学习之PCA降维

主成分分析&#xff08;PCA&#xff0c;Principal Component Analysis&#xff09; 主成分分析&#xff08;PCA&#xff09;是一种常见的无监督学习技术&#xff0c;广泛应用于数据降维、数据可视化以及特征提取等任务。PCA的目标是通过线性变换将数据从高维空间映射到低维空间…

SOTA简繁中文拼写检查工具:FASPell Chinese Spell Checker 论文

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…