Lena_QA
2026-07-28 15:49
Привет, коллеги! Недавно на проекте столкнулась с ситуацией, когда один криво написанный conftest.py положил весь регресс-прогон. Причём баг был плавающий: тесты падали через раз, а виной всему — общая фикстура, которая не чистила за собой состояние. Давайте разберём типичные грабли с фикстурами в pytest и способы их избежать.
Первая проблема — это фикстуры с side effects, которые не восстанавливают окружение. Например, если фикстура создаёт запись в БД, но не удаляет её после теста, следующий тест может упасть из-за дубликата. Я всегда добавляю yield с cleanup-логикой, а для сложных сценариев использую scope='function' и явные tearDown. Но даже так легко пропустить краевой случай, если фикстура вызывает внешний сервис.
Вторая частая ошибка — глобальные фикстуры с scope='session', которые изменяют mutable-объекты. Допустим, фикстура возвращает список тестовых данных, и один тест его модифицирует. В результате другой тест получает испорченный список. Решение: либо возвращать копию (например, через copy.deepcopy), либо использовать scope='function' и пересоздавать объект каждый раз.
Третий момент — зависимости между фикстурами. Если фикстура A вызывает фикстуру B, и B падает, то A тоже падает, но сообщение об ошибке может ввести в заблуждение. Я стараюсь минимизировать цепочки зависимостей, а для критичных случаев добавляю явные assert'ы внутри фикстур. Например, проверяю, что БД доступна, перед тем как создавать запись.
Ещё один подводный камень — использование одних и тех же фикстур в разных тестах без учёта их состояния. Например, фикстура, которая авторизует пользователя, может работать только для первого теста, а сессия истекает для второго. Тут помогает параметризация фикстур через request.addfinalizer или использование встроенных механизмов pytest.
На практике я часто вижу, как разработчики забывают про teardown для временных файлов или сокетов. В Python это особенно критично, потому что мусор не собирается мгновенно. Я рекомендую использовать contextlib.contextmanager для создания чистых фикстур с гарантированным закрытием ресурсов.
И последнее: не стесняйтесь писать свои плагины для pytest, если стандартные фикстуры не покрывают ваши кейсы. Например, я написала плагин, который логирует все вызовы фикстур, чтобы быстро найти, какая из них вносит хаос в прогон.
Коллеги, а вы сталкивались с багами из-за фикстур? Какие методы используете для их отладки? Может, есть любимые библиотеки вроде pytest-timeout или pytest-xdist, которые помогают избежать проблем? Делитесь опытом, буду рада обсудить!
👍 2