pytest и фикстуры

Тема дорожной карты · Python Programming

pytest — де-факто стандартный test runner для Python: обычный assert, лаконичный синтаксис, богатая экосистема плагинов. Тесты — функции, начинающиеся с test_; фикстуры (@pytest.fixture) дают переиспользуемый setup с явным scope (function/class/module/session) и dependency injection по имени параметра. parametrize — для table-driven тестов, monkeypatch/mocker — для изоляции, tmp_path — для работы с файловой системой. Типичные грабли: утечки общего состояния между тестами (помогает дефолтный function scope), session-scoped фикстуры, которые на самом деле небезопасно переиспользовать, забытый pytest-asyncio/anyio mode для async-тестов.

Как это работает

pytest и фикстуры в Python строится на pytest (de facto стандарт) или stdlib unittest. Тесты лежат в tests/ и следуют конвенции test_*.py. pytest обнаруживает тесты автоматически; ассерты — обычный assert (pytest переписывает их для богатого вывода ошибок). Fixtures (@pytest.fixture) — переиспользуемый setup/teardown; параметризация (@pytest.mark.parametrize) гоняет один тест на множестве входов. unittest.mock (или pytest-mock) подменяет коллабораторов в изоляции. coverage.py меряет покрытие по строкам/ветвям.

Когда применять

Тестируйте публичную поверхность каждого модуля с бизнес-логикой; пропускайте тривиальные геттеры и one-line обёртки. Цель — быстрые unit-тесты на чистые функции + integration-тесты на границе (БД, HTTP, файловая система). Mock-айте сайд-эффекты, которыми не управляете (сеть, время, случайность); over-mocking своего кода тестирует mock, а не код. Гоняйте pytest в CI на каждый PR; coverage — дымовой сигнал, не цель (погоня за 100% поощряет тривиальные тесты).

Типичные ошибки

Ловушки pytest и фикстуры: тесты, зависящие от порядка (изолированные fixture, не модульные глобалы); тесты, бьющие в реальную сеть или БД без маркировки (@pytest.mark.slow, @pytest.mark.integration) — CI взрывается; тестирование деталей реализации вместо поведения (любой рефакторинг рушит тест); flaky-тесты, на которые забивают (каждый подрывает доверие, пока вся suite не теряет смысл). Карантинить, потом чинить или удалять.

Связанные понятия

Полезные ресурсы