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

news2024/12/29 22:40:45

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

配置文件

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

# 公共参数
case_common:
  allureEpic: 商品接口
  allureFeature: 店铺信息
  allureStory: 店铺信息

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

通用工具类

文件操作

/utils/file_operate.py

import os


def 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() + path


def 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_str
	
	def file_is_exists(self, filepath):
		if os.path.exists(filepath):
			return True
		return False
	
	def 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_data
	
	def 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_file


class TestCaseAutomaticGeneration:
    def __init__(self):
        self.yaml_case_data = None
        self.file_path = None
    
    @property
    def 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
    
    @property
    def 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
    
    @property
    def 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
    @property
    def case_data_path(self):
        """返回 yaml 用例文件路径"""
        return ensure_path_sep("/conf")

    @property
    def 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 = None
        if '.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

    @property
    def 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
    
    @property
    def get_func_title(self):
        """自动生成方法名"""
        return os.path.split(self.gen_file_name)[1][:-3]
    
    @property
    def spilt_path(self):
        # 使用"/"分割 获取文件名称
        path = self.gen_file_name.split(os.sep)
        path[-1] = path[-1].replace(path[-1], "test_" + path[-1])
        return path
    
    @property
    def get_case_path(self):
        """生成测试用例目录"""
        # 相对路径 test_case/x/test_get_shop_info.py
        return ensure_path_sep("/test_case" + os.sep.join(self.spilt_path)) 
    
    @property
    def case_ids(self):
        return [k for k in self.yaml_case_data.keys() if k != "case_common"]
    
    @property
    def get_file_name(self):
        # 这里通过"/" 符号进行分割,提取出来文件名称
        # 判断生成的 testcase 文件名称,需要以test_ 开头
        case_name = self.spilt_path[-1].replace(
            self.spilt_path[-1], "test_" + self.spilt_path[-1]
        )
        return case_name
    
    def 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.coloradmin.cn/o/2267059.html

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

相关文章

SpringCloudAlibaba实战入门之路由网关Gateway初体验(十一)

Spring Cloud 原先整合 Zuul 作为网关组件,Zuul 由 Netflix 公司提供的,现在已经不维护了。后面 Netflix 公司又出来了一个 Zuul2.0 网关,但由于一直没有发布稳定版本,所以 Spring Cloud 等不及了就自己推出一个网关,已经不打算整合 zuul2.0 了。 一、什么是网关 1、顾明…

#渗透测试#漏洞挖掘#红蓝攻防#常见未授权访问漏洞汇总

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Fast adaptively balanced min-cut clustering

#0.论文信息 标题:Fast adaptively balanced min-cut clustering期刊:Pattern Recognition作者: Feiping Nie , Fangyuan Xie , Jingyu Wang ,Xuelong Li机构: China Telecom, Northwestern Polytechnic al University.代码链接: #1.摘要 …

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里,然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表:核心概念与引入 2. 哈希表的底层机制:原理与挑战 2.1 核心功能解析:效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

前端技术(26) : 全年排班日历

