做接口自动化时,我们要对接口返回内容校验。Rest Api通常返回的结果是Json。如果只校验成功与否或者个别字段,你会放心吗?理想的情况我们想对整个返回Json校验。我们不可能每个字段都写一个Assert语句。如果直接Json和Json比较又会因为结点顺序或者个别字段每次都变动造成测试用例不稳定。很多同学会选择自己开发一个Json比较的类库去忽略结点顺序或者某段字段值。与其闭门造车,不如站在巨人肩上。偶尔在Github发现了JsonUnit,正是自己想要的。
依赖
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.11.1</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.json-unit</groupId>
<artifactId>json-unit-assertj</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
</dependencies>
不一定要引入gson,引入gson或jackson都行。如果一个都不引入会报错。
小试牛刀
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.json;
assertThatJson("{\"a\":1, \"b\":2}").as("两个Json模糊比较")
.isEqualTo("{b:2, a:1}");
JsonUnit支持AssertJ和Hamcrest,我这里的例子是AssertJ。
忽略路径
assertThatJson("{\"root\":{\"test\":1, \"ignored\": 1}}")
.whenIgnoringPaths("root.ignored"))
.isEqualTo("{\"root\":{\"test\":1}}");
如果要忽略多路径怎么办呢?用,分开
忽略值
assertThatJson("{\"a\":1}")
.isEqualTo(json("{\"a\":\"${json-unit.ignore}\"}"));
忽略元素
assertThatJson("{\"a\":1}")
.isEqualTo(json("{\"a\":\"${json-unit.ignore}\"}"));
JsonPath
assertThatJson(response.asString())
.inPath("$.data.list")
.isArray()
.contains(json(expMap.get("xx")
.getExpJson()));
类型占位符
assertThatJson("{\"test\":\"value\"}")
.isEqualTo("{test:'${json-unit.any-string}'}");
assertThatJson("{\"test\":true}")
.isEqualTo("{\"test\":\"${json-unit.any-boolean}\"}");
assertThatJson("{\"test\":1.1}")
.isEqualTo("{\"test\":\"${json-unit.any-number}\"}");
正则表达式
assertJsonEquals("{\"test\": \"${json-unit.regex}[A-Z]+\"}",
"{\"test\": \"ABCD\"}");
选择项
TREATING_NULL_AS_ABSENT - 把Null当作不存在
assertJsonEquals("{\"test\":{\"a\":1}}",
"{\"test\":{\"a\":1, \"b\": null, \"c\": null}}",
when(TREATING_NULL_AS_ABSENT));
IGNORING_ARRAY_ORDER - 忽略数组元素顺序
assertJsonEquals("{\"test\":[1,2,3]}",
"{\"test\":[3,2,1]}",
when(IGNORING_ARRAY_ORDER));
IGNORING_EXTRA_ARRAY_ITEMS - 忽略多余的元素
assertJsonEquals("{\"test\":[1,2,3]}",
"{\"test\":[1,2,3,4]}",
when(IGNORING_EXTRA_ARRAY_ITEMS));
assertJsonEquals("{\"test\":[1,2,3]}",
"{\"test\":[5,5,4,4,3,3,2,2,1,1]}",
when(IGNORING_EXTRA_ARRAY_ITEMS, IGNORING_ARRAY_ORDER));
IGNORING_EXTRA_FIELDS - 忽略多余字段
assertThatJson("{\"test\":{\"a\":1, \"b\":2, \"c\":3}}")
.when(IGNORING_EXTRA_FIELDS)
.isEqualTo("{\"test\":{\"b\":2}}");
IGNORE_VALUES - 忽略值
assertJsonEquals("{\"test\":{\"a\":1,\"b\":2,\"c\":3}}",
"{\"test\":{\"a\":3,\"b\":2,\"c\":1}}",
when(IGNORING_VALUES));
结语
JsonUnit非常强大,在项目中仅用了部门特性。在真正项目中会把Json存在文件中。然后在beforeMethod中一起读进来。
我是一枚职场中的测试小姐姐!刚学习完测试教程,我再把它分享出来。如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以关注微信公众号:【伤心的辣条】,获取软件测试工程师大厂面试资料!我的学习交流群:902061117 群里有技术大牛一起交流分享~
如果文章对你有帮助,麻烦伸出发财小手点个赞,感谢您的支持,你的点赞是我持续更新的动力。