Pytest: фичи, которые перевернут ваш прогон

Вы открываете документацию pytest. Первые сто страниц — про базовый запуск и простые фикстуры. А потом вы натыкаетесь на файл conftest.py и видите магию.

Рассказываю про механизмы, которые лежат глубже стандартных туториалов.

conftest.py — дирижёрская палочка

Файл лежит в корне тестовой директории. Он управляет глобальным поведением. Без него вы завязаны на стандартную логику. С ним вы переписываете правила под свои задачи.

Фикстуры с автозапуском

autouse=True — одна из моих любимых фич. Фикстура стартует до любого теста, даже если её не вызвали явно. Идеальный кандидат для логирования, инициализации базы данных или поднятия временного окружения.

Три хука, которые экономят часы

Хук pytest_addoption добавляет кастомные флаги для запуска. Сделали --env=prod, и тесты сразу знают, на каком окружении работают.

Хук pytest_collection_modifyitems позволяет пересобирать список тестов на лету. Допустим, вы хотите исключить все кейсы с маркером @pytest.mark.slow для быстрой локальной проверки. Хук забирает их и откладывает.

Хук pytest_runtest_makereport — ваш главный союзник против флаки. Он перехватывает результат запуска каждого теста. Вместо слепого прогона вы получаете подробный лог, который потом можно зашить в CI-отчёт.

Кейс из практики

Прошлый месяц. На CI постоянно падали одни и те же тесты. Без видимой причины. Мы написали хук pytest_runtest_makereport. Он записывал стену выполнения в отдельный лог-файл. Сравнили результаты трёх прогонов. Поймали гонку данных в одном из модулей. Поправили — флаки ушли.

Переопределение сообщений об ошибках

Хук pytest_assertrepr_compare меняет вид вывода при падении assert. Вместо стандартного сравнения x == y вы получаете кастомное пояснение. Бизнес-логика становится прозрачнее.

Разрушаем миф

Многие думают, что хуки — сложный инструмент для матёрых разработчиков. На деле это всего пара строк в conftest.py. Они берут на себя рутину. Вы перестаёте гадать, почему тесты ведут себя странно. Вы диктуете правила.