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

«Как вы применяли JSON Schema в тестировании?» — вопрос из категории Форматы данных, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 на этапе прогона тестов, до попадания в прод.