REST Assured 71 - Compare JSON Arrays Using JSONassert Library

REST Assured 系列汇总 之 REST Assured 71 - Compare JSON Arrays Using 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 Java library 基本概念 ,不同的比较模式和断言 JSON Objects。

Introduction To JsonAssert Library

Compare JSON Objects Using JSONassert Library

assertEquals() 方法

JSONassert 提供了很多静态重载的 assertEquals() 方法
JSONassert provides multiple static overloaded assertEquals() method. We will see most of them.

Lenient mode

前面的文章我们了解到,在 Lenient 模式中,extensibility 是允许的,没有严格的顺序要求,我们通过例子来了解 Lenient mode 下比较两上 Arrays。

比较两个元素相同,值相同,顺序相同的 Arrays

// same no of elements, values and in same order
String jsonArray1 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
String jsonArray2 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
		
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.LENIENT);

结果:
因为两个数组元素个数相同,值相同,顺序也相同,所以比较结果 PASS

比较两个元素个数相同,值不同的 Arrays

// Same no of elements but different values
jsonArray1 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
jsonArray2 = "[\"Amod Mahajan\",\"Mukesh\",\"Ravi\"]";
		
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.LENIENT);

结果:
因为有值不一样,结果肯定 FAIL

比较两个元素个数相同,值大小写不同的 Arrays

// Same no of elements but different case values
jsonArray1 = "[\"AMOD\",\"Mukesh\",\"Ravi\"]";
jsonArray2 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
				
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.LENIENT);

结果:
默认是大小写敏感的,所以结果是 FAIL

比较两个元素个数相同,但是元素顺序不同的 Arrays

// Same no of elements but different order
jsonArray1 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
jsonArray2 = "[\"Mukesh\",\"Amod\",\"Ravi\"]";
 
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.LENIENT);

结果:
因为是用 Lenient mode,所以元素的顺序是不受影响的,所以结果是 PASS

比较两个元素值都不相同的 Arrays

// Same no of elements but all different values
jsonArray1 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
jsonArray2 = "[\"Animesh\",\"Aaditya\",\"Swati\"]";
								
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.LENIENT);

结果:
在这里插入图片描述
从结果输出可以看出,先从第一个 Array 中选择元素,试图在第二个 Array 中是否能找到这些元素,不是按顺序的。期望在第二个 Array 中找到 “Ravi” ,但是没有找到,其它元素 “Amod” 和 “Mukesh” 同理。第二个 Array 中出现了不期望的元素 “Mukesh”, “Swati”, 和 “Animesh”。

比较两个不同元素个数的 Array
我们知道 Lenient mode 是允许 extensibility,但是在 Array 类型是不起效果的。

// Different no of elements
jsonArray1 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
jsonArray2 = "[\"Amod\",\"Mukesh\",\"Ravi\",\"Animesh\"]";
								
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.LENIENT);

结果:
在这里插入图片描述

Strict mode

如果关心元素在一个 Array 的顺序,我们可以用 strict mode。

// same no of elements, values and in different order
String jsonArray1 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
String jsonArray2 = "[\"Mukesh\",\"Amod\",\"Ravi\"]";
		
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.STRICT);

在这里插入图片描述
注意上面黄色高亮部分,表明是哪个元素不匹配。

// same no of elements, values and in different order
String jsonArray1 = "[\"Amod\",\"Mukesh\",\"Ravi\"]";
String jsonArray2 = "[\"Amod\",\"Anu\",\"Ravikant\"]";
		
JSONAssert.assertEquals(jsonArray1, jsonArray2, JSONCompareMode.STRICT);

在这里插入图片描述

Guess you like

Origin blog.csdn.net/wumingxiaoyao/article/details/120621526