Урок курса
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 по умолчанию?
Продолжить с проверкой и прогрессом
Откройте интерактивный раннер с заданиями урока.
