Какие модули и инструменты используются для тестирования в Python
Что проверяют
Пишете ли вы тесты на практике и знаете ли стек вокруг pytest, а не только его название. Следом обычно спрашивают про фикстуры, про то, как замокать внешний API, и где правильно ставить patch.
Как отвечать
Разложите инструменты по задачам:
pytest: стандарт де-факто. Тесты это обычные функции сassert, pytest переписывает его и показывает понятный дифф. Фикстуры с областью видимости (function,module,session), общие фикстуры вconftest.py, параметризация через@pytest.mark.parametrize;unittest: встроенный, в стиле xUnit с классамиTestCase. Встречается в старом коде и в Django, pytest запускает такие тесты без переделки;unittest.mock:Mock,MagicMock,AsyncMockдля корутин,patchкак декоратор или контекстный менеджер. Сautospec=Trueмок повторяет сигнатуру настоящего объекта;- плагины pytest:
pytest-covдля покрытия через coverage.py,pytest-xdistдля параллельного запуска (-n auto),pytest-asyncio,pytest-mockс фикстуройmocker; - HTTP и время:
responsesдля requests,respxдля httpx,freezegunилиtime-machine; - property-based:
hypothesisгенерирует входные данные и находит краевые случаи, о которых вы не подумали; - интеграция:
testcontainersподнимает настоящую PostgreSQL в Docker, для веба естьTestClientв FastAPI и тестовый клиент Django; - окружения:
toxилиnoxпрогоняют тесты на нескольких версиях Python.
doctest проверяет примеры в docstring. Он полезен для документации, но не как основной слой тестов.
Где спотыкаются
Патчат объект там, где он определён, а не там, где используется. Если модуль сделал from requests import get, патчить нужно mymodule.get, а не requests.get.
Мокают всё подряд, включая собственную базу. Тесты зелёные, а реальный SQL ни разу не выполнялся.
Гонятся за процентом покрытия. Строка, которую тест исполнил, но ничего не проверил, в отчёте выглядит покрытой. Смотрите хотя бы на покрытие ветвлений (--cov-branch).