JSON схема – визначає правила та обмеження, яким мають відповідати дані JSON. Ці правила можуть містити типи даних, обов’язкові поля, дозволені значення, тощо. Перевірка JSON схеми дозволяє переконатися, що дані відповідають очікуваному формату.
Для прикладу розглянемо GET запит до демо API:
https://reqres.in/api/users/2Котрий повертає наступний JSON в response body:
{
"data":{
"id":2,
"email":"janet.weaver@reqres.in",
"first_name":"Janet",
"last_name":"Weaver",
"avatar":"https://reqres.in/img/faces/2-image.jpg"
},
"support":{
"url":"https://reqres.in/#support-heading",
"text":"To keep ReqRes free, contributions towards server costs are appreciated!"
}
}Для того, щоб згенерувати схему, на основі отриманого у відповіді JSON, я скористаюсь онлайн сервісом за посиланням https://transform.tools/json-to-json-schema:

В результаті я отримав наступну схему, котру зберігаю до файлу user_json_schema.json, для подальшого використання під час написання тесту:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Generated schema for Root",
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"email": {
"type": "string"
},
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"avatar": {
"type": "string"
}
},
"required": [
"id",
"email",
"first_name",
"last_name",
"avatar"
]
},
"support": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"url",
"text"
]
}
},
"required": [
"data",
"support"
]
}Валідація JSON схеми за допомогою REST Assured
Попередньо може бути корисним ознайомитись:
REST assured – приклад написання простого тесту для API
Для можливості перевірки JSON схеми, додаю у pom.xml файл проекту з тестами залежність від бібліотеки json-schema-validator:
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>5.4.0</version>
</dependency>
Наступним кроком, кладу раніше збережений файл зі згенерованою схемою user_json_schema.json за шляхом src/test/resources:

Код класу з тестом:
package wiki.it.notes.api.json_schema;
import org.testng.annotations.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
public class UserAPITest {
@Test
void getUser() {
given()
.baseUri("https://reqres.in/api")
.when()
.get("/users/2")
.then()
.statusCode(200)
.body(matchesJsonSchemaInClasspath("user_json_schema.json"));
}
}Статичний метод класу JsonSchemaValidator matchesJsonSchemaInClasspath(String pathToSchemaInClasspath), перевіряє тіло відповіді API на відповідність схемі JSON, в якості параметру приймає ім’я файлу, що містить схему.
Результат виконання тесту:

Тепер, щоб перевірити, що валідація дійсно спрацьовує, спробую змінити схему таким чином, щоб викликати помилку. Наприклад зміню очікуваний тип властивості id, з number на string:

Запускаю тест та отримую результат:

Результат тесту містить деталі валідації що спрацювала (рівень, поле JSON, тип помилки, актуальне та очікуване значення).