Как сделать автоматический вызов фикстуры в pytest

«Как сделать автоматический вызов фикстуры в pytest» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В pytest для автоматического вызова фикстуры для каждого теста в её области видимости используется параметр autouse=True. Это полезно для setup/teardown операций, которые должны выполняться всегда, например, для логирования, очистки тестовых данных или подготовки окружения.

Базовый пример:

import pytest

@pytest.fixture(autouse=True)
def auto_log_test_start_and_end():
    """Эта фикстура автоматически запустится для каждого теста в модуле."""
    print("n--- Начало теста ---")
    yield  # Здесь выполняется сам тест
    print("--- Конец теста ---")

def test_user_creation():
    # Фикстура auto_log_test_start_and_end вызовется автоматически
    assert create_user("test").id is not None

def test_user_deletion():
    # И для этого теста тоже
    assert delete_user("test") is True

Ключевые моменты:

  • Область видимости (scope): Фикстуру с autouse=True можно ограничить. По умолчанию scope="function". Для подготовки на уровне класса или модуля это нужно указать явно.
    @pytest.fixture(autouse=True, scope="class")
    def setup_for_test_class():
        """Выполнится один раз перед всеми тестами в классе."""
        init_test_database()
        yield
        cleanup_test_database()
  • Порядок выполнения: Фикстуры с autouse=True выполняются до фикстур, явно запрошенных в аргументах теста.
  • Использование с yield: Код после yield выполняется после теста (teardown), что идеально для очистки.

Я использую autouse=True для глобальных фикстур, критичных для всех тестов, например, для подключения к тестовой БД или мока внешних сервисов.