Урок курса

Fixtures в pytest: подготовка данных и scope

Python для продвинутых: ООП, типизация и тестирование

Fixture в pytest создаёт данные или ресурс, необходимые тесту. Тест объявляет зависимость обычным параметром, а pytest находит одноимённую fixture и передаёт результат.

import pytest

@pytest.fixture
def user_payload():
    return {"name": "Ada", "active": True}

def test_active_user(user_payload):
    assert user_payload["active"] is True

Fixture удобнее ручного setup в каждом тесте: у неё есть явное имя, граф зависимостей и контролируемый жизненный цикл. Но fixture должна готовить состояние, а не прятать само проверяемое действие и assertion.

Cleanup через yield

Код до yield создаёт ресурс, значение после yield получает тест, а блок после него выполняет очистку даже при падении проверки.

@pytest.fixture
def temp_record(repository):
    record = repository.create("draft")
    yield record
    repository.delete(record.id)

Критичную очистку можно дополнительно защитить try/finally. Для файлов чаще уже есть встроенная fixture tmp_path, для подмены окружения — monkeypatch.

Fixture может зависеть от другой fixture. Слишком глубокий неочевидный граф усложняет тест: если по имени параметра нельзя понять, что он создаёт, разбейте setup на более явные части.

Scope и изоляция

По умолчанию scope равен function: новый экземпляр создаётся для каждого теста. class, module, package и session уменьшают стоимость дорогого setup, но увеличивают риск общего изменяемого состояния.

Session-scoped база или сервер могут быть общими, а данные внутри них лучше изолировать транзакцией, уникальным namespace или очисткой. Порядок тестов не должен влиять на результат.

Autouse-fixtures применяются без явного параметра и поэтому легко создают магию. Используйте их для действительно глобального инварианта, например запрета реальных сетевых запросов, а обычные предметные данные подключайте явно. Хорошая fixture делает зависимость теста видимой.

Попробуйте решить

Какой scope fixture используется pytest по умолчанию?

Продолжить с проверкой и прогрессом

Откройте интерактивный раннер с заданиями урока.

Перейти к интерактивному уроку