Как вы тестируете REST API?

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

Ответ

Тестирование REST API фокусируется на проверке корректности, надежности и безопасности конечных точек.

Основные виды проверок и инструменты:

Категория тестов Что проверяет Пример инструмента
Функциональные Статус-коды, структура JSON, бизнес-логика Postman, REST Assured, pytest + requests
Негативные/Валидация Обработка неверных данных, граничные значения Те же + параметризация в pytest
Авторизация/Аутентификация Работа с токенами (JWT, OAuth), права доступа Postman (коллекции с переменными)
Нагрузочные Производительность и стабильность под нагрузкой k6, JMeter

Пример автотеста на Python (pytest + requests):

import requests
import pytest

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

@pytest.mark.parametrize("user_id, expected_code", [(1, 200), (999, 404), ("invalid", 400)])
def test_get_user_status_code(user_id, expected_code):
    """Параметризованный тест на различные статус-коды."""
    response = requests.get(f"{BASE_URL}/users/{user_id}")
    assert response.status_code == expected_code

def test_create_user_idempotency():
    """Проверка идемпотентности POST-запроса."""
    headers = {"Idempotency-Key": "test-key-123"}
    payload = {"name": "John"}
    first = requests.post(f"{BASE_URL}/users", json=payload, headers=headers)
    second = requests.post(f"{BASE_URL}/users", json=payload, headers=headers)
    # Идемпотентный запрос должен вернуть тот же ID или конфликт
    assert first.status_code == second.status_code
    if first.status_code == 201:
        assert first.json()["id"] == second.json()["id"]

Дополнительные практики: Сверка с контрактом OpenAPI/Swagger, анализ логов и трафика через прокси (Charles/Fiddler).