Ответ
Валидация 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) — ёпта, что-то пошло не так. Не проверяешь их — сам потом ищи, почему всё накрылось медным тазом.