在测试工作中,一般都会接触到期望结果数据与实际结果数据一致性比对的测试场景,对于复杂、庞大数据的比对工作。如果依靠人工执行,其成本相当高,难以保障执行结果的一致性(多次执行可能存在偏差),并且重复性极高。因此,通常大家需要考虑如何通过自动化工具实现数据的比对。
之前分享过《Python实现复杂场景下文本数据的一致性比对》文章,主要应用于文件一致性比对的测试场景。今天分享下如何实现Json数据的一致性校验的整体设计与实现。
JSON的两种数据结构
1.Key-Value对集合,在Python语言中可以理解为字典(Dict),如下图。
2.有序集合,在Python语言中可以理解为列表(List),如下图。
一致性校验核心设计
在测试工作中接触的Json数据校验,大多是请求响应体的校验,设计主要考虑了以下两点:
1.需支持复杂JSON比对,如查询地市编码基本信息接口的响应体中包含,省份编码、省份地市的基本信息(地市编码、地市名称、地市排序),例如:
2.需支持比对结果的可追溯,比如地市数量(Count)不一致时,不能仅输出期望、实际结果的地市数量,还需要输出整个JSON的哪个节点的值不一致,或者缺失哪个节点,如Detail.Count的值不一致,例如:
[ERROR]ACTUAL-JSON==>[Detail.Count]的VALUE不同:<actual>:2<expect>:3
设计实现
一致性比对的整体设计包含三个模块:递归解析模块,格式转换模块,数据比对模块,具体描述如下。
递归解析模块
递归解析,按key的层次关系,每层生成数据结构为[[key1,key2,value1],[key1,key2,value2]],代码设计如下:
格式转换模块
创建节点流及值映射,数据结构为{key1.key2:value1,key1.key3:value2},如下
数据比对模块
针对格式转换模块的结果,遍历比对各节点流(如,Detail.City.sort),校验节点与值是否一致,对于不一致的数据输出节点流及值,输出节点流及值,如下。
结果输出如下:
[ERROR]ACTUAL-JSON==>[Detail.Count]的VALUE不同:<actual>:2<expect>:3
若对你有所帮助,欢迎大家评论、留言。