Научитесь писать утверждения результатов теста с использованием JSONassert с простыми для понимания примерами. Мы можем использовать это руководство как кулинарную книгу JSONassert для быстрого ознакомления.
1. Настройка JSONassert
Использовать JSONassert с JUnit очень просто. Нам нужно импортировать его последнюю зависимость из репозитория Maven.
<dependency><groupId>org.skyscreamer</groupId><artifactId>jsonassert</artifactId><version>1.5.1</version><scope>test</scope></dependency>
Все его классы, интерфейсы и методы происходят из пакета org.skyscreamer.jsonassert. Теперь мы можем написать все утверждения, используя методы утверждений JUNIT :
JSONAssert.assertEquals(expectedJSON, actualJSON, strictMode);JSONAssert.assertNotEquals(expectedJSON, actualJSON, strictMode);
2. Работа с JSONassert
При написании тестов для REST API с JUnit сравнение полей JSON можно легко осуществить с помощью нескольких библиотек, таких как JsonPath. Но если мы хотим сравнить полный ответ JSON с предопределенной строкой JSON, то прямой поддержки нет.
JSONassert, разумно, преобразует предоставленную строку в объект JSON и сравнивает логическую структуру и данные с объектом ответа JSON. Мы можем напрямую передать экземпляр org.json.JSONObject или org.json.JSONArray вместо String.
2.1. Режимы сравнения
При сравнении JSON есть две вещи, которые мы должны учитывать: расширенные поля и порядок полей. Расширенные поля означают, что фактический ответ содержит больше полей, чем строка сравнения.
JSONassert имеет встроенную поддержку следующих режимов при сравнении JSON:
- JSONCompareMode.STRICT : Расширенные поля не допускаются. Порядок полей должен совпадать.
- JSONCompareMode.LENIENT : Разрешены расширенные поля. Порядок полей может отличаться.
- JSONCompareMode.NON_EXTENSIBLE : Расширенные поля не допускаются. Порядок полей может отличаться.
- JSONCompareMode.STRICT_ORDER : Разрешены расширенные поля. Порядок полей должен совпадать.
По умолчанию JSONassert использует мягкий режим, который игнорирует порядок полей JSON и допускает расширенные поля. Рекомендуется всегда использовать режим LENIENT. Он помогает на этапе разработки, когда время от времени добавляются новые поля.
В качестве лучшей практики следует включать строгий режим только в том случае, если нам необходимо обеспечить определенный порядок для массивов или если мы хотим гарантировать, что фактический JSON не будет содержать никаких полей, выходящих за рамки ожидаемых.
Чтобы изменить режим сравнения, используйте соответствующую константу режима в качестве последнего аргумента в методах assertEquals() или assertNotEquals().
JSONAssert.assertEquals(expectedJSON, actualJSON, JSONCompareMode.LENIENT);JSONAssert.assertNotEquals(expectedJSON, actualJSON, JSONCompareMode.STRICT);
Мы также можем передать логический параметр в качестве последнего аргумента, что будет выглядеть следующим образом:
- ложь: JSONCompareMode.LENIENT
- правда: JSONCompareMode.STRICT
JSONAssert.assertEquals(expectedJSON, actualJSON, false);
2.2 Простой пример
Рассмотрим следующую строку JSON.
{"widget": {"debug": "on","window": {"title": "Client Info","name": "test widget"}}}
Если нам нужно написать утверждения для проверки данных JSON с использованием JSONPath, нам нужно написать несколько утверждений следующим образом:
Assertions.assertEquals("on", JsonPath.read(json, "$.widget.debug"));Assertions.assertEquals("Client Info", JsonPath.read(json, "$.widget.window.title"));Assertions.assertEquals("test widget", JsonPath.read(json, "$.widget.window.name"));......
Но с помощью JSONassert мы можем проверить весь JSON в одном утверждении. Обратите внимание, что порядок полей не меняет результат утверждения.
JSONAssert.assertEquals("{"widget":{"debug":"on","window":{"title":"Client Info","name":"test widget "}}}", json, JSONCompareMode.LENIENT);
3. Использование JSONObject и JSONArray
Вместо строк JSON мы можем использовать экземпляры JSONObject и JSONArray.
@testJSONObjectvoid testJSONObject(){JSONObject jsonObject = new JSONObject();jsonObject.put("widget", Map.of("debug", "on"));JSONAssert.assertEquals("{"padding":[10,10,10,50]}", jsonObject, JSONCompareMode.LENIENT);}
Аналогично мы можем провести тестирование с помощью JSONArray.
@Testvoid testJSONArray(){JSONArray jsonArray = new JSONArray();jsonArray.put(10);jsonArray.put(10);jsonArray.put(10);jsonArray.put(50);JSONAssert.assertEquals("[10,10,10,50]", jsonArray, JSONCompareMode.STRICT);}
4. Сообщения об ошибках сравнения
Хотя библиотека JSONassert предоставляет полезные сообщения, по умолчанию мы можем предоставить любое пользовательское сообщение в качестве первого аргумента методов assertEquals() и assertNotEquals().
В случае неудачного сравнения мы получим пользовательское сообщение, а также сообщение, предоставленное библиотекой для точки сбоя.
@Testvoid testFailMessage(){String message = "Comparison Failed.";JSONAssert.assertEquals(message,"{\"widget\":{\"debug\":\"on\",\"window\":{\"titles\":\"Client Info\"," +"\"name\":\"client_info\"}}}", json, JSONCompareMode.LENIENT);}
В приведенном выше примере мы изменили строку title на titles. Проверьте вывод теста. Он ясно показывает, что тест ожидал titles внутри узла widget.window, но не смог его найти.
java.lang.AssertionError: Сравнение не удалось. widget.window
Ожидается: заголовки
но ничего не найдено
5. Заключение
В этом руководстве по JSONassert мы изучили основы библиотеки JSONassert, настроили ее с помощью Maven и ее различных режимов сравнения. Мы также научились сравнивать JSON как строки или экземпляры JSONObject с примерами. Наконец, мы научились настраивать и понимать определяемые пользователем сообщения в случае неудачных сравнений.