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

 

posted on 2022-05-11 11:27  Titen  阅读(54)  评论(0编辑  收藏  举报

导航