← Назад к вопросам

В чем разница между успешным и неуспешным запросом?

1.6 Junior🔥 151 комментариев
#Тестирование API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Успешный и неуспешный HTTP-запрос: фундаментальное различие

Различие между успешным (успешный HTTP-ответ, статус 2xx) и неуспешным (ошибка, статус 4xx/5xx) запросом лежит в основе тестирования API и веб-приложений. Как QA-инженер, я анализирую это по нескольким ключевым аспектам.

Код состояния HTTP (Status Code)

Успешный запрос (2xx) подтверждает, что сервер принял, понял и обработал запрос клиента:

  • 200 OK – стандартный ответ для успешных GET, POST, PUT, DELETE.
  • 201 Created – запрос выполнен, новый ресурс создан (часто после POST).
  • 204 No Content – сервер успешно обработал запрос, но не возвращает содержимого (например, после DELETE).

Неуспешный запрос указывает на проблему на стороне клиента (4xx) или сервера (5xx):

  • 4xx Client Error – ошибка в запросе клиента.
    *   **400 Bad Request** – синтаксическая ошибка, неверная структура JSON/XML.
    *   **401 Unauthorized** – требуется аутентификация.
    *   **403 Forbidden** – доступ запрещён (нет прав).
    *   **404 Not Found** – ресурс не существует.
  • 5xx Server Error – ошибка на стороне сервера.
    *   **500 Internal Server Error** – общая ошибка сервера.
    *   **502 Bad Gateway** – прокси/шлюз получил неверный ответ от сервера.
    *   **503 Service Unavailable** – сервер временно недоступен.

Тело ответа (Response Body)

Успешный запрос обычно возвращает полезные данные в ожидаемом формате (JSON, XML):

// Пример успешного ответа на GET /api/users/1
{
  "id": 1,
  "name": "Иван Петров",
  "email": "ivan@example.com",
  "status": "active"
}

Неуспешный запрос зачастую содержит сообщение об ошибке для отладки:

// Пример неуспешного ответа на POST /api/users с неверными данными
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Email имеет неверный формат",
    "details": {
      "field": "email",
      "value": "ivan.example.com"
    }
  }
}

Заголовки ответа (Response Headers)

Оба типа ответа содержат заголовки, но для неуспешных они могут быть критически важны:

  • Content-Type – должен соответствовать заявленному (например, application/json).
  • Retry-After – может появиться при 503, указывая, когда повторить запрос.

С точки зрения тестирования

Вот как я, как QA Engineer, подхожу к валидации:

  • Верификация успешных сценариев (Positive Testing):
    *   Проверяю, что код состояния соответствует ожидаемому (например, **201** для создания).
    *   Валидирую структуру и данные в теле ответа по **JSON Schema** или контракту.
    *   Проверяю, что бизнес-логика выполнилась (данные сохранились в БД, отправлено письмо и т.д.).
    *   Убеждаюсь в корректности заголовков, особенно для кеширования или безопасности.

  • Верификация неуспешных сценариев (Negative Testing):
    *   Намеренно отправляю некорректные данные (пустые поля, неверные типы, SQL-инъекции).
    *   Проверяю корректность **кода ошибки** и **читаемость сообщения** для пользователя/разработчика.
    *   Тестирую граничные значения и обработку исключений.
    *   Валидирую поведение системы при **5xx** ошибках (логируются ли они, есть ли мониторинг).

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

import pytest
import requests

# Тест на успешный запрос
def test_create_user_success():
    url = "https://api.example.com/users"
    payload = {"name": "Тест", "email": "test@example.com"}
    response = requests.post(url, json=payload)
    
    assert response.status_code == 201, f"Expected 201, got {response.status_code}"
    assert response.headers["Content-Type"] == "application/json"
    
    data = response.json()
    assert data["id"] is not None
    assert data["name"] == payload["name"]
    # Далее можно проверить наличие в БД через отдельный запрос

# Тест на неуспешный запрос (ошибка клиента)
def test_create_user_validation_error():
    url = "https://api.example.com/users"
    payload = {"name": "Тест", "email": "invalid-email"}  # Неверный формат
    response = requests.post(url, json=payload)
    
    assert response.status_code == 400, f"Expected 400, got {response.status_code}"
    
    error_data = response.json()
    assert "error" in error_data
    assert error_data["error"]["code"] == "VALIDATION_ERROR"
    assert "email" in error_data["error"]["message"].lower()

Вывод для QA-инженера

Главное различие – соответствие результата ожиданиям. Успешный запрос означает корректное выполнение операции и возврат валидных данных. Неуспешный – сигнализирует о проблеме, которую система должна корректно обработать, дав понятный ответ. Работа QA заключается не только в проверке "счастливого пути", но и в гарантии, что все возможные ошибки обрабатываются предсказуемо, безопасно и информативно. Это напрямую влияет на стабильность, безопасность и удобство использования продукта.