方法测试:
测试请求数据读取情况,读出来最终url,headers,data
测试读取,按照注释的格式来(设计时各种报错)
data_is_replace()判断数据需不需要替换,data有可能是空,因为一些接口不需要请求参数,或者不需要提取接口返回值
搞个代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@time : 2022/6/14
@Author : LL
@File : parameter_setting.py
参数处理
'''
from jsonpath import jsonpath
class ParameterSetting:
# 参数存放和提取
access_value = {'b': 213, 'g': 21}
@classmethod
def data_is_replace(cls, data):
'''
:param data: 请求参数data和提取参数extract_key
:return: 返回参数是否需要被替换
'''
if data is None:
return False
for k, v in data.items():
if '$.' in v:
return True
return False
@classmethod
def parameter_setting(cls, data: dict, type='get'):
'''
:param data: 返回结果提取和参数依赖使用dict 例:{'bill': '$.bill'}
:param type: save :把数据存到参数池里面无返回,get读取参数池数据并返回新值
:return:
'''
if type == 'get':
# {'b': '$.b','g':'$.g'} 提取格式键+提取表达式
for k, v in data.items():
if '$.' in v:
v = jsonpath(cls.access_value, v)[0]
data[k] = v
print(f'最终返回参数:{data}')
return data
elif type == 'save':
# {'a':44,'a1':144} 键 + 明确的值
for k, v in data.items():
# 把data的键值添加到参数池里面
cls.access_value[k] = v
if __name__ == '__main__':
# 测试参数存储
ParameterSetting.parameter_setting({'a': 44, 'a1': 144}, 'save')
# 测试参数读取
ParameterSetting.parameter_setting({'b': '$.b', 'g': '$.g'})
print(f'最终的参数池{ParameterSetting.access_value}')
测试
测试代码这里使用了生成器来一条一条的返回 生成器我之前写过一篇 python生成器+pytest实现参数化
我把新列表(已经把json表达式替换成了值)遍历解析每一个断言元素时遇到 requires string as left operand, not int报错,大概意思就是
我在把这个12加上了单引号[“‘12’ in ‘123’”, ‘ig == $.ig’], 然后后面的 'ig == $.ig’又出现了新问题,ig变量未定义,ig本来是‘ig’为字符串,但是被eval()函数处理后就会变成ig,是一个变量
于是我又给ig加上了引号
可是被替换为值的TheShy被eval()函数处理后又成了变量,我想着给"$.ig"加上引号,可是在jsonpath提取时出现了问题
打印下我的提取表达式提取表达式格式错误了,没取到值。发现我给之前的表达式加上了引号,我提取表达式是通过符号的索引位置到最后一个索引位置,现在我只能取倒数第二个索引位置
经过我的一顿操作,勉强解决问题,需要完善一下这个方法
方法完善,大改一波,测试结果,但是这里出现的问题,不得不修改用例模板断言列表的编写格式
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@time : 2022/6/15
@Author : LL
@File : assert_.py
断言格式 ["1=='1'", "cc=='dad'", "12 in '123'", 'ig in $.lpl.ig']
'''
from jsonpath import jsonpath
class Assert:
@classmethod
def assert_response(cls, assert_list: list, api_response: dict):
new_assert_list = []
for i in assert_list:
if '$.' in i:
# 获取$的索引位置
wz = i.find('$')
# 切片出表达式
json_path = i[wz:len(i) - 1]
# 把表达式转换为值
value = jsonpath(api_response, json_path)
if not value:
print('表达式提取失败,请检查')
return False
value = value[0]
# 用值把表达式替换掉(注意这个需要用变量接住这个替换的新值)
i = i.replace(json_path, value)
new_assert_list.append(i)
print(f'断言新列表:{new_assert_list}')
#判断每个断言的成功或者失败
assert_result_list=[]
for i in new_assert_list:
assert_result = eval(i)
print(f'断言表达式{i},断言结果{assert_result}')
assert_result_list.append(assert_result)
#如果断言结果列表里面有一个失败,那就断言失败
if False in assert_result_list:
return False
return True
if __name__ == '__main__':
print(Assert.assert_response(["'12' in '123'", '"ig" == "$.ig"', '1==1'], {'id': 1, 'ig': 'TheShy'}))
10.用例格式更改,还是使用原始列表格式写断言列表



