Код-ревью Middle Пирамида и стратегия обновлено

Ревью: тесты связаны цепочкой

Вопрос

Найдите проблемы в наборе API-тестов заказа.

import requests

BASE = "https://stage.shop.local/api"
order_id = None

def test_create_order():
    global order_id
    r = requests.post(f"{BASE}/orders", json={"user_id": 42, "sku": "A1"})
    order_id = r.json()["id"]

def test_pay_order():
    r = requests.post(f"{BASE}/orders/{order_id}/pay")
    assert r.status_code == 200

def test_cancel_paid_order():
    r = requests.post(f"{BASE}/orders/{order_id}/cancel")
    assert r.status_code == 200

Коротко

Главная беда: цепочка тестов через глобальную переменную. Правильно: фикстура, которая создаёт заказ через API для каждого теста (или билдер), и в тесте отмены своя оплата внутри подготовки.

Что должен найти ревьюер

  1. Ошибкастрока 4
    Глобальное состояние между тестами: тесты зависят от порядка, не запускаются по одному и параллельно
  2. Ошибкастрока 8
    Жёстко зашитый user_id=42 на общем стенде: пользователя могут удалить или изменить
  3. Ошибкастрока 9
    Нет проверки статуса и тела ответа при создании: тест «создания» ничего не проверяет
  4. Ошибкастрока 12
    Если создание упало, оплата падает с непонятной ошибкой (order_id = None)
  5. Стильстрока 3
    Адрес стенда захардкожен, лучше брать из конфигурации или переменной окружения
  6. Ошибкастрока 17
    Проверяется только код 200, а не то, что заказ реально отменён (статус в теле или повторный GET)

Разбор

Главная беда: цепочка тестов через глобальную переменную. Правильно: фикстура, которая создаёт заказ через API для каждого теста (или билдер), и в тесте отмены своя оплата внутри подготовки. Проверки должны касаться результата, а не только кода ответа. Адрес стенда и данные пользователя берутся из конфигурации и создаются тестом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме