Гарантирует ли HTTP-статус 200 (OK), что запрос работает корректно?

Ответ

Нет, статус 200 лишь означает, что сервер успешно обработал запрос и отправил ответ, но не гарантирует корректность данных или бизнес-логики.

Что может пойти не так при статусе 200:

  • Некорректная структура JSON/XML: ответ приходит, но не соответствует ожидаемой схеме (отсутствуют обязательные поля, неверный тип данных).
  • Неверные данные: например, запрос на создание пользователя вернул 200, но в ответе id пользователя равен null или 0.
  • Нарушение бизнес-правил: запрос на списание средств вернул 200, но баланс не изменился.
  • Неполные данные: запрос на получение списка элементов вернул 200 с пустым массивом [], когда ожидался непустой список.

Поэтому в API-тестах необходимо проверять не только статус, но и тело ответа (response body):

import requests
import jsonschema
from pydantic import BaseModel, ValidationError

# 1. Проверка статуса
response = requests.get('https://api.example.com/v1/users/123')
assert response.status_code == 200

# 2. Проверка структуры через JSON Schema
schema = {
    "type": "object",
    "properties": {
        "id": {"type": "integer"},
        "name": {"type": "string"},
        "email": {"type": "string", "format": "email"}
    },
    "required": ["id", "name", "email"]
}
jsonschema.validate(instance=response.json(), schema=schema)

# 3. Проверка бизнес-логики (например, данные соответствуют запрошенному ID)
user_data = response.json()
assert user_data['id'] == 123

# 4. Проверка с помощью Pydantic (валидация типов и значений)
class User(BaseModel):
    id: int
    name: str
    email: str

try:
    validated_user = User(**user_data)
except ValidationError as e:
    pytest.fail(f"Response validation failed: {e}")

Полноценное API-тестирование включает валидацию контракта (схемы), данных и бизнес-правил.

Ответ 18+ 🔞

Да ты послушай, какая история интересная вырисовывается! Многие думают, что если сервер вернул статус 200, то всё, пиши пропало — успех, можно расслабиться и пить чай. Ёпта, вот это и есть главная ловушка, в которую все лезут, как слепые котята!

Статус 200 — это просто грубая отмашка от сервера, типа «запрос твой, чувак, дошёл, я его прочитал и что-то тебе отправил в ответ». А что он там отправил — хуй с горы знает! Может, он тебе такую ахинею в JSON'е прислал, что хоть святых выноси.

Что может пойти не так, даже если светится этот злосчастный 200:

  • JSON кривой, как рога у чёрта. Вроде ответ есть, а попробуй распарсь — обязательных полей нет, типы данных перепутаны. Удивление пиздец, когда вместо числа строку присылают.
  • Данные — мусор полный. Запрос на создание юзера вроде прошёл, 200 получил, а в ответе id пользователя — null. И чё с этим делать? Доверия ебать ноль к такому АПИ.
  • Бизнес-логика пошла лесом. Запрос на списание бабла отработал, статус 200, а баланс, сука, не изменился. Вот тут и начинается терпения ноль ебать.
  • Пустота в ответе. Запрашиваешь список заказов, получаешь 200 и пустой массив []. А где, блядь, заказы? Сам от себя охуел.

Вывод простой, как три копейки: в АПИ-тестах обязательно нужно проверять не только статус, но и тело ответа. Иначе вся твоя автотестируемая хуйня накроется медным тазом.

Вот смотри, как это по-человечески делается:

import requests
import jsonschema
from pydantic import BaseModel, ValidationError

# 1. Первым делом, конечно, статус проверяем. Без этого никуда.
response = requests.get('https://api.example.com/v1/users/123')
assert response.status_code == 200

# 2. А теперь смотрим, что нам всучили. Проверяем структуру через JSON Schema.
schema = {
    "type": "object",
    "properties": {
        "id": {"type": "integer"},
        "name": {"type": "string"},
        "email": {"type": "string", "format": "email"}
    },
    "required": ["id", "name", "email"]
}
jsonschema.validate(instance=response.json(), schema=schema)

# 3. Лезем в саму суть. Данные-то правильные? Того юзера я запрашивал?
user_data = response.json()
assert user_data['id'] == 123

# 4. И на десерт — жёсткая валидация через Pydantic. Чтоб никаких неожиданностей.
class User(BaseModel):
    id: int
    name: str
    email: str

try:
    validated_user = User(**user_data)
except ValidationError as e:
    pytest.fail(f"Response validation failed: {e}")

Короче, нормальное тестирование АПИ — это когда ты вротберунчик проверяешь всё: и контракт (схему), и сами данные, и чтобы бизнес-правила не нарушались. Иначе потом сидишь и думаешь, какого хуя всё падает в продакшене, а тесты-то зелёные.