REST Assured 系列汇总 之 REST Assured 69 - Introduction To JsonAssert Library
介绍
API 测试,有时需要比较两个 JSON。例如:我们想每次从一个 API返回的结果是一样的,或部分 response body 结果是不变的,就可以直接比较已经存在的 JSON response,省去了写大量逻辑代码去断言。
有许多好的 Java 库可以用来比较,前面我们用 Jackson 库 比较两个 JSONs,本文我们主要了解用 JSONassert 库来比较两个 JSON response。
前提条件
添加 JSONassert 依赖
<!-- https://mvnrepository.com/artifact/org.skyscreamer/jsonassert -->
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<version>1.5.0</version>
<scope>test</scope>
</dependency>
JSONassert
JSONassert Java library 帮助更有效断言 JSON相等。根据 GitHub 文档,JSONassert 将字符串转换成一个 JSON object,跟期望的 JSON 比较逻辑结构和数据。当设置 strict 为 false (推荐),它会忽略重排数据和延展结果(只要期望的结果都在就可以),使得测试更健壮。
JSONassert 类中的 assertEquals() 方法用于比较 JSON Objects 和 JSON Array,后续我们将了解更多有关这个方法。
JSONassert 有一个枚举类型 JSONCompareMode,来定义不同比较行为的不同 modes。每个 mode 封装了两个最基本的行为:extensibility and strict ordering.
在比较 JSONs,这些 modes 很有帮助。例如:如果我们不想比较整个 JSONs,只是关心某些元素是否存在于 JSON,我们就可以用 extensible mode,只需关心第一个 JSON全文是否存在于第二个JSON 本文中。如果第二个JSON中的元素多于第一个 JSON,测试也不会失败。
如果 extensibility 不允许,所有期望的值都比较匹配所测试的值。任何额外的字段都会引起测试失败。
JSON Object 1
{
"firstName" : "Amod",
"lastName": "Mahajan",
"age": "28"
}
JSON Object 2
{
"firstName" : "Amod",
"lastName": "Mahajan",
"age": "28",
"address" : "Bengaluru"
}
如果选择 extensible mode,那么:
JsonObject 1 == JsonObject2 => true
JsonObject 2 == JsonObject1 => false ("address" field is missing in 2nd json)
如果不选择 extensible mode,那么:
JsonObject 1 == JsonObject2 => false ("address" field is extra in 2nd JSON)
JsonObject 2 == JsonObject1 => false ("address" field is missing in 2nd json)
还有 ”strict“ mode,用来断言 JSON Arrays 的顺序,请注意,这里是针对 JSON Arrays。
{
"firstName" : "Amod",
"lastName": "Mahajan"
}
{
"lastName": "Mahajan",
"firstName" : "Amod"
}
上面两个 JSONs,只是字段的顺序不同而已,如果选择 “strict” mode 进行比较是不会失败的,因为它只应用在 JSON Arrays,对 JSON Objects 没有效果。
如果有一个 JSON Array 是 [1,2,3,5],另外一个 JSON Array 是 [1,2,5,3], 选择 “strict” mode 比较这两个 JSON Arrays 是会失败的,因为元素的顺序不一样。
这里只是介绍有关 JSONassert 基本概念,理解 extensible 和 strict mode 是非常重要的,后续会有更多实例。