Почти все современные API отдают JSON. Тестировщику нужно читать его без ошибок и проверять форму ответа одной проверкой, а не двадцатью.
JSON
Шесть типов: string, number, boolean, null, object, array.
{
"id": 501,
"status": "paid",
"total": 2500.5,
"comment": null,
"items": [{ "sku": "A", "qty": 2 }],
"createdAt": "2026-10-15T12:00:00Z"
}
Правила, на которых ломаются: ключи и строки только в двойных кавычках, нет висячих запятых, нет комментариев. Дат в JSON нет, их передают строкой (лучше ISO 8601 с часовым поясом) или числом.
Типовые баги API в JSON:
- число пришло строкой:
"42"вместо42; nullвместо пустого массива, и клиент падает на.length;- поле пропало в одном из сценариев (например, у гостевого заказа);
- целые больше 2^53 теряют точность в JavaScript:
9007199254740993превращается в...992. Большие id отдают строкой.
Нет поля и null это разное. В PATCH отсутствие поля обычно значит «не менять», а null «очистить». Это отдельные тест-кейсы.
JSON Schema
JSON Schema это JSON-документ, описывающий допустимую структуру. Актуальная версия стандарта 2020-12.
{
"type": "object",
"properties": {
"id": { "type": "integer" },
"status": { "type": "string", "enum": ["new", "paid", "cancelled"] },
"total": { "type": "number", "minimum": 0 },
"comment": { "type": ["string", "null"] },
"items": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": { "sku": { "type": "string" }, "qty": { "type": "integer", "minimum": 1 } },
"required": ["sku", "qty"]
}
}
},
"required": ["id", "status", "total", "items"],
"additionalProperties": false
}
Ключевые слова: type, properties, required, additionalProperties, items, enum, minimum/maximum, minLength/maxLength, pattern, format, oneOf/anyOf/allOf, $ref и $defs.
Ловушки
propertiesне делает поля обязательными. Безrequiredсхема пропустит{}. Самая частая ошибка в автотестах.additionalPropertiesпо умолчанию разрешает лишнее. Сfalseсхема поймает утечку вродеpasswordHash, но упадёт и на любое новое безобидное поле. Строгость выбирают осознанно.formatв 2020-12 по умолчанию только аннотация."format": "email"не проверяется, пока проверку не включили в валидаторе (например, ajv-formats для ajv).patternбез якорей ищет совпадение где угодно в строке:new|paidпропуститunpaid. Пишите^(new|paid)$или используйтеenum.- Null. В JSON Schema это
"type": ["string", "null"].nullable: trueиз OpenAPI 3.0, в чистой JSON Schema его нет. OpenAPI 3.1 перешёл на обычную JSON Schema. - integer.
1500.0проходит как integer: важно значение, а не запись.
Где проверять
- Postman:
pm.response.to.have.jsonSchema(schema). - Python: библиотека
jsonschema. - Java: REST Assured с модулем json-schema-validator.
- Источник схемы: OpenAPI-спецификация. Тогда тест заодно проверяет, что документация не врёт.
Схема проверяет форму, но не значения: она скажет, что total число, но не скажет, что оно правильное. Значения проверяют отдельно.
Контрактное тестирование
Контракт фиксирует, что потребитель шлёт и что ждёт в ответ. В consumer-driven подходе (Pact) потребитель пишет ожидания, а провайдер в своём CI проверяет, что выполняет контракты всех клиентов. Это ловит ломающие изменения до деплоя и без дорогих e2e на десятке сервисов.
Что спросят на собесе
- Какие типы данных есть в JSON?
- Зачем проверять ответ схемой и как это сделать?
- Чем отличается отсутствие поля от
null? - Что делает
additionalProperties: false? - Что такое контрактное тестирование?