Какие коды ответов HTTP сервера ты знаешь и как их использовать в тестировании?

Ответ

Валидация HTTP-кодов состояния (Status Codes) — это одна из первых и основных проверок в API-тестировании. Они сразу указывают на результат операции.

Классы кодов и ключевые примеры:

  • 1xx (Информационные): Встречаются редко. Например, 102 Processing — сервер обрабатывает длительный запрос.

  • 2xx (Успех):

    • 200 OK — стандартный успешный ответ для GET, PUT, PATCH. В тестах: Проверяем, что тело ответа соответствует ожидаемой структуре и данным.
    • 201 Created — ресурс успешно создан после POST (иногда PUT). В тестах: Обязательно проверяем наличие заголовка Location с URI нового ресурса и валидируем тело ответа.
    • 204 No Content — успешно, но тело ответа пустое (часто после DELETE или PUT). В тестах: Убеждаемся, что response.content пуст.
    • 206 Partial Content — сервер возвращает часть данных (используется для докачки файлов). В тестах: Проверяем заголовки Content-Range.
  • 3xx (Перенаправление):

    • 301 Moved Permanently / 308 Permanent Redirect — постоянный редирект. В тестах: Проверяем, что клиент (или наш тестовый фреймворк) автоматически следует за новым URL из заголовка Location.
    • 302 Found / 307 Temporary Redirect — временный редирект. Разница в сохранении метода запроса (307 сохраняет, 302 может изменить POST на GET).
  • 4xx (Ошибка клиента):

    • 400 Bad Request — общая ошибка валидации запроса. В тестах: Проверяем, что при отправке невалидных данных (неверный JSON, отсутствующие поля) возвращается 400, а в теле есть детали ошибки.
    • 401 Unauthorized — требуется аутентификация. В тестах: Проверяем endpoints, защищенные токеном, без авторизационных заголовков.
    • 403 Forbidden — доступ запрещен (аутентификация прошла, но прав недостаточно).
    • 404 Not Found — ресурс не существует. В тестах: Проверяем запросы к несуществующим ID.
    • 409 Conflict — конфликт состояния (например, попытка создать дубликат уникального поля). В тестах: Критически важный код для проверки бизнес-логики.
    • 422 Unprocessable Entity (WebDAV) — семантическая ошибка в запросе (похоже на 400, но более специфично). Часто используется в REST API.
    • 429 Too Many Requests — превышен лимит запросов (rate limiting). В тестах: Проверяем корректность работы ограничений.
  • 5xx (Ошибка сервера):

    • 500 Internal Server Error — общая ошибка сервера. В тестах: Неожиданная 500-я ошибка — это дефект. Мы можем преднамеренно вызывать ее, тестируя обработку некорректных данных.
    • 502 Bad Gateway / 503 Service Unavailable / 504 Gateway Timeout — ошибки прокси, недоступности сервиса или таймаута. В тестах: Моделируем в интеграционных тестах, проверяя механизмы retry и fallback.

Пример автоматизированной проверки в тесте:

import requests
import pytest

def test_create_user_success():
    url = "https://api.example.com/users"
    payload = {"username": "testuser", "email": "test@example.com"}

    response = requests.post(url, json=payload)

    # Основная проверка кода состояния
    assert response.status_code == 201, f"Expected 201, got {response.status_code}. Response: {response.text}"

    # Дополнительные проверки для 201
    assert "Location" in response.headers
    created_user = response.json()
    assert created_user["id"] is not None
    assert created_user["username"] == payload["username"]

def test_get_nonexistent_user():
    response = requests.get("https://api.example.com/users/999999")
    # Ожидаем четкий 404, а не 500 или 200 с пустым телом
    assert response.status_code == 404

Ответ 18+ 🔞

А, слушай, про HTTP-коды! Это ж основа основ, как хлеб с маслом. Если ты их не валидируешь, то ты, прости, распиздяй полный. Это первое, на что смотришь после запроса — сразу понятно, что там по итогу.

