Как тестировать синхронное взаимодействие по REST API?

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

Ответ

Тестирование синхронных REST API фокусируется на проверке корректности запросов и немедленных ответов. Тесты строятся вокруг контракта API (например, OpenAPI/Swagger спецификация).

Уровни и виды тестов:

  1. Позитивные тесты (Happy Path): Проверка успешных сценариев с валидными данными.

    GET /api/v1/users/123 HTTP/1.1
    Host: example.com
    Authorization: Bearer <token>

    Ожидаемый ответ:

    {
      "id": 123,
      "name": "Alice",
      "email": "alice@example.com",
      "status": "active"
    }
  2. Негативные тесты: Проверка обработки ошибок.

    • Невалидные данные: POST с некорректным JSON (400 Bad Request).
    • Отсутствующий ресурс: GET /users/999999 (404 Not Found).
    • Ошибки авторизации: Запрос без токена (401 Unauthorized).
    • Запрещенные действия: DELETE для ресурса без прав (403 Forbidden).
    • Серверные ошибки: Имитация сбоя бэкенда (500 Internal Server Error).
  3. Валидация контракта:

    • Структура ответа: Соответствие JSON Schema.
    • Типы данных: Проверка, что id — число, а email — строка в формате email.
    • Обязательные поля: Наличие всех required полей в ответе.
  4. Проверка HTTP-специфики:

    • Статус-коды: Корректность кода ответа.
    • Заголовки: Наличие и правильность Content-Type, Cache-Control, ETag.
    • Методы: Проверка поддержки GET, POST, PUT, PATCH, DELETE.
  5. Тестирование граничных условий и бизнес-логики:

    • Лимиты: Пагинация (?page=1&limit=50).
    • Фильтрация и сортировка: ?status=active&sort=-created_at.
    • Валидация полей: Минимальная/максимальная длина строк, диапазоны чисел.

Инструменты для автоматизации:

  • Postman/Newman: Для создания коллекций и запуска в CI.
  • REST-assured (Java): Позволяет писать выразительные тесты на Groovy.
  • pytest + requests (Python): Гибкое решение для сложных сценариев.

    import pytest
    import requests
    from jsonschema import validate
    
    BASE_URL = "https://api.example.com"
    USER_SCHEMA = { ... }  # JSON Schema
    
    def test_get_user_positive():
        response = requests.get(f"{BASE_URL}/users/1")
        assert response.status_code == 200
        user_data = response.json()
        validate(instance=user_data, schema=USER_SCHEMA)  # Валидация схемы
        assert user_data["id"] == 1
        assert "name" in user_data

Интеграция: Такие тесты должны быть частью CI/CD пайплайна для раннего обнаружения регрессий.