最近在做接口自动化断言时,每个接口文件里都写了一遍提取接口响应数据,然后append到列表里,传给公共的断言方法与sql查询出来的数据做比对,这样如果是100个接口,每个接口都写一遍接口响应数据提取,就要写100遍,太过依赖于返回数据的格式了,如果list里面多嵌套几层,而且都要效验,那....,通用性也不好,据说递归可以实现此通用方法,可以 一层一层拆,提取出自己想要的数据,组装一个 自己的数据组,然后和 预期结果一组一组对比,实现公共断言方法。
直接或间接的调用自身的函数,称为递归函数。函数递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件
递归函数特性:
1、必须有一个明确的结束条件;
2、每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3、相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
4、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
5、递归次数有上限
for循环实现1-100的和:
def sum():x=0for i in range(1,101):x+=ireturn x
print(sum())"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
5050Process finished with exit code 0
递归实现1-100的和:
def sum(max):if max>=0 and max<=100:return max+sum(max-1)else:return 0
print(sum(100))"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
5050Process finished with exit code 0
json串是一个列表类模块的接口响应数据,我想断言接口响应的字段created_at和updated_at,使用递归将这2个字段值提取出来,append到列表里与sql查询库里的created_at和updated_at两个字段做对比,所有同类型接口的断言可使用此公共方法进行断言。
接口响应json串如下:
json_data={'count_tab_4': 13,'total': 13,'list': [{'created_at': '2019-12-19 16:10:01','updated_at': '2019-12-19 16:15:01','company': {'full_name': '项目','short_name': '项目简'},'task_sex': 1,'task_user_id_card': '610523198806273676','task': {'type_child_name': '软件开发','users_type_txt': '用户'}}, {'created_at': '2019-12-17 11:25:02','updated_at': '2019-12-17 11:30:02','company': {'full_name': '项目','short_name': '项目简'},'task_sex': 1,'task_name': '啊啊啊任务啊啊','task': {'type_child_name': '软件开发','users_type_txt': '用户'}}],'page_size': 10,'page': 1
}方法实现,提取created_at和updated_at的value组合成list:
response_values=[]
def test(response_data,keys=[]):if isinstance(response_data,list):for value in response_data:if isinstance(value,list) or isinstance(value,dict):test(value,keys)elif isinstance(response_data,dict):for i,j in response_data.items():if i in keys:response_values.append(j)else:test(j,keys)else:passtest(json_data,['created_at','updated_at'])
print(response_values)"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
['2019-12-19 16:10:01', '2019-12-19 16:15:01', '2019-12-17 11:25:02', '2019-12-17 11:30:02']Process finished with exit code 0