当前位置: 首页 > news >正文

接口自动化测试系列-yml管理测试用例

项目源码

目录结构及项目介绍

整体目录结构,目录说明参考
在这里插入图片描述
测试用例结构类似httprunner写法,可参考demo

在这里插入图片描述
主要核心函数
用例读取转换json

import yaml
import main
import os
def yaml_r():curpath = f'{main.BASE_DIR}/quality_management_logic/ops_new/TestCaseCenter'yamlpath = os.path.join(curpath, "ops.yaml")f = open(yamlpath, 'r', encoding='utf-8')cfg = f.read()d = yaml.load(cfg,Loader=yaml.FullLoader)  # 用load方法转字典return d

测试用例格式处理函数

import ast
import yaml
import os
import datetime
import time
now_time = datetime.datetime.now()
now = datetime.datetime.strftime(now_time, '%Y-%m-%d %H:%M:%S')
logger = getlog(targetName='Case_Get_Data')
import openpyxl
def GetPreposition(mydict,pattern,res):'''获取value中的sql:param str::param pattern::param env::return:'''#字典类型的# pattern1=f'${pattern}:$'# res={'code': '', 'data': {}, 'flag': 'S', 'msg': ''}if isinstance(mydict, dict):  # 使用isinstance检测数据类型,如果是字典# if key in mydict.keys():  # 替换字典第一层中所有key与传参一致的key# if value in mydict.values():for key in mydict.keys():if isinstance(mydict[key],int) or mydict[key]==None:continueif str(pattern) in (mydict[key]):mydict[key] = eval((mydict[key]).split(pattern)[1])# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = mydict[key]GetPreposition(chdict,pattern,res)if str(pattern) in str(mydict[key]):mydict[key] = eval(list(mydict[key])[0].split(pattern)[1])elif isinstance(mydict, list):  # 如是listfor element in mydict:  # 遍历list元素,以下重复上面的操作if isinstance(element, dict):# if value in element.values():for key in element.keys():if str(pattern) in str(element[key]):element[key] =eval(list(element[key])[0].split(pattern)[1])# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = element[key]GetPreposition(chdict,pattern,res)if str(pattern) in str(element[key]):element[key] = eval(list(element[key])[0].split(pattern)[1])
def GetSql(dic,pattern='sql-',env='stg2'):'''获取用例中的sql:param dic::param pattern::param env::return:'''if isinstance(dic,dict):if re.match(pattern,str(list(dic.keys())[0]),re.I):logger.debug('有查数据库的变量,开始获取sql')try:sql=list(dic.values())[0]dbname=list(dic.keys())[0].split('-')[1]return list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]except Exception as e:logger.error(e)return ''else:return False
def Issql(sql):if isinstance(sql,dict) :return Trueelse:return False
def GetSqll(dic,pattern='sql-',env='stg1'):'''获取value中的sql:param str::param pattern::param env::return:'''#字典类型的if isinstance(dic, dict):  # 使用isinstance检测数据类型,如果是字典for key in dic.keys():if isinstance(dic[key],int) or dic[key]==None:continueif pattern in (dic[key]):try:sql = (dic[key]).split(":")[1]dbname = (dic[key]).split(":")[0].split('-')[1]dic[key] = list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]except Exception as e:logger.error(e)# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = dic[key]GetSqll(chdict, pattern, env)elif isinstance(dic, list):  # 如是listfor element in dic:  # 遍历list元素,以下重复上面的操作if isinstance(element, dict):# if value in element.values():for key in element.keys():if isinstance(element[key], int) or element[key] == None:continueif pattern in element[key]:try:sql = element[key].split(":")[1]dbname = element[key].split(":")[0].split('-')[1]element[key] = list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]except Exception as e:logger.error(e)# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = element[key]GetSqll(chdict, pattern, env)else:for i in range(len(dic)):if isinstance(dic[i], int) or dic[i] == None:continueif pattern in dic[i]:try:sql = dic[i].split(":")[1]dbname =dic[i].split(":")[0].split('-')[1]dic[i] = list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]except Exception as e:logger.error(e)
def GetExpectedResults(dic):'''获取预期结果值,dict的value必须是list,有且两个值,第一个是位置,第二个是值:param dic::return:'''ExpectedResults = dic.get("ExpectedResults")ExpectedResults=ast.literal_eval(str(ExpectedResults))if isinstance(ExpectedResults, list):  # 如是listif len(ExpectedResults)==2:return ExpectedResultselse:return ['res', '']
def GetFun(dic,env,pattern='fun'):'''获取用例中的自定义函数:param dic::param pattern::return:'''if isinstance(dic, dict):if re.match(pattern,str(list(dic.keys())[0]),re.I):logger.debug(f'有调用公共函数,开始获取调用函数:{list(dic.values())[0]}')return eval(list(dic.values())[0].replace('env',env))else:return False
def yaml_r(yamlpath):'''yaml文件转换成json:param yamlpath::return:'''with open(yamlpath, 'r', encoding='utf-8') as f:# f = open(yamlpath, 'r', encoding='utf-8')cfg = f.read()d = yaml.load(cfg,Loader=yaml.FullLoader)  # 用load方法转字典return ddef File_Name(file_dir):L = []for root, dirs, files in os.walk(file_dir):for file in files:if os.path.splitext(file)[1] == '.yaml':L.append(os.path.join(root, file))return L
def to_extract(key):return f"${key}$"# 遍历嵌套字典或list并替换字典的key
def update_allvalues(mydict, value, env='stg1'):tovalue=GetSqll(mydict, env)if isinstance(mydict, dict):  # 使用isinstance检测数据类型,如果是字典# if key in mydict.keys():  # 替换字典第一层中所有key与传参一致的key# if value in mydict.values():for key in mydict.keys():if value in mydict[key] :mydict[key] = tovalue# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = mydict[key]update_allvalues(chdict, value, tovalue)if value in mydict[key] :mydict[key] = tovalueelif isinstance(mydict, list):  # 如是listfor element in mydict:  # 遍历list元素,以下重复上面的操作if isinstance(element, dict):# if value in element.values():for key in element.keys():if value in element[key] :element[key] = tovalue# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = element[key]update_allvalue(chdict, value, tovalue)if value in str(element[key]) :element[key] = tovalue# 遍历嵌套字典或list并替换字典的value
def update_allvalue(mydict, value, tovalue):if isinstance(mydict, dict):  # 使用isinstance检测数据类型,如果是字典# if key in mydict.keys():  # 替换字典第一层中所有key与传参一致的key# if value in mydict.values():for key in mydict.keys():if str(value) in str(mydict[key]):mydict[key] = (str(mydict[key]).replace(value,tovalue))# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = mydict[key]update_allvalue(chdict, value, tovalue)if str(value) in str(mydict[key]):mydict[key] = (str(mydict[key]).replace(value, tovalue))elif isinstance(mydict, list):  # 如是listfor element in mydict:  # 遍历list元素,以下重复上面的操作if isinstance(element, dict):# if value in element.values():for key in element.keys():if   str(value) in str(element[key]):element[key] = (str(element[key]).replace(value, tovalue))# for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的keychdict = element[key]update_allvalue(chdict, value, tovalue)if str(value) in str(element[key]):element[key] = (str(element[key]).replace(value, tovalue))
def re_search(str,pattern='\\$(.*)\\$'):#查找match_str=re.search(pattern,str).group()return match_str
def nowtime():now_time = datetime.datetime.now()now = datetime.datetime.strftime(now_time, '%Y-%m-%d %H:%M:%S')# date_now=datetime.datetime.strftime(now_time, '%Y-%m-%d')date = (int(time.mktime(time.strptime(now, "%Y-%m-%d %H:%M:%S"))))return now, datedef readexcle(exclepath):wb = openpyxl.load_workbook(exclepath)# 获取所有工作表名names = wb.sheetnames# wb.get_sheet_by_name(name) 已经废弃,使用wb[name] 获取指定工作表sheet = wb[names[0]]# 获取最大行数maxRow = sheet.max_row# 获取最大列数maxColumn = sheet.max_columna12 = sheet.cell(row=1, column=2).value# 定义结果变量listresult = []for i in range(2, (maxRow)):casedic = {}for j in range(1, (maxColumn) + 1):if j == 2 or j == 6 or j == 7:casedic[sheet.cell(row=1, column=j).value] = eval(sheet.cell(row=i, column=j).value)else:casedic[sheet.cell(row=1, column=j).value] = sheet.cell(row=i, column=j).valueresult.append(casedic)return result

