6--api数据驱动思考优化
day7
1.数据驱动替换yaml中$ddt{...}的时候,数据驱动可能返回的int 或者 float,直接替换后yaml里会加上字符串的“”,需要处理,和交换方法里面的替换方法一样
思考:
2. 为什么数据驱动时候需要使用temp去接收?casesinfo_temp = casesinfo_str?
现象:需要借助casesinfo_temp替换后,加载列表才会出现正确的参数化数值,如果不用casesinfo_temp中间接收,返回的数据都是正例下两个一样数据
本质:如果不赋值到第三方变量,第一次替换后就修改了caseinfo_str的值,第二次替换导致caseinfo_str中找不到ddt{}这种标识,导致两次循环返回的数据都一样
3.为什么casesinfo_temp = casesinfo_str,放置的位置在遍历行以后,不放在循环外?
因为需要几个数据,就有几行,每一次循环行就把原始的数据赋值给casesinfo_temp, 再替换,数据结构刚刚合适;如果把临时变量放在循环外,就只会赋值一次,
,第二次数据驱动的方法就获取不到带有$ddt{}这种类型的yaml文件,导致第二次的驱动无效,就和2问的本质一个意思。
ddt_util.py
""" @Filename: common/ddt_util @Author: Titen @Time: 2022/5/10 14:27 @Describe: 数据驱动的方法 """ import json from pprint import pprint import yaml from common.yaml_util import get_root_cwd def read_cases_yaml(path): with open(get_root_cwd()+"/cases_yamls/"+path,encoding="utf-8",mode="r") as f: casesinfo = yaml.load(stream=f,Loader=yaml.FullLoader) #如果列表的数据大于2直接返回,对应数据做数据驱动 if len(casesinfo)>=2: return casesinfo else: #如果只有一个yaml文件再判断 if "parameterize" in dict(*casesinfo).keys(): new_caseinfo = ddt(*casesinfo) pprint("--- %s" % new_caseinfo) return new_caseinfo else: return casesinfo def ddt(casesinfo): #表转化yaml里面的parameterize数据: casesinfo_str = json.dumps(casesinfo) datalists = casesinfo["parameterize"] len_success = True for datalist in datalists: if len(datalists[0]) != len(datalist): len_success = False print("接口数据驱动数据%s有误" % datalist) continue #长度一致就进行数据驱动 new_caseinfo_list = [] if len_success: #遍历行 for x in range(1,len(datalists)): casesinfo_temp = casesinfo_str for y in range(0,len(datalists[0])): if isinstance(datalists[x][y],int) or isinstance(datalists[x][y],float): casesinfo_temp = casesinfo_temp.replace('"$ddt{'+datalists[0][y]+ '}"',str(datalists[x][y])) else: casesinfo_temp = casesinfo_temp.replace("$ddt{"+datalists[0][y]+"}",str(datalists[x][y])) new_caseinfo_list.append(json.loads(casesinfo_temp)) return new_caseinfo_list
4.数据驱动处理数据类型后,如果替换后的值为int,在包含的断言里面需要做调整,实际和预期的值都需要强转为字符串str(validate_value) not in str(sj_result)
包含断言:
#包含断言 def assert_contains(sj_result,validate_value): flag = 0 if str(validate_value) not in str(sj_result): flag = flag +1 print("包含断言失败") return flag
本文来自博客园,作者:Titen,转载请注明原文链接:https://www.cnblogs.com/chengxiazuohua/p/16257233.html