HTTP-статусы для тестировщика
QA❤️4LifeШпаргалка по HTTP-статусам для тестировщика. Запоминай и пользуйся!
Канал: QA❤️4Life
Автор: Евгений Гусинец
1xx — Informational (Информационные)
- 100 Continue — сервер готов принять тело запроса. Клиент может продолжать отправку
- 101 Switching Protocols — сервер переключается на протокол, указанный клиентом (WebSocket, HTTP/2)
- 102 Processing — сервер принял запрос, но ещё не завершил обработку (WebDAV)
- 103 Early Hints — сервер отправляет предварительные заголовки, пока генерируется основной ответ
2xx — Success (Успешные запросы)
- 200 OK — запрос выполнен успешно. Тело ответа содержит результат (GET)
- 201 Created — ресурс успешно создан. В ответе — Location с URL нового ресурса (POST)
- 202 Accepted — запрос принят в обработку, но результат ещё не готов (асинхронные задачи)
- 204 No Content — запрос выполнен успешно, тело ответа пустое (DELETE, PUT)
- 206 Partial Content — сервер возвращает часть ресурса (Range-запросы, докачка файлов)
3xx — Redirection (Перенаправления)
- 301 Moved Permanently — ресурс перемещён навсегда. Все будущие запросы — на новый URL
- 302 Found — временное перенаправление. Текущий запрос — на другой URL
- 303 See Other — результат запроса находится по другому URL (GET после POST)
- 304 Not Modified — ресурс не изменился. Используй кэшированную версию (If-Modified-Since)
- 307 Temporary Redirect — временное перенаправление с сохранением HTTP-метода
- 308 Permanent Redirect — постоянное перенаправление с сохранением HTTP-метода
4xx — Client Error (Ошибки клиента)
- 400 Bad Request — невалидный запрос: синтаксическая ошибка, некорректные данные
- 401 Unauthorized — требуется аутентификация. Нет или невалидный токен/логин
- 403 Forbidden — нет прав доступа. Аутентификация есть, но недостаточно прав
- 404 Not Found — ресурс не найден. Неправильный URL или ресурс удалён
- 405 Method Not Allowed — HTTP-метод не поддерживается для данного ресурса
- 406 Not Acceptable — сервер не может сформировать ответ в формате, указанном в Accept
- 408 Request Timeout — сервер прервал соединение из-за таймаута
- 409 Conflict — конфликт: дубликат, версионирование, неконсистентное состояние
- 410 Gone — ресурс удалён навсегда и больше не будет доступен
- 415 Unsupported Media Type — формат тела запроса не поддерживается сервером
- 422 Unprocessable Entity — тело запроса валидно по формату, но семантически некорректно (валидация)
- 429 Too Many Requests — превышен лимит запросов (rate limit). Проверить заголовок Retry-After
5xx — Server Error (Ошибки сервера)
- 500 Internal Server Error — внутренняя ошибка сервера. Общая ошибка без деталей
- 501 Not Implemented — метод не реализован сервером
- 502 Bad Gateway — шлюз/прокси получил некорректный ответ от вышестоящего сервера
- 503 Service Unavailable — сервер временно недоступен (перегрузка, обслуживание)
- 504 Gateway Timeout — шлюз не дождался ответа от вышестоящего сервера
- 505 HTTP Version Not Supported — версия HTTP не поддерживается сервером
Что тестировать с HTTP-статусами
Позитивные сценарии
- 200 OK — проверить для GET-запросов: тело ответа содержит ожидаемые данные
- 201 Created — проверить для POST: заголовок Location указывает на созданный ресурс
- 204 No Content — проверить для DELETE: тело ответа пустое
- 206 Partial Content — проверить докачку: заголовок Content-Range, правильный размер чанка
Негативные сценарии
- 400 Bad Request — отправить невалидный JSON, пустое тело, отсутствие обязательных полей
- 401 Unauthorized — запрос без токена, с истекшим токеном, с невалидным токеном
- 403 Forbidden — запрос от пользователя без прав на данный ресурс
- 404 Not Found — запрос к несуществующему endpoint, несуществующему ID ресурса
- 405 Method Not Allowed — GET на endpoint, который принимает только POST
- 415 Unsupported Media Type — отправить XML вместо JSON, если сервер ждёт JSON
- 422 Unprocessable Entity — email без @, возраст = -5, сумма = 0, пустая строка в имени
Граничные случаи
- Пустое тело — POST/PUT с пустым body — ожидаем 400 или 422
- Огромный payload — отправить 10MB+ данных — проверить 413 Payload Too Large или 400
- Спецсимволы — SQL-инъекции, XSS, Unicode, эмодзи в полях
- Длинные строки — 10000 символов в поле имени — проверить 400 или 422
- Отрицательные числа — возраст = -1, количество = -100 — ожидаем 422
- Null vs отсутствие поля — проверить разницу между null и отсутствующим полем в JSON
Rate limiting
- 429 Too Many Requests — превысить лимит запросов, проверить статус и заголовок Retry-After
- Retry-After — проверить, что после указанного времени лимит сбрасывается
- X-RateLimit-* — проверить заголовки X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
- Разные пользователи — rate limit считается на пользователя или на IP? Проверить оба сценария
Заголовки ответа
- Content-Type — проверить, что соответствует ожидаемому (application/json, text/html)
- Cache-Control — проверить no-cache, no-store, max-age для разных типов ответов
- ETag / Last-Modified — проверить условные запросы (If-None-Match → 304)
- CORS — проверить Access-Control-Allow-Origin, методы, заголовки
- Content-Encoding — проверить gzip/brotli сжатие ответа
- Content-Length — проверить соответствие фактическому размеру тела
Типичные ошибки при тестировании HTTP-статусов
- Проверять только 200 OK — забывают про 201 (создание), 204 (удаление), 304 (кэш). Каждый метод имеет свой ожидаемый статус
- Не проверять заголовки ответа — статус может быть 200, но Content-Type: text/html вместо application/json — это баг
- Игнорировать 429 — rate limit может сломать автотесты. Всегда проверять Retry-After и делать паузу
- Путать 401 и 403 — 401: нет аутентификации. 403: аутентификация есть, но нет прав. Разные сценарии
- Не проверять тело ошибки — 400/422 должны возвращать понятное сообщение об ошибке, а не просто статус
- Игнорировать 3xx — редиректы нужно проверять: куда ведёт, сохраняется ли метод, есть ли циклы
- Не проверять 5xx — 500/502/503 должны быть обработаны клиентом. Падать с ошибкой — неправильно
- Сравнивать статусы как числа — лучше проверять диапазон (2xx, 4xx), а не конкретный код, если спецификация допускает варианты
- Не проверять CORS — если API вызывается из браузера, CORS-заголовки критичны. Preflight-запросы (OPTIONS) тоже нужно тестировать
- Забывать про HEAD и OPTIONS — HEAD должен возвращать те же заголовки, что GET, но без тела. OPTIONS — список разрешённых методов
Источники
- Винтерингем — «Тестирование веб-API», 2024
- Jain — «Learn API Testing», 2022
- MDN Web Docs — HTTP Status Codes
- RFC 7231 — HTTP/1.1 Semantics and Content
- Куликов С. — «Тестирование ПО. Базовый курс», гл. 2.7