相关文章:

接口自动化测试系列-yml管理测试用例

项目源码 目录结构及项目介绍 整体目录结构,目录说明参考 测试用例结构类似httprunner写法,可参考demo 主要核心函数 用例读取转换json import yaml import main import os def yaml_r():curpath f{main.BASE_DIR}/quality_management_logic/ops_ne…...

开源对象存储系统minio部署配置与SpringBoot客户端整合访问

文章目录 1、MinIO安装部署1.1 下载 2、管理工具2.1、图形管理工具2.2、命令管理工具2.3、Java SDK管理工具 3、MinIO Server配置参数3.1、启动参数:3.2、环境变量3.3、Root验证参数 4、MinIO Client可用命令 官方介绍: MinIO 提供高性能、与S3 兼容的对…...

Matlab之数组字符串函数汇总

一、前言 在MATLAB中,数组字符串是指由字符组成的一维数组。字符串可以包含字母、数字、标点符号和空格等字符。MATLAB提供了一些函数和操作符来创建、访问和操作字符串数组。 二、字符串数组具体怎么使用? 1、使用单引号或双引号括起来的字符序列 例…...

基于深度学习网络的火灾检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................................ load F…...

【Linux】高级IO和多路转接 | select/poll/epoll

多路转接和高级IO 咳咳,写的时候出了点问题,标点符号全乱了(批量替换了几次),干脆就把全文的逗号和句号都改成英文的了(不然代码块里面的代码都是中文标点就跑不动了) 1.高级IO 1.1 五种IO模型…...

