Java实现 Json、String、Integer等对象的数据一致性的精确比对


Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
我们在接口自动化测试过程中 , 或多或少会遇到当比较接口返回结果时 , 如果将结果作为一个整体的对象进行比较 , 假如断言失败时 , 那我们将会看到一大坨期望和实际结果数据 , 很难一眼就看出具体是因为哪一部分不一致而导致的比对失败 , 这也增加了我们的接口自动化维护成本 。
本文主要围绕这一痛点 , 解决 JsonObject、JSONArray、String、Integer 对象的精确比较问题 , 并提供统一的Java实现方法 Compare.CompareFactory , 希望对大家有所帮助 。
先睹为快 , 让我们直接来看下效果如何 , 此外 , 文末附 Python 具体实现设计 。
JSONObject 对象的一致性比对如下 , 先准备两个测试数据 , 我们可以看到测试数据的结构还是比较复杂的 , 其中左侧和右侧不一致的地方共有7处 , 如黄色框处的位置 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
首先看一下 , 如果直接断言 , 我们看到的结果是什么样的 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
正如开篇所提 , 想要找出其中的不同 , 实在... 简直...。
然后 , 使用 Compare.CompareFactory 方法 , 执行过程中的打印结果如下 , 我们可以看到每个节点的比较结果都非常清晰的打印出来了 , 并且key 的描述也是含JSON层级关系的 , 如 "regional.city[0]"。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
再然后 , 看下 Compare.CompareFactory 方法的返回结果 , 我们将返回对象使用JSONObject.toJSONString 转换成字符串后 , 如下 , resultDetail 属性记录了每个错误节点的期望和实际数据值 , wrongNumber 属性统计了错误数量 , 清晰明了 , 简单直白 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
最后 , 看下代码 , 因为我将测试数据放到 yaml 文件中 , 因为其中部分代码是在加载测试数据 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
JSONArray 对象的一致性比对首先 , 准备如下两个测试数据 , 其中左侧和右侧不一致的地方共有 5 处 , 如黄色框处的位置 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
然后 , 使用 Compare.CompareFactory 方法 , 执行过程中的打印结果如下:
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
再然后 , 我们看下 Compare.CompareFactory 方法的返回结果 , 如下:
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
最后 , 我们看下示例代码 , 因为我将测试数据放到Yaml文件中 , 所以其中部分代码是在加载测试数据 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
String、Integer、Long 对象的一致性比对String、Integer、Long 对象的比对 , 同样也是使用 Compare.CompareFactory 方法完成 , 示例代码如下:
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
因为String、Integer、Long不存在KV映射 , 因此比较结果中key显示为null 。 如下:
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
还提供了哪些特性?肯定有小伙伴会问 , 在做接口返回结果的校验时 , 并不是全部的数据都需要一一进行比对 , 比如时间属性 , 因为每次可能返回的时间不同 , 但本身不影响结果的准确性 , 所以不需要进行比较 。那Compare.CompareFactory 方法是否不支持过滤某些属性不比较呢?——那当然是支持的咯 , 细心的小伙伴 Compare.CompareFactory 的有三个参数 , 那第三个是干嘛的呢?其实第三个参数就是描述需要过滤的属性的 , 如果需要过滤多个属性使用英文逗号隔开即可 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
比如 , 我们将上图例子中的实际和期望结果不一致的 code、designation、hobby_id、desc 4个属性过滤掉不比较 , 代码如下 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图
运行代码 , 我们可以看到比对结果中 , 只存在三处不一致的地方 , 即实现了过滤比较 。
Java实现 Json、String、Integer等对象的数据一致性的精确比对文章插图