Sobes.tech
Senior
30

Анализ кода с фикстурой session scope и autouse=True: какой тест упадёт и почему?

Companies where asked
Tangem

Answer from AI

sobes.tech AI

При использовании фикстуры с областью session и параметром autouse=True она автоматически применяется ко всем тестам в сессии.

Если в фикстуре происходит настройка или изменение состояния, которое не сбрасывается между тестами, то тесты, зависящие от чистого состояния, могут упасть.

Например, если фикстура создает сессию базы данных и не откатывает транзакции после каждого теста, то изменения, сделанные в одном тесте, могут повлиять на другие. В результате тест, ожидающий определенное состояние, упадет из-за измененного контекста.

Итого, тест упадет, если он зависит от изначального состояния, а фикстура с session scope и autouse=True не обеспечивает изоляцию между тестами.

Чтобы избежать этого, можно:

  • Использовать фикстуры с меньшей областью (например, function), чтобы состояние сбрасывалось после каждого теста.
  • В фикстуре явно откатывать изменения после каждого теста.
  • Не использовать autouse=True, а подключать фикстуру только там, где нужно.

Пример:

import pytest

@pytest.fixture(scope="session", autouse=True)
def setup_db():
    # подключение к БД
    yield
    # закрытие подключения

@pytest.fixture(autouse=True)
def rollback_transaction():
    # начать транзакцию
    yield
    # откат транзакции

# Если rollback_transaction не используется, изменения из тестов сохраняются,
# и тесты, ожидающие чистое состояние, упадут.