Как автоматизировать тестирование API?

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

Ответ

Автоматизация тестирования API строится на использовании специализированных библиотек и интеграции в CI/CD. Я обычно действую по следующему плану:

  1. Выбор инструментария в зависимости от стека проекта:

    • Java: RestAssured + TestNG/JUnit.
    • Python: pytest + библиотеки requests (для HTTP) и pydantic/jsonschema (для валидации).
    • JavaScript/TypeScript: Supertest + Jest/Mocha.
    • Универсальные инструменты: Postman/Newman для быстрого прототипирования и запуска коллекций.
  2. Структура теста. Каждый тест проверяет конкретный эндпоинт и включает:

    • Проверку HTTP-статус кода.
    • Валидацию схемы ответа (JSON Schema).
    • Проверку бизнес-логики (значения полей).
    • Проверку заголовков и времени ответа (performance).

Пример на Python (pytest + requests):

import requests
import pytest
from jsonschema import validate

# Схема для валидации
USER_SCHEMA = {
    "type": "object",
    "properties": {
        "id": {"type": "integer"},
        "name": {"type": "string"}
    },
    "required": ["id", "name"]
}

BASE_URL = "https://api.example.com"

def test_get_user_by_id():
    """Позитивный тест на получение пользователя."""
    response = requests.get(f"{BASE_URL}/users/1")

    # 1. Проверка статус-кода
    assert response.status_code == 200

    response_data = response.json()

    # 2. Валидация JSON-схемы
    validate(instance=response_data, schema=USER_SCHEMA)

    # 3. Проверка бизнес-правил
    assert response_data["id"] == 1
    assert "name" in response_data

def test_get_nonexistent_user():
    """Негативный тест: запрос несуществующего пользователя."""
    response = requests.get(f"{BASE_URL}/users/9999")
    assert response.status_code == 404
  1. Организация и запуск:
    • Параметризация: Использую @pytest.mark.parametrize для тестирования с разными входными данными.
    • Фикстуры: Выношу общую логику (настройка сессии, аутентификация) в фикстуры pytest.
    • Отчетность: Подключаю pytest-html или Allure для наглядных отчетов.
    • CI/CD: Запускаю набор тестов как этап пайплайна в GitLab CI или GitHub Actions. При падении теста пайплайн останавливается, и команда получает уведомление.