目录
1. 提取变量
1.1 提取方法
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()里面的只能是stringdata_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