目录
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()里面的只能是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