Урок по треку API и бэкенд для тестировщика 6 мин

JSON и JSON Schema за 6 минут

Типы JSON, валидация ответа по схеме, required и additionalProperties, контрактное тестирование.

Почти все современные 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?
  • Что такое контрактное тестирование?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.