五、封装读写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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架