前言
一个测试小需求,开发将接口返回的数据输入到oracle中,将数据库中的数据与接口返回的数据进行diff check
需求很简单,但是数据量十分庞大,如果手工测试不仅效率低,需要更多的测试人员,而且测试点的覆盖率不会很全面,因此当然是写一个简单的脚本。
工具
Mac OS、oracle以及Python3.9
一、具体内容
前几个维度没有开发逻辑,因此脚本相对比较好写,可以将oracle的相关数据转换为json格式,然后与接口返回的json
数据进行diff
(可以用deepdiff这个第三方库,很好用,感觉可以更深层次的开发),但是股权穿透需要穿三层股权关系,而且涉及开发逻辑,因此用上了许久不用的数据结构。
看这个维度容易让人望文生义,一个简单的链表加数组就可以解决,但其中必须要有股权关系的逻辑路线,思来想去,决定用森林实现。
二、N叉树的实现
幸运的是,前人已经栽好了树,treelib这个第三方库专门为实现N叉树设计。具体接口类所暴露的方法可以看官方文档(建议)。原本想将接口数据的关系id放入节点中,但遗憾的是,调试过程中发现节点的id不可以重复。。。于是决定用最笨的方法,随机一个10000至99999之间的五位数然后和逻辑id进行拼接,这样就解决了id重复的问题(五位数的随机偶尔也有重复的情况。。。很偶尔)。这样一个N叉树就实现了。具体代码如下:
from treelib import Tree
import csv
import json
import random
def get_tree(list):
tree = Tree()
str1 = str(list['id']) + str(random.randint(10000,99999))
tree.create_node(str1, str1)
if list['children'] != '[]':
for i in range(len(list['children'])):
str2 = str(list['children'][i]['id']) + str(random.randint(10000,99999))
tree.create_node(str2, str2, parent=str1)
if list['children'][i]['children'] != '[]':
for j in range(len(list['children'][i]['childern'])):
str3 = str(list['children'][i]['children'][j]['id']) + str(random.randint(10000,99999))
tree.create_node(str3, str3, parent=str2)
return tree
三、根结点的关联关系
构建好了若干的N叉树,如何将他们关联在一起?最后想到用map的映射关系,Python中的dict正合适,将接口id与以此id为根结点的树进行映射,将他们存储在dict中,这样就可以实现逻辑搜索了,代码很简单,如下所示:
def main():
file_path1 = '/Users/cuijianwei/归档/pen-investtree'
file_path2 = '/Users/cuijianwei/删除/CORP_NAME_LIST_455_20210819164633.csv'
s = split_node_info(file_path1)
p = read_csv_dic(file_path2)
dict = {}
for i in range(len(s)):
tree = get_tree(s[i])
dict[str(s[i]['id'])] = tree
diff_check(p, dict)
这样一个简易版的森林就完成啦