Какие методы используются для обработки и валидации ответов API в тестировании?

«Какие методы используются для обработки и валидации ответов API в тестировании?» — вопрос из категории API тестирование, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При тестировании API я обрабатываю и проверяю ответы комплексно, используя следующий набор методов и библиотек. Это позволяет убедиться не только в функциональной корректности, но и в надежности и соответствии контракту.

1. Базовые проверки статуса и структуры:

import requests
import jsonschema

response = requests.get('https://api.example.com/users/1')

# 1. Проверка HTTP-статус кода
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
# Или используем встроенную проверку
response.raise_for_status()

# 2. Проверка формата тела ответа (JSON/XML)
data = response.json()  # Вызовет ошибку, если ответ не JSON

# 3. Проверка заголовков
assert response.headers['Content-Type'] == 'application/json; charset=utf-8'

2. Валидация по схеме (контракту) — самый важный метод: Я использую jsonschema для строгой проверки структуры, типов данных и обязательных полей. Это предотвращает «поломку» клиентов при изменении API.

# Схема, описывающая ожидаемую структуру ответа
user_schema = {
    "type": "object",
    "properties": {
        "id": {"type": "integer", "minimum": 1},
        "name": {"type": "string"},
        "email": {"type": "string", "format": "email"},
        "isActive": {"type": "boolean"}
    },
    "required": ["id", "name", "email"]  # Проверка обязательных полей
}

# Валидация ответа против схемы
jsonschema.validate(instance=data, schema=user_schema)

3. Проверка бизнес-логики и данных:

# 4. Проверка конкретных значений
assert data["name"] == "John Doe"
assert data["isActive"] is True

# 5. Проверка связей между данными (если применимо)
assert data["id"] == int(response.url.split('/')[-1])

4. Нефункциональные проверки:

# 6. Проверка времени ответа (Performance)
assert response.elapsed.total_seconds() < 0.5, "Response too slow"

# 7. Проверка безопасности (например, отсутствие чувствительных данных в заголовках)
assert 'X-Password' not in response.headers

5. Извлечение данных для последующих запросов (для сквозных тестов):

# 8. Сохранение токена или ID для цепочки запросов
auth_token = data["token"]
headers = {"Authorization": f"Bearer {auth_token}"}
next_response = requests.get('https://api.example.com/profile', headers=headers)

На практике я объединяю эти методы в рамках тестового фреймворка (Pytest, TestNG, JUnit), использую фикстуры для подготовки данных и assertions для четкой отчетности об ошибках.