在yaml用例中,(1)如果参数的值需要由函数生成,比如时间戳、随机数等,(2)或者在接口关联时从文件extract.yml中读取上个接口返回的字段。此时yaml用例参数的值如何写?如何在发送请求前替换成由函数生成的值?
热加载:
def replace_hotload(self, caseinfo: dict):
"""
使用正则找到用例中所有函数表达式
通过反射获取函数返回值
替换用例里的函数表达式
例如在yaml用例中:
#多个参数。逗号后面不要加空格
timestamp: ${timestamp(%Y%m%d%H%M%S,param1)}
#无参
timestamp1: ${timestamp()}
:param caseinfo: 用例,字典格式
:return:返回替换后的用例
"""
case_str = yaml.dump(caseinfo) # 字典转字符串
pattern = "\\${(.*?)\\((.*?)\\)}" # 字符$和左右小括号()需要转义
fn_list = re.findall(pattern, case_str) # [('timestamp', '%Y%m%d%H%M%S,param1'), ('timestamp', '')]
if len(fn_list) > 0:
for fn in fn_list:
# 无参
if fn[1] == '':
# 反射。通过类的对象、成员函数名和实参获取函数返回值
new_fn_value = getattr(DebugTalk(), fn[0])()
# 1个或多个参数
else:
new_fn_value = getattr(DebugTalk(), fn[0])(*(fn[1].split(','))) # 解包
old_fn_exp = "${%s(%s)}" % fn # 需要替换的函数表达式。fn是元组
case_str = case_str.replace(old_fn_exp, str(new_fn_value))
# 转成字典
caseinfo = yaml.safe_load(StringIO(case_str))
return caseinfo
DebugTalk类:
class DebugTalk:
def timestamp(self, p1='', p2=''):
print('++', p1, p2)
return 'time12'