简介:
这是一个功能强大的 JSON 校验工具库,提供了灵活的 JSON 比较和自定义校验功能。
在java的单元测试中,可以轻松地使用这个工具库进行 JSON 数据的校验,并在测试失败时,会显示详细的差异信息,帮助开发人员快速定位问题。
核心功能:
-
**基础类型校验**: 支持字符串、数字、布尔值、数组、对象等基础数据类型比较
-
**嵌套结构校验**: 支持多层嵌套 JSON 结构的深度比较
-
**自定义校验器**: 提供扩展接口,支持自定义校验逻辑
1. 基础校验
-
**数值比较**: 支持整数、浮点数比较
-
**字符串比较**: 严格字符串匹配
-
**布尔值比较**: 真假值校验
-
**数组校验**: 按顺序比较数组元素及长度
-
**对象校验**: 递归比较对象属性
2. 自定义校验器
-
**[IgnoreCheck]**: 忽略指定字段的校验
-
**[TimeCheckNow]**: 时间字段与当前时间比较
-
**[RegexCheck]**: 正则表达式校验
-
**[TimeCheck]**: 多格式时间校验
3. 使用示例
该包发布于github,maven引入:
<dependency>
<groupId>github.ccg</groupId>
<artifactId>ccg-test</artifactId>
<version>1.0.0</version>
</dependency>
项目地址:https://github.com/5499ccg/ccg-test
基础校验
```java
JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述");
```
带自定义校验器
```java
Check ignoreId = Check.ignore("datas.id");
JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述", ignoreId);
```
时间校验
```java
Check timeNow = Check.timeNow("createTime");
JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述", timeNow);
```
正则校验
```java
Check regexCheck = Check.regex("^\\d{4}$", "id");
JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述", regexCheck);
```
错误处理:
-
**详细错误信息**: 提供清晰的差异对比信息
-
**路径定位**: 显示差异字段的完整路径
-
**格式化输出**: 自动格式化 JSON 输出便于查看

测试覆盖
-
**单层校验**: 基础数据类型比较
-
**多层校验**: 嵌套结构比较
-
**边界情况**: null 值、缺失字段处理
-
**自定义校验**: 各种校验器功能测试
优势
-
**灵活性**: 支持自定义校验器扩展
-
**准确性**: 深度比较,精确定位差异
-
**易用性**: 简洁的 API 设计
-
**可维护性**: 清晰的架构设计
适用场景
-
API 响应数据校验
-
JSON 数据一致性检查
-
单元测试中的数据验证
-
数据迁移校验
如果你有任何问题或者新的功能需求,欢迎提issue,或加好友讨论:549958058。
@DataProvider(name = "data_jsonCompare_checkImpl")
public Object[][] data_jsonCompare_checkImpl() {
return new Object[][]{
{"1.json两层,id存在差异,忽略校验", "1_json_2floor_diff_and_ignore", true},
{"2.json两层,实际数据的id不存在,忽略校验", "2_json_2floor_actual_isNull_and_ignore", true},
{"3.json两层,期望的数据的id不存在,忽略校验", "3_json_2floor_expect_isNull_and_ignore", true},
{"4.json两层,id差异忽略校验,期望数据与当前时间比较", "4_json_2floor_idIgnore_time_compareToNow", true},
{"5.json两层,id差异,使用正则表达式校验,校验通过", "5_json_2floor_id_regexCheck_pass", true},
{"6.json两层,id差异,使用正则表达式校验,校验不通过", "6_json_2floor_id_regexCheck_error", false},
{"7.json两层,id和joinDate差异,一起忽略", "7_json_2floor_id_and_joinDate_ignore", true},
};
}
@Test(dataProvider = "data_jsonCompare_checkImpl")
public void test_jsonCompare_checkImpl(String comment, String testNo, boolean pass) throws Exception {
logger.info("test_jsonCompare_checkImpl test start: {}, {}.", comment, testNo);
Map<String, String> params = new HashMap<>();
params.put("nowDate", DateParseUtil.formatDateToStandard(new Date()));
// 1.获取需要校验的json
String expectedJson = FileTools.readAsStringByPathAndStack(testNo + "/expectData.json");
String actualJson = FileTools.readAsStringByPathAndStack(testNo + "/actualData.json", params);
List<Check> checks = new ArrayList<>();
// 2.设置字段自定义校验器,这里忽略id
checks.add(testNo.contains("id_and_joinDate_ignore") ? Check.ignore("datas.id", "datas.joinDate") : Check.ignore("datas.id"));
if (testNo.contains("compareToNow")) {
checks.add(Check.timeNow("datas.joinDate"));
}
// 这里是正则表达式
if (testNo.contains("regexCheck")) {
if (pass) {
checks.add(Check.regex("^\\d{4}$", "datas.id"));
} else {
checks.add(Check.regex("^\\d{5}$", "datas.id"));
}
}
try {
// 开始校验
JsonAssert.assertJsonEquals(expectedJson, actualJson, comment, checks.toArray(new Check[0]));
if (!pass) {
Assert.fail(comment);
}
} catch (AssertionError e) {
if (!pass) {
String message = e.getMessage();
logger.error(e);
String expectMessage = FileTools.readAsStringByPathAndStack(testNo + "/diff_error.txt");
Assert.assertEquals(message, expectMessage, comment);
// throw e;
}
}
}