Python递归通用接口响应深层提取

       最近在做接口自动化断言时,每个接口文件里都写了一遍提取接口响应数据,然后append到列表里,传给公共的断言方法与sql查询出来的数据做比对,这样如果是100个接口,每个接口都写一遍接口响应数据提取,就要写100遍,太过依赖于返回数据的格式了,如果list里面多嵌套几层,而且都要效验,那....,通用性也不好,据说递归可以实现此通用方法,可以 一层一层拆,提取出自己想要的数据,组装一个 自己的数据组,然后和 预期结果一组一组对比,实现公共断言方法。

直接或间接的调用自身的函数,称为递归函数。函数递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件

递归函数特性:
1、必须有一个明确的结束条件;
2、每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3、相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
4、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

5、递归次数有上限

for循环实现1-100的和:


def sum():
	x=0
	for i in range(1,101):
		x+=i
	return x
print(sum())

"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test01.py
5050

Process 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
5050

Process 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:
        pass

test(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


 

你可能感兴趣的:(Python接口自动化,python)