九、YAML文件中动态解析变量引用(热加载业务场景多接口apiutils_business.py)
RequestsBase
-
init 方法:
- 初始化 ConfigParse、SendRequests 和 Assertions 实例。
- 用于读取配置文件、发送请求和执行断言。
-
parse_and_replace_variables 方法:
- 解析并替换 YAML 数据中的变量引用,如 ${get_extract_data(token)}。
- 支持嵌套数据、单个键值数据和列表数据。
- 使用正则表达式提取变量名和参数,通过 getattr 调用 DebugTalk 类中的方法。
- 使用正则表达式替换原始字符串中的变量引用为实际值。
-
execute_testcase 方法:
- 执行测试用例。
- 解析 baseInfo 和 testCase 信息。
- 调用 SendRequests 发起请求。
- 将返回的数据转换为 JSON 格式。
- 将登录接口的返回值(如 token)写入 extract.yaml 文件。
- 执行结果断言。
-
extract_data 方法:
- 提取单个参数,支持 JSON 提取器。
- 使用 jsonpath 从响应中提取指定路径的值。
- 将提取的值写入 extract.yaml 文件。
-
extract_data_list 方法:
- 提取多个参数,支持 JSON 提取器。
- 使用 jsonpath 从响应中提取指定路径的值。
- 将提取的值写入 extract.yaml 文件。
2、代码
点击查看代码
# 测试用例文件动态解析(热加载)
# 热加载:动态获取接口的返回值或者函数值,作为其它接口的入参数
"""
获取extract全局变量文件中的动态数据
例如extract.yaml文件格式
# 1、键值队嵌套的数据
Cookie:
access_token_cookie: eyJhbGciOiJIUZI1NiISInR5CCI6IkpXVcJ9.eyImcmVzaCI6ZmFsc2USImLhdCI6MTCWNTE5ODAWNSWianRDIiOIZTYINZN
2、单个键值数据
token: B9AD781F4DAD1DAEfabEfC3EeB1EF
userId:'2823362215735222084
3、列表中的数据
goodsId:
- 183827888191
- 172817212121
- 12981982122
- 23123123123
"""
import re
import random
from unit_tools.handle_data.yaml_handler import get_extract_yaml
from datetime import date
class DebugTalk:
def get_extract_data(self, node_name, out_format=None):
"""
获取extract.yaml数据,1、嵌套取值 2、单个取值 3、列表取值
首先判断out_format是否为数字类型,如果是就是列表取值,如果不是就是获取下一个节点的value
:param node_name: extract.yaml文件中的key
:param out_format: str类型,0:随机取读取;-1:读取全部数据,返回字符串格式;-2:读取全部数据,返回是列表格式;其它值就是顺序读取
:return:
"""
data = get_extract_yaml(node_name)
if out_format is not None and bool(re.compile(r'^[+-]?\d+$').match(str(out_format))):
out_format = int(out_format)
data_value = {
out_format: self.seq_read(data, out_format),
0: random.choice(data),
-1: ','.join(data),
-2: ','.join(data).split(',')
}
data = data_value[out_format]
else:
data = get_extract_yaml(node_name, out_format)
return data
def seq_read(self, data, randoms):
"""获取extract.yaml,第二个参数不为0,-1,-2的情况下"""
if randoms not in [0. - 1. - 2]:
return data[randoms - 1]
else:
return None
# 获取系统当前日期,不带时分秒
def get_now_time(self):
return date.today()
# 获取请求头header
def get_headers(self, params_type):
"""
根据参数params_type,返或header格式:表单还是json
:param params_type:
:return:
"""
headers_mapping = {
'data': {'Content-Type': 'application/x-www-formurlencoded;charset=UTF-8'},
'json': {'Content-Type': 'application/json;charset=UTF-8'}
}
header = headers_mapping.get(params_type)
if header is None:
print('不支持的请求格式,只支持表单和json格式')
return header
if __name__ == '__main__':
debug = DebugTalk()
# 获取嵌套数据
res = debug.get_extract_data('Cookie', 'access_token_cookie')
# 获取列表数据
# res = debug.get_extract_data('goodsId','0')
# 获取单个键值
# res = debug.get_extract_data('token')
print(res)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架