从0开始python学习-46.pytest框架之通过yaml处理接口关联问题-针对变量处理

目录

1. 提取变量

1.1 提取方法

1.2 提取地方:响应的body,响应的cookie,响应头

1.3 提取方式:

1.4 示例:在能获取到对应token的yaml用例中写入

2.使用变量:封装一个通用extract_util.py

3. 调用测试用例,使用变量


1. 提取变量

1.1 提取方法

extract: 
    保存值的变量名: [提取地方,提取方式,提取之后的下标取值]

1.2 提取地方:响应的body,响应的cookie,响应头

print(res.text)            # 返回字符串类型的数据
print(res.content)         # 返回二进制类型的数据
res.json()                 # 把json字符串转化为字典格式返回
print(res.status_code)     # 状态码
print(res.reason)          # 状态信息
print(res.cookies)         # cookie信息
print(res.encoding)        # 编码格式
print(res.headers)         # 响应头
print(res.elapsed)         # 耗时
print(res.request.method)  # 请求方式
print(res.request.url)     # 请求路径
print(res.request.headers) # 请求头
print(res.request.body)    # 请求数据

1.3 提取方式:

正则表达式:re.findall(pattern, string)

jsonpath:jsonpath.jsonpath(obj, expr)

1.4 示例:在能获取到对应token的yaml用例中写入

extract: 
  access_token: [json,"$.access_token",0]
  csrf_token: [text,'name="csrf_token" value="(.*?)"',0]

2.使用变量:封装一个通用extract_util.py

class ExtractUtil:

   # 解析提取变量
    def extract(self,res,var_name,attr_name,expr:str,index):
        # 通过深拷贝,将数据拷贝一份出来,且不影响源数据
        new_res = copy.deepcopy(res)
        # 将json()修改为json属性,用于反射使用,如果无法获取到new_res.json()抛出异常
        try:
            new_res.json = new_res.json()
        except Exception:
            new_res.json = {"msg":'response not json data'}
        # 通过反射获取属性的值
        data = getattr(new_res,attr_name)
        # 判断使用的是什么提取方式
        if expr.startswith('$'):
            # json提取方式
            list = jsonpath.jsonpath(dict(data),expr)
        else:
            # 正则提取方式
            list = re.findall(expr,data)
        # 通过下标进行取值,并写入extract.yaml文件中
        if list: # 当list不为空,即提取到了数据
            writer_yaml({var_name:list[index]})

    # 解析使用变量,把${access_token}替换从extract.yaml里面提取的具体的值
    def use_extract_value(self,request_data: dict):
        # 1.把字典转为字符串,因为使用替换的方法Template()里面的只能是string
        data_str = yaml.safe_dump(request_data)
        # 2.字符串替换,将extract.yaml中的所有获取到的数据,替换到需要使用${access_token}的yaml文件
        new_request_data = Template(data_str).safe_substitute(read_all())
        # 3.把字符串还原成字典,因为最后接收的还是dict,所以需要还原回去
        data_dict = yaml.safe_load(new_request_data)
        return data_dict

3. 调用测试用例,使用变量

1. extract()方法为通过接口的响应提取需要的变量,如token,所以是在请求之后执行

2. use_extract_value()方法为使用提取到的变量进行入参使用,所以是在请求之前执行

3. 一定要注意用例的执行顺序,不然这里可能就无法正确提取使用

def create_testcase(yaml_path):
    @pytest.mark.parametrize('caseinfo', read_testcase(yaml_path))
    def func(self,caseinfo):
        # 读取yaml文件中的请求四要素
        new_caseinfo = verify_yaml(caseinfo)
        # 使用提取的值
        new_request = eu.use_extract_value(new_caseinfo.request)
        # 发送请求
        res = RequestUtil().send_request(**new_request)
        # 在请求之后得到的响应去提取需要的变量
        if new_caseinfo.extract: # extract存在的情况,则将值获取
            for key,value in new_caseinfo.extract.items():
                eu.extract(res,key,*value)

    return func

从0开始python学习-46.pytest框架之通过yaml处理接口关联问题-针对变量处理_第1张图片从0开始python学习-46.pytest框架之通过yaml处理接口关联问题-针对变量处理_第2张图片

你可能感兴趣的:(python,学习,python,pytest,开发语言,测试用例)