apiFrame_第2篇_用例列表传给parametrize生成多条用例 - 简书 (jianshu.com)
上文yaml用例文件中,同一接口的多条用例,是手动列出来的(复制粘贴,然后修改一些节点的值)。
使用数据驱动优化后的用例:
-
story: 接口名称
parametrize:
- ["title","account","passwd"]
- ["登陆失败用例",[admin],100]
- ["登陆成功用例","admin","admin"]
title: $ddt{title}
request:
method: post
url: ?s=user/login
params:
application: app
json:
account: $ddt{account}
passwd: $ddt{passwd}
extract:
token: $.data.token
nickname: '"nickname":"(.*?)"'
validate:
解析yaml用例:
def load_cases(yaml_relative_path):
"""
从yaml文件读取用例,
:param yaml_relative_path: yaml用例相对项目根目录的路径
:return:返回替换$ddt{xxx}后的测试用例列表
"""
case_list = yaml_util.yaml_load(yaml_relative_path)
# 长度大于1,认为是手动列出的多条用例,没有使用数据驱动
if len(case_list) == 1:
# 用例有parametrize节点,说明用了数据驱动
if "parametrize" in dict(*case_list): # 长度为1的列表直接解包
return ddts(*case_list)
return case_list
def ddts(caseinfo: dict):
"""
:param caseinfo:
:return: 返回替换$ddt{xxx}之后的用例列表case_list_after
"""
case_list_after = []
parametrize_list = caseinfo.pop("parametrize")
name_list = parametrize_list.pop(0)
name_list_len = len(name_list)
# 检查数据个数
flag_len = True
for value_list in parametrize_list:
if len(value_list) != name_list_len:
flag_len = False
print("%s数据个数有误" % value_list)
if flag_len:
# 转成字符串
caseinfo_str: str = yaml.dump(caseinfo)
for val_list in parametrize_list:
caseinfo_str_tmp = caseinfo_str
for y in range(0, name_list_len):
old = "$ddt{%s}" % name_list[y]
new = val_list[y]
caseinfo_str_tmp = caseinfo_str_tmp.replace(old, str(new))
case = yaml.safe_load(caseinfo_str_tmp)
case_list_after.append(case)
pprint(case_list_after)
return case_list_after
返回的用例列表case_list_after
[{'extract': {'nickname': '"nickname":"(.*?)"', 'token': '$.data.token'},
'request': {'json': {'account': ['admin'], 'passwd': 100},
'method': 'post',
'params': {'application': 'app'},
'url': '?s=user/login'},
'story': '接口名称',
'title': '登陆失败用例',
'validate': None},
{'extract': {'nickname': '"nickname":"(.*?)"', 'token': '$.data.token'},
'request': {'json': {'account': 'admin', 'passwd': 'admin'},
'method': 'post',
'params': {'application': 'app'},
'url': '?s=user/login'},
'story': '接口名称',
'title': '登陆成功用例',
'validate': None}]