Из каких основных частей состоит HTTP-ответ при тестировании API?

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

Ответ

HTTP-ответ — это структурированное сообщение от сервера, состоящее из трех основных частей: строки статуса, заголовков и тела.

1. Строка статуса (Status Line) Содержит код состояния (Status Code) — трехзначное число, которое является ключевым для тестирования.

  • 2xx (Успех): 200 OK, 201 Created.
  • 3xx (Перенаправление): 301 Moved Permanently.
  • 4xx (Ошибка клиента): 400 Bad Request, 401 Unauthorized, 404 Not Found.
  • 5xx (Ошибка сервера): 500 Internal Server Error, 502 Bad Gateway.

2. Заголовки (Headers) Метаданные ответа. Важные для тестирования:

  • Content-Type: Указывает формат тела (application/json, text/html).
  • Content-Length: Размер тела.
  • Set-Cookie: Установка cookies для сессии.
  • Cache-Control: Директивы кэширования.

3. Тело ответа (Body) Фактические данные, обычно в формате JSON, XML, HTML или plain text. Основной объект проверки в тестах.

Полный пример ответа API (JSON):

HTTP/1.1 200 OK                    <-- Строка статуса
Content-Type: application/json     <-- Заголовки
Content-Length: 89
Date: Mon, 01 Jan 2024 12:00:00 GMT

{                                   <-- Тело ответа (начинается после пустой строки)
  "status": "success",
  "data": {
    "id": 5748,
    "title": "Sample Product",
    "inStock": true
  }
}

Что проверять в тестах API (на примере Python + requests):

import requests

response = requests.get("https://api.example.com/products/5748")

# 1. Проверка кода состояния
assert response.status_code == 200

# 2. Проверка заголовка Content-Type
assert "application/json" in response.headers["Content-Type"]

# 3. Проверка структуры и значений в теле ответа (JSON)
response_json = response.json()
assert response_json["status"] == "success"
assert "id" in response_json["data"]
assert response_json["data"]["inStock"] is True

# 4. Проверка на ошибки (например, для несуществующего ресурса)
error_response = requests.get("https://api.example.com/products/99999")
assert error_response.status_code == 404