Как вы применяли JSON Schema в тестировании?

Ответ

JSON Schema использовалась как контракт для валидации структуры данных, что повышало надежность API и конфигураций.

Области применения:

  1. Валидация ответов API: Гарантия, что endpoint всегда возвращает данные согласованного формата.
  2. Валидация конфигурационных файлов: Проверка настроек приложения/сервиса перед деплоем.
  3. Документирование форматов данных: Схема служила актуальным и машиночитаемым описанием.
  4. Генерация тестовых данных: Использование схемы для создания корректных mock-данных.

Пример схемы для ответа API пользователя:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "User",
  "description": "Объект пользователя системы",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "minimum": 1,
      "description": "Уникальный идентификатор"
    },
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 255
    },
    "isActive": {
      "type": "boolean",
      "default": false
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": ["user", "editor", "admin"]
      },
      "uniqueItems": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  },
  "required": ["id", "email", "createdAt"],
  "additionalProperties": false
}

Интеграция в автотесты (Python с библиотекой jsonschema):

import requests
import jsonschema
from jsonschema import validate

# Загрузка схемы
USER_SCHEMA = { ... }  # Схема как выше

def test_get_user_schema():
    """Тест проверяет, что ответ API пользователя соответствует JSON Schema."""
    response = requests.get("https://api.example.com/users/1")
    assert response.status_code == 200

    user_data = response.json()

    # Валидация ответа против схемы
    try:
        validate(instance=user_data, schema=USER_SCHEMA)
    except jsonschema.ValidationError as e:
        pytest.fail(f"Ответ API не соответствует схеме: {e.message}")

Использование схем в CI/CD пайплайне позволяло отлавливать breaking changes в API на этапе прогона тестов, до попадания в прод.

Ответ 18+ 🔞

Да ты посмотри, что эти умники придумали, блядь! JSON Schema, сука! Ну не гениально ли? Это ж как договор, контракт, ёпта! Чтобы данные не ходили кто в лес, кто по дрова, а были, блядь, как штык.

Ну и где эту хуйню применяли? Да везде, блядь!

  1. Чтобы API не пиздел. Чтоб endpoint не подсовывал тебе вместо email"хуй с горы", а всегда отдавал чётко по форме. Гарантия, ёпта!
  2. Конфиги проверять. Чтобы перед тем, как запустить сервис, убедиться, что в настройках не написано "port": "манда с ушами", а нормальный цифровой порт. А то впадёшь в депрессию на ровном месте.
  3. Документация, которая не врёт. Вместо того, чтобы в Confluence писать, который устарел ещё в прошлый четверг, — вот тебе живая схема. Машина её прочитает и скажет: «Всё, сука, чётко».
  4. Тестовые данные нагенерить. Нужны фейковые юзеры для тестов? Держи схему — и ваяй хоть овердохуища правдоподобных данных. Красота!

Вот, смотри, как выглядит этот самый контракт на пользователя:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "User",
  "description": "Объект пользователя системы",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "minimum": 1,
      "description": "Уникальный идентификатор"
    },
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 255
    },
    "isActive": {
      "type": "boolean",
      "default": false
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": ["user", "editor", "admin"]
      },
      "uniqueItems": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  },
  "required": ["id", "email", "createdAt"],
  "additionalProperties": false
}

Видишь? additionalProperties: false — это, блядь, святое! Это значит, что если API вдруг начнёт присылать поле "iq": 180, то схема его, сука, нахуй завернёт. «Не, браток, не договаривались».

А вот как это в тестах впендюривали (Python, jsonschema):

import requests
import jsonschema
from jsonschema import validate

# Загрузка схемы
USER_SCHEMA = { ... }  # Схема как выше

def test_get_user_schema():
    """Тест проверяет, что ответ API пользователя соответствует JSON Schema."""
    response = requests.get("https://api.example.com/users/1")
    assert response.status_code == 200

    user_data = response.json()

    # Валидация ответа против схемы
    try:
        validate(instance=user_data, schema=USER_SCHEMA)
    except jsonschema.ValidationError as e:
        pytest.fail(f"Ответ API не соответствует схеме: {e.message}")

И вся эта магия в CI/CD пайплайне стояла. Представляешь? Только бэкенд-разработчик, этот полупидор, накосячил и поменял формат ответа — а ему уже на этапе тестов, ещё до прода, система и выкатывает: «Э, сабака, сука! Куда прёшь? Контракт нарушаешь!». И деплой не проходит. Волшебство, блядь, а не жизнь. Чихать тебе в сраку, breaking changes!