el-select 支持多选 搜索远程数据 组件抽取

el-select 支持多选 搜索远程数据 组件抽取 使用方式 import selectView from ./components/selectView<el-form><el-form-item label"选择器"><selectView v-model"selValue" change"handleChange"></el-form-item> …...

el-table纵向垂直表头

参考&#xff1a;https://www.jianshu.com/p/1f38eaffd070 <el-tablestyle"width: 100%":data"getValues":show-header"false"border:cell-style"cellStyle" ><el-table-columnv-for"(item, index) in getHeaders"…...

Pinyin4j介绍和简单使用

前言 Pinyin4j是一个Java库&#xff0c;用于将汉字转换为拼音。它是由中国清华大学的Tsinghua University和中国科学院计算技术研究所的研究人员开发的。Pinyin4j可以用于Java应用程序中&#xff0c;以便在需要时将汉字转换为拼音。例如&#xff0c;它可以用于中文输入法、文本…...

【数据结构】查找

【数据结构】查找 数据结构中&#xff0c;有顺序查找、二分查找、散列查找、插值查找、斐波那契额查找 1.顺序查找 条件&#xff1a;待查找的元素与数组中的元素按顺序排列。算法&#xff1a;从数组的第一个元素开始&#xff0c;逐个比较&#xff0c;直到找到目标元素或遍历完…...

第一次面试

1.多态的原理 2.编译原理 3.HTTPS的加密原理 4.说一说C11新特性 5.平时用过哪些STL容器 6.STL的比较器 原来就是自定义工具类hhhhhh 7.函数指针用过吗 8.I/O多路复用 9.Redis 问的基本都背过&#xff0c;但是一紧张啥都忘了hhhhhhhhh...

