比较两个嵌套字典的值是否相等,不相等,打印出错误value的key路径
#!/usr/bin/python # -*- encoding: utf-8 -*- def check_result(actual_result, expect_result, ignore=None): ''' 检查重启前后数据是否一致 :param actual_result: 实际的数据 :param expect_result: 期望的数据 :param ignore: 忽略不进行比较的键 :return: 返回检查结果 ''' failed = [] check_rest = True def check_data(actual, expect, ignore=None, path=''): ''' 检查重启前后数据是否一致 :param actual: 实际的数据 :param expect: 期望的数据 :param ignore: 忽略不进行比较的键 :return: 返回检查结果和失败的value在原数据中的键路径 ''' ignore = ignore if ignore else [] dict_type = [dict] array_type = [list, tuple, set] actual_type = type(actual) expect_type = type(expect) # 检查数据类型一致 if actual_type == expect_type: check_ret = True # 判断数据类型为数组类型, 且数据中元素相等 if actual_type in array_type: if len(actual) == len(expect): for act_ele, exp_ele in zip(actual, expect): ret = check_data(act_ele, exp_ele) check_ret = ret if not ret and check_ret else check_ret return check_ret else: return '数据的元素不一致, actual: %s, expect: %s' % (actual, expect) # 判断数据类型为键值对类型 elif actual_type in dict_type: actual_keys = sorted(actual.keys()) expect_keys = sorted(expect.keys()) # 检查数据的键值对相同 if actual_keys == expect_keys: for key in actual: # 检查key是否需要检查 if key not in ignore: ret = check_data(actual[key], expect[key], path=path + '/' + key) check_ret = ret if not ret and check_ret else check_ret return check_ret else: return '数据的key不一致, actual_keys: %s, expect_keys: %s' % (actual_keys, expect_keys) # 判断数据类型不为容器类型, 比较值的是否相等 else: if actual == expect: return True else: failed.append(path) return False else: return '数据的数据类型不一致, actual_type type: %s, expect_type type: %s' % (actual_type, expect_type) check_ret = check_data(actual_result, expect_result, ignore=ignore) check_rest = check_ret if not check_ret and check_rest else check_rest return check_rest, failed