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

news2024/12/26 3:45:10

项目源码

目录结构及项目介绍

整体目录结构,目录说明参考
在这里插入图片描述
测试用例结构类似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:
                continue
            if str(pattern) in (mydict[key]):
                mydict[key] = eval((mydict[key]).split(pattern)[1])
            # for k in mydict.keys():  # 遍历字典的所有子层级,将子层级赋值为变量chdict,分别替换子层级第一层中所有key对应的value,最后在把替换后的子层级赋值给当前处理的key
            chdict = 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):  # 如是list
        for 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,最后在把替换后的子层级赋值给当前处理的key
                    chdict = 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 True
    else:
        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:
                continue
            if 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,最后在把替换后的子层级赋值给当前处理的key
            chdict = dic[key]
            GetSqll(chdict, pattern, env)
    elif isinstance(dic, list):  # 如是list
        for 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:
                        continue
                    if 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,最后在把替换后的子层级赋值给当前处理的key
                    chdict = element[key]
                    GetSqll(chdict, pattern, env)
            else:
                for i in range(len(dic)):
                    if isinstance(dic[i], int) or dic[i] == None:
                        continue
                    if 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):  # 如是list
        if len(ExpectedResults)==2:
            return ExpectedResults
    else:
        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 d

def 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,最后在把替换后的子层级赋值给当前处理的key
            chdict = mydict[key]
            update_allvalues(chdict, value, tovalue)
            if value in mydict[key] :
                mydict[key] = tovalue
    elif isinstance(mydict, list):  # 如是list
        for 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,最后在把替换后的子层级赋值给当前处理的key
                    chdict = 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,最后在把替换后的子层级赋值给当前处理的key
                chdict = 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):  # 如是list
        for 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,最后在把替换后的子层级赋值给当前处理的key
                        chdict = 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, date

def 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_column
    a12 = sheet.cell(row=1, column=2).value
    # 定义结果变量list
    result = []
    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).value
        result.append(casedic)
    return result

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

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

相关文章

centos7挂载nfs存储

centos7挂载nfs存储 小白教程,一看就会,一做就成。 1.安装NFS服务 #安装nfs yum -y install rpcbind nfs-utils#创建目录(我这边是/data/upload) mkdir -p /data/upload#写/etc/fstab文件,添加要挂载的nfs盘 172.16.…

Ubuntu18.04系统下通过ROS控制Kinova真实机械臂-多种实现方式

所用测试工作空间test_ws:包含官网最原始的功能包 一、使用Kinova官方Development center控制真实机械臂 0.在ubuntu系统安装Kinova机械臂的Development center,这一步自行安装,很简单。 1.使用USB连接机械臂和电脑 2.Development center…

【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 树上倍增、LCA⭐)

文章目录 竞赛链接Q1:7020. 统计对称整数的数目竞赛时代码——枚举预处理 Q2:8040. 生成特殊数字的最少操作(倒序遍历、贪心)竞赛时代码——检查0、00、25、50、75 Q3:2845. 统计趣味子数组的数目竞赛时代码——前缀和…

jQuery成功之路——jQuery动画效果和遍历效果概述

一、jQuery动画效果 1.1显示效果 方法 方法名称解释show([speed],[easing],[fn]])显示元素方法hide([speed],[easing],[fn]])隐藏元素方法toggle([speed],[easing],[fn])切换元素方法,显示的使之隐藏,隐藏的使之显示 参数 参数名称解释speed三种预…

CocosCreator3.8研究笔记(五)CocosCreator 脚本说明及使用(下)

在Cocos Creator中,脚本代码文件分为模块和插件两种方式: 模块一般就是项目的脚本,包含项目中创建的代码、引擎模块、第三方模块。 插件脚本,是指从 Cocos Creator 属性检查器中导入的插件,一般是引入第三方引入库文件…

管理类联考——数学——汇总篇——知识点突破——数据分析——排列组合

