当前位置: 首页 > 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启…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...