八、YAML文件中动态解析变量引用(热加载单接口多用例场景apiutils_single.py)
实现功能:
执行接口测试用例的工具类 RequestsBase,它支持动态解析和替换 YAML 文件中的变量引用,并能够处理接口返回值的提取和断言。
1、函数设计
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、测试用例
单接口用例
3、代码
点击查看代码
# 测试用例文件动态解析(热加载)
# 热加载:动态获取接口的返回值或者函数值,作为其它接口的入参数
"""
获取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)
浙公网安备 33010602011771号