角度——🐴 角度——👩 排列组合的基本步骤(固定解题体系) 先取后排:即先取出元素,后排列元素,切勿边取边排. 逐次进行:按照一定的顺序逐次进行排列组合. 实验结束:整个…

vscode保存格式化自动去掉分号、逗号、双引号

之前每次写完代码都是双引号还有分号,看着很难受,就像修改一下,让它变成单引号,并且不加上引号:如下形式,看着简洁清晰明了 修改方式:更改 settings.json 文件 快捷键“Ctrl Shift P”打开命令…

UmeTrack: Unified multi-view end-to-end hand tracking for VR 复现踩坑记录

在 github 上找到了开源代码:https://github.com/facebookresearch/UmeTrack/tree/main 环境配置 运行第三行,报错,缺少torch。改成先运行第四行,成功。 再运行第三行,报错,required to install pyproj…

uniapp 集成蓝牙打印功能(个人测试佳博打印机)

uniapp 集成蓝牙打印功能(个人测试京博打印机) uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能,个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…

空间复杂度和时间复杂度

😜作 者:是江迪呀✒️本文关键词:时间复杂度、空间复杂度、算法☀️每日 一言:车到山前必有路,船到码头自然直! 一、前言 时间复杂度和空间复杂度是算法和数据结构领域中两个重要的概念&#…

服务器(I/O)之多路转接

五种IO模型 1、阻塞等待:在内核将数据准备好之前,系统调用会一直等待。所有的套接字,默认都是阻塞方式。 2、非阻塞等待:如果内核没有将数据准备好,系统调用仍然会返回,并且会返回EWUOLDBLOCK或者EAGAIN错…

springboot邮件发送和接收验证码

springboot邮件篇 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:新浪、搜狐、163、QQ邮箱等,他们都有自己的邮件服务器。这些服务器类似于现实生活中的邮局,它主要负责接…

【C语言】辗转相除法求最大公约数(详解)

辗转相除法求最大公约数 辗转相除法(又称欧几里德算法)是一种用于求解两个整数的最大公约数的方法。本文将使用C语言来实现辗转相除法,并对其原理进行解释。 辗转相除法的原理 辗转相除法的原理非常简单。假设有两个整数a和b,其…

Vue+Element-ui+SpringBoot搭建后端汽车租赁管理系统

最近在做项目,花了一周的时间搭建了一个十分完备的汽车租赁后端管理系统。页面采用纯Vue2Element-ui搭建,后端采用SpringbootMybatis搭建,数据库采用Mysql。包括了登录验证,根据不同权限进入不同界面、数据增删改查、表格分页、表…

iOS实时监控与报警器

在现代信息化社会中,即使我们不在电脑前面也能随时获取到最新的数据。而苹果公司提供的iOS推送通知功能为我们带来了一种全新的方式——通过手机接收实时监控和报警信息。 首先让我们了解一下iOS推送通知。它是一个强大且灵活可定制化程度高、适用于各类应用场景&a…

(二十一)大数据实战——Flume数据采集之复制和多路复用案例实战

前言 本节内容我们完成Flume数据采集的一个多路复用案例,使用三台服务器,一台服务器负责采集本地日志数据,通过使用Replicating ChannelSelector选择器,将采集到的数据分发到另外俩台服务器,一台服务器将数据存储到hd…

vue3 封装千分位分隔符自定义指令

toLocaleString作用:在没有指定区域的基本使用时,返回使用默认的语言环境和默认选项格式化的字符串。可点击进入MDN查看 // 千分位分隔符指令 import { Directive, DirectiveBinding } from vueconst thousandSeparator: Directive {mounted(el: any, …

window系统 bat脚本开启和关闭防火墙

前言 手动去关闭和开启防火墙太麻烦 命令 开始防火墙 netsh advfirewall set allprofiles state on关闭防火墙 netsh advfirewall set allprofiles state off

拦截器和异常处理器

拦截器和异常处理器 拦截器 拦截器(Interceptor)&#xff0c;主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作。 准备 创建模块 如下为完整的项目结构 web.xml <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee&qu…

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

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