Вот эти ваши классы, разжую:

  • 1xx (Информационные): Встречаются редко, конечно. Ну, типа, 102 Processing — сервер такой: «Подожди, братан, я тут подумаю». Волнение ебать пока ждёшь.

  • 2xx (Успех):

    • 200 OK — классика, всё чётко. GET, PUT, PATCH отработали. В тестах: Ну тут понятно, смотришь, чтобы тело ответа не было хуй с горы, а соответствовало контракту.
    • 201 Created — вот это важный! Ресурс создали после POST. В тестах: Обязательно ловишь заголовок Location, где ссылка на новую сущность, и тело проверяешь. Если его нет — это пиздопроебибна.
    • 204 No Content — сделано, но тебе нихуя не прислали. Часто после DELETE. В тестах: Смотришь, чтобы response.content был пустой, а не какая-нибудь манда с ушами.
    • 206 Partial Content — тебе прислали кусок файла, типа докачка. В тестах: Глядишь заголовки Content-Range, чтобы не обманули.
  • 3xx (Перенаправление):

    • 301 Moved Permanently / 308 Permanent Redirect — переехали навсегда. В тестах: Проверяешь, что твой фреймворк или клиент автоматом пошёл по новому адресу из Location.
    • 302 Found / 307 Temporary Redirect — временно съехали. Разница в том, сохраняется ли метод запроса (307 — да, 302 — может и сломаться).
  • 4xx (Ошибка клиента): Вот тут начинается веселье. Ошибка на твоей стороне, чувак.

    • 400 Bad Request — общая, типа «ты мне какую-то хуйню прислал». В тестах: Специально шлёшь битый JSON или неполные данные и ждёшь эту четвёрку. Если пришло что-то другое — терпения ноль ебать у разработчиков бэкенда.
    • 401 Unauthorized — «предъяви пропуск». В тестах: Шлёшь запрос без токена на закрытый эндпоинт и ловишь эту ошибку. Не поймал — доверия ебать ноль к системе безопасности.
    • 403 Forbidden — «пропуск есть, но в этот кабинет тебе нельзя».
    • 404 Not Found — классика, «тут ничего нет». В тестах: Запрашиваешь пользователя с ID 999999 и получаешь внятный 404, а не 500 или 200 с пустотой.
    • 409 Conflict — о, это важный! Конфликт, например, пытаешься создать юзера с уже занятым email. В тестах: Критично для бизнес-логики, пропустишь — будет хитрая жопа в продакшене.
    • 422 Unprocessable Entity — похоже на 400, но более прицельно, «данные вроде ок, но логически ерунда».
    • 429 Too Many Requests — «успокойся, ты слишком часто стучишься». В тестах: Проверяешь, что rate limiting работает, а не просто так.
  • 5xx (Ошибка сервера): А вот это уже проблемы на той стороне. Удивление пиздец, когда получаешь такую в ответ на нормальный запрос.

    • 500 Internal Server Error — общая, «у нас что-то сломалось, но мы не скажем что». Если она вылезает неожиданно — это дефект, баг, ядерена вошь.
    • 502 Bad Gateway / 503 Service Unavailable / 504 Gateway Timeout — прокси сдох, сервис лег или таймаут. В тестах: Моделируешь такие сценарии в интеграционных тестах, смотришь, как твоё приложение retry делает.

Вот тебе пример, как это в коде выглядит, простой и ясный:

import requests
import pytest

def test_create_user_success():
    url = "https://api.example.com/users"
    payload = {"username": "testuser", "email": "test@example.com"}

    response = requests.post(url, json=payload)

    # Основная проверка кода состояния
    assert response.status_code == 201, f"Expected 201, got {response.status_code}. Response: {response.text}"

    # Дополнительные проверки для 201
    assert "Location" in response.headers
    created_user = response.json()
    assert created_user["id"] is not None
    assert created_user["username"] == payload["username"]

def test_get_nonexistent_user():
    response = requests.get("https://api.example.com/users/999999")
    # Ожидаем четкий 404, а не 500 или 200 с пустым телом
    assert response.status_code == 404

Короче, статус-коды — это как светофор. Зелёный (2xx) — едем дальше, жёлтый (3xx) — внимание, красный (4xx/5xx) — ёпта, что-то пошло не так. Не проверяешь их — сам потом ищи, почему всё накрылось медным тазом.