五、封装读写yaml文件操作(yaml_handler.py)

实现功能:
读取对应路径下yaml文件中的测试用例数据(baseinfo、testcase)
获取接口返回的信息,写入对应路径下的yaml文件中,供其它接口读取,从而完成变量的取值
1、函数设计
read_yaml(yaml_path)
- 功能:读取 YAML 文件并解析数据。
- 入参:
- yaml_path:YAML 文件的路径。
- 逻辑:
- 使用 yaml.safe_load 读取 YAML 文件内容。
- 处理一个 YAML 文件中可能包含多条测试用例的情况。
- 处理单接口单用例的情况
- 单接口多用例情况, yaml文件中baseinfo是公用的,testcase是多个,需要进行baseinfo和testcase进行拼接生成单个case
- 如果 YAML 文件中有多个测试用例,直接返回解析后的数据。
- 出参
- 返回用例数据,1个case按baseinfo和testcase两个部分组成。多个用例返回一个list列表
- 异常处理:
- 捕获 UnicodeDecodeError,提示文件编码格式错误。捕获其他异常,打印错误信息。
write_yaml(value)
- 功能:将数据写入 YAML 文件。
- 参数:
- value:要写入的数据,必须是字典类型。
- 逻辑:
- 检查目标文件是否存在,如果不存在则创建,文件路径固定(extract.yaml)。
- 使用 yaml.dump 将字典数据写入文件。
- 支持追加写入('a')和清空重写('w')两种模式。
- 异常处理:
- 捕获写入异常,打印错误信息。

get_extract_yaml(node_name, sub_node_name=None)
- 功能:从 YAML 文件中提取特定的数据。
- 参数:
- node_name:第一级键值。
- sub_node_name:可选的下级键值。
- 逻辑:
- 读取 YAML 文件内容。
- 如果 sub_node_name 为空,直接返回第一级键值对应的数据。
- 如果 sub_node_name 不为空,返回第二级键值对应的数据。
- 异常处理:
- 捕获 YAML 解析错误,提示文件格式问题。捕获其他异常,打印错误信息。

2、测试用例

  • 读取单接口多用例、业务场景yaml文件的数据

3、代码

点击查看代码
"""
read_yaml:用于读取 YAML 文件并解析数据,支持多条测试用例。
write_yaml:用于将数据写入 YAML 文件,支持追加和重写模式。
clear_yaml:用于清空 YAML 文件的内容。
get_extract_yaml:用于从 YAML 文件中提取特定的数据,支持多级键值。
"""
import os.path

import yaml
# 引入setting文件中的文件路径FILE_PATH
from configs.setting import FILE_PATH


def read_yaml(yaml_path):
    """
    读取yaml文件数据
    :param yaml_path:文件路径
    :return:
    """
    try:
        testcase_list = []
        with open(yaml_path, 'r', encoding='utf-8') as file:
            data = yaml.safe_load(file)
            # 处理一个yaml文件多条测试用例的场景
            print(len(data))
            if len(data) <= 1:
                yaml_data = data[0]
                base_info = yaml_data.get('baseInfo')
                for ts in yaml_data.get('testCase'):
                    params = [base_info, ts]
                    testcase_list.append(params)
                # print(testcase_list)
                return testcase_list
            else:
                return data
    except UnicodeDecodeError:
        print(f'{yaml_path}文件编码格式错误,--尝试使用utf-8去解码yaml文件发生错误,请确保你的yaml文件是utf-8格式!')
    except Exception as e:
        print(f'读取{yaml_path}文件时出现异常,原因:{e}')


def write_yaml(value):
    """
    yaml文件写入
    :param value:(dict)写入的数据,必须为字典类型
    :return:
    """
    # FILE_PATH由setting文件引入直接使用
    file_path = FILE_PATH['extract']
    # print(file_path)
    # 如果没有变量文件,则新增一个
    if not os.path.exists(file_path):
        with open(file_path, 'w'):
            pass
    file = None
    try:
        # 文件写入方式:a-追加写入,w-清空重写模式
        file = open(file_path, 'a', encoding='utf-8')
        if isinstance(value, dict):
            # allow_unicode=True 允许汉字写入 sort_keys=False写入关键字的不排序
            write_data = yaml.dump(value, allow_unicode=True, sort_keys=False)
            file.write(write_data)
        else:
            print("写入的数据必须为字典类型")
    except Exception as e:
        print(f'写入yaml文件出现异常,原因:{e}')
    finally:
        file.close()


def clear_yaml():
    """
    清空extract.yaml文件的数据
    :return:
    """
    with open(FILE_PATH['extract'], 'w') as f:
        f.truncate()


def get_extract_yaml(node_name, sub_node_name=None):
    """
    # 用于获取extract.yaml文件中的数据
    :param node_name: 第一级key值
    :param sub_node_name: 下级key值
    :return:
    """
    file_path = FILE_PATH['extract']
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            extract_data = yaml.safe_load(file)
            # 如果sub_node_name为空,直接返回第一级的key。
            if sub_node_name is None:
                return extract_data[node_name]
            # 非空的话再次调用下一级的节点
            else:
                return extract_data.get(node_name, {}).get(sub_node_name)
    except yaml.YAMLError as e:
        print(f'读取yaml文件失败,请检查格式-{file_path},{e}')
    except Exception as e:
        print(f'Error:未知异常-{e}')


if __name__ == '__main__':
    res = read_yaml('../../testcase/login/login_business.yaml')
    print(res)

posted @   测试三思  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示