Nacos配置文件更新+热更新+多环境配置共享+集群搭建

对服务配置文件 场景&#xff1a; 如果多个服务对应的配置文件都需要更改时&#xff0c;可以利用配置管理&#xff0c;方便对配置文件进行更新&#xff0c;而且是在本地配置前先读取nacos的配置文件&#xff0c;优先级大于本地配置文件 配置步骤 1.首先在Nacos中的配置列表中增…...

李宏毅-机器学习hw4-self-attention结构-辨别600个speaker的身份

一、慢慢分析学习pytorch中的各个模块的参数含义、使用方法、功能&#xff1a; 1.encoder编码器中的nhead参数&#xff1a; self.encoder_layer nn.TransformerEncoderLayer( d_modeld_model, dim_feedforward256, nhead2) 所以说&#xff0c;这个nhead的意思&#xff0c;就…...

记一次使用NetworkManager管理Ubuntu网络无效问题分析

我们都知道CentOS、Redhat系列网络配置比较连贯&#xff0c;要么在/etc/sysconfig/network-scripts/ifcfg-网络设备名&#xff0c;文件中编辑后&#xff0c;重启网络服务&#xff1b;要么使用nmtui或者nmcli进行配置。但是&#xff0c;Ubuntu变动就比较大&#xff1a; 早期版本…...

Nginx重写功能

Nginx重写功能 一、Nginx常见模块二、访问路由location2.1location常用正则表达式2.2、location的分类2.3、location常用的匹配规则2.4、location优先级排列说明2.5、location示例2.6、location优先级总结2.7、实例2.7.1、location/{}与location/{}2.7.2、location/index.html{…...

王道考研计算机网络

文章目录 计算机网络体系结构计算机网络概述计算机网络的性能指标 计算机网络体系结构与参考模型错题 物理层通信基础基础概念奈奎斯特定理和香农定理编码与调制电路交换、报文交换和分组交换数据报与虚电路 传输介质物理层设备错题 数据链路层数据链路层的功能组帧差错控制检错…...

数据链路层重点协议-以太网

以太网简介 "以太网" 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了 一些物理层的内容。例如&#xff1a;规定了网络拓扑结构&#xff0c;访问控制方式&#xff0c;传输速率等&#xff1b; 以太网数据帧…...

学习计划

白驹过隙&#xff0c;转眼已是大二。新学期&#xff0c;新气象&#xff0c;新计划。 一、专业学习方面 学习vue、spring boot、redis、MybatisPlus、Elasticsearch、ssm框架&#xff0c;完成项目的编写&#xff0c;思考复盘。 二、读书方面 因为我大概率会走前端方向&#xff0…...

RabbitMQ的RPM包安装和Python读写操作

下载地址 ## erlang 下载地址 https://packagecloud.io/rabbitmq/erlang?page6## rabbitmq 下载地址 https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.8.29-1.el7.noarch.rpm?distro_version_id140 Rabbitmq的RPM包安装 ## 下载 wget -…...

文件上传漏洞案例

目录 1.案例一 1&#xff09;案例源码 2&#xff09;创建web.php文件 3&#xff09;使用抓包软件 2.案例二 1&#xff09;案例代码 2&#xff09; 案例分析 3&#xff09;copy命令生成图片马 4&#xff09;上传图片马到服务器 5&#xff09;解析 文件图片 3.案例三 …...

Office365 Excel中使用宏将汉字转拼音

Office365 Excel中开启宏 文件 - 选项 - 信任中心 - 信任中心设值 - 宏设值 启用VBA宏启用VBA宏时启用Excel 4.0宏信任对VBA工程对象模型的访问 创建宏 视图 - 查看宏 填写名字创建宏&#xff1a;getpy填入下面代码保存&#xff0c;点击否&#xff0c;另存类型为“excel启…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...