Код-ревью Middle pytest и фикстуры обновлено

Ревью: фикстуры pytest

Вопрос

Найдите проблемы в conftest и тестах.

import pytest, requests

@pytest.fixture(scope="session")
def user():
    r = requests.post(URL + "/users", json={"name": "test"})
    return r.json()

@pytest.fixture
def order(user):
    o = requests.post(URL + "/orders", json={"user": user["id"]}).json()
    return o

def test_rename_user(user):
    requests.patch(URL + f"/users/{user['id']}", json={"name": "new"})
    user["name"] = "new"

def test_order_owner(order, user):
    assert order["user"] == user["id"]
    assert user["name"] == "test"

Коротко

Исправление: пользователь function-скоупа (или фабрика) с yield и удалением, проверка r.raiseforstatus() или явный assert статуса в фикстуре, в тесте переименования проверка через GET, никакой правки общего словаря.

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

  1. Ошибкастрока 3
    Изменяемый пользователь на всю сессию: тесты меняют его и влияют друг на друга
  2. Ошибкастрока 6
    return вместо yield: созданный пользователь никогда не удаляется
  3. Ошибкастрока 5
    Нет проверки статуса ответа при создании: при ошибке тест упадёт позже с непонятным KeyError
  4. Стильстрока 11
    Заказ не удаляется после теста
  5. Ошибкастрока 13
    В тесте нет ни одной проверки
  6. Ошибкастрока 19
    Результат зависит от порядка: после test_rename_user имя уже new

Разбор

Исправление: пользователь function-скоупа (или фабрика) с yield и удалением, проверка r.raise_for_status() или явный assert статуса в фикстуре, в тесте переименования проверка через GET, никакой правки общего словаря.

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

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

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