来源: 通义千问 效果图 代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>年度日历</title><style>body {font-family: Arial, sans-serif;}.calendar-container {margin: 20px au…

QT-------认识QT

QT简介 QT是一个跨平台的C图形用户界面应用程序框架&#xff0c;由挪威Trolltech公司于1991年开发并发布。它为开发者提供了一套丰富的类库和工具&#xff0c;用于创建各种类型的应用程序&#xff0c;包括桌面应用、移动应用、嵌入式系统应用等。QT具有高度的可定制性和可扩展…

Hive 部署

1 下载并安装 1.1 Hadoop安装 参考另一篇博客&#xff1a;Hadoop 部署 1.2 安装包下载 可通过下面网站下载&#xff1a; 官网&#xff1a;https://dlcdn.apache.org/hive/。清华源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/hive/。 比如下载apache-hive-4…

Linux中QT应用IO状态设置失效问题

问题&#xff1a;在进入freeze休眠前需要设置特定IO关闭电源灯操作&#xff0c;唤醒后需要将特定IO恢复原来正常工作状态&#xff0c;此时出现偶然性&#xff08;概率很低&#xff09;的IO控制失效问题&#xff1b;【平台&#xff1a;君正X1600HN】 一、问题点分析 1、电路 …

empire靶机

打开靶机 我们先查看页面源代码&#xff0c;发现什么也没有 再去用nmap扫描 nmap -sV -p- 192.168.95.144 发现也没什么用 我们在用dirb扫一下 dirb http://192.168.95.144 我们发现了robots.txt并且响应码是200&#xff0c;去访问一下 又得到了一个目录&#xff0c;去访问…

三层交换原理及图示

大概 三层交换原理 需要提前掌握的&#xff08;VLAN基础知识&#xff09; 【Info-Finder 参考链接&#xff1a;什么是VLAN】 三层是IP层&#xff0c;即网络层。为了方便记忆的&#xff1a;“先有网络&#xff0c;才有传输”、“传输是为了验证有网络”、“IP不是Transfer”…

当AI遇见大数据:决策优化的下一个风口

引言 在信息化时代的浪潮中&#xff0c;数据已成为企业决策的重要资产。随着大数据技术的发展&#xff0c;企业积累了海量的用户行为数据、市场动态和内部运营信息&#xff0c;这些数据背后蕴藏着巨大的价值。然而&#xff0c;数据的价值并非天然显现&#xff0c;它需要通过有效…

sizeof和strlen区分,(好多例子)

sizeof算字节大小 带\0 strlen算字符串长度 \0之前

SmartAIChain荣获重要认可

2024年12月21日&#xff0c;洛杉矶尔湾市——在今年的圣诞艺术交流会上&#xff0c;黄荣先生的SmartAIChain项目获得了重要认可。此次活动汇聚了来自各地的艺术家以及社区代表&#xff0c;共同庆祝这一创新性艺术的时刻。 在活动中&#xff0c;核桃市议员伍立伦(Allen Wu)代表D…

【Compose multiplatform教程12】【组件】Box组件

查看全部组件文章浏览阅读493次&#xff0c;点赞17次&#xff0c;收藏11次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Box 功能说明&#xff1a;简单的布局组件&#xff0c;可容纳其他组件&#xff0c;并依据alignment属性精确指定内部组件的对…

RT-DETR学习笔记(3)

九、损失函数 整理所需参数 decoder的输出结果&#xff1a;6层decoderlayer的类别以及bbox预测 将500个query拆分成300&#xff08;300个query&#xff09;200(denoising query) 1. 最后一层的decoder的输出的300部分&#xff0c;单独存储到out中的"pred_logits"和“…

处理元素卡在视野边界,滚动到视野内

效果图如下&#xff1a; 本示例处理场景&#xff1a;点击底部的折叠面板&#xff0c;展开后移动端滚动条位置不变&#xff0c;导致展开内容在视图外。造成面板展开无内容的错觉。 处理核心API: IntersectionObserver 此API可绑定元素并监听元素是否在视野内。若在视野外​​​…

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署 flyfish 1. 确保 vm.max_map_count ≥ 262144 这是指要调整Linux内核参数vm.max_map_count&#xff0c;以确保其值至少为262144。这个参数控制着进程可以映射的最大内存区域数量。对于某些应用程序&#xff08;如Ela…

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现 关于鸿蒙云捐助项目&#xff0c;前面的内容已使用云函数&#xff0c;云数据库分别实现云捐助项目首页中的项分类导航&#xff0c;底部导航&#xff0c;轮播图功能&#xff0c;这里继续实现云数据库加载捐赠…

Confluent Cloud Kafka 可观测性最佳实践

Confluent Cloud 介绍 Confluent Cloud 是一个完全托管的 Apache Kafka 服务&#xff0c;提供高可用性和可扩展性&#xff0c;旨在简化数据流处理和实时数据集成。用户可以轻松创建和管理 Kafka 集群&#xff0c;而无需担心基础设施的维护和管理。Confluent Cloud 支持多种数据…

SpringCloudAlibaba升级手册-nacos问题记录

目录 一、前言 二、升级过程 1.问题 2.原因 3.出处 4.理论解决 5.测试环境问题 6.Spring Cloud Alibaba版本对比 7. Spring Cloud Alibaba适配组件版本对比 8.降低Spring Cloud版本 9.SpringCloud与SpringBoot兼容对比表 10.naocs-client版本对比 三、最终解决 一…