Что такое пирамида тестирования
Что проверяют
Понимаете ли вы, почему тестов разного уровня должно быть разное количество и как это ложится на Python-проект. Следом обычно просят рассказать, как устроены тесты в вашем последнем проекте, что вы мокаете, а что поднимаете по-настоящему.
Как отвечать
Пирамиду популяризовал Майк Кон в книге «Succeeding with Agile» (2009). Идея: чем выше уровень, тем тесты медленнее, дороже в поддержке и хрупче, поэтому их меньше.
- основание, юнит-тесты: функции и классы в изоляции, миллисекунды на тест. В Python это
pytestс фикстурами иparametrize, зависимости подменяют черезunittest.mockилиpytest-mock; - середина, интеграционные: код вместе с реальной базой, брокером, HTTP-слоем. Для FastAPI это
TestClientилиhttpx.AsyncClient, для Djangopytest-django, базу поднимают черезtestcontainersили отдельный контейнер в CI; - вершина, end-to-end: система целиком глазами пользователя, например через Playwright для Python. Таких тестов немного, они закрывают ключевые сценарии вроде регистрации и оплаты.
Пропорции вроде 70/20/10 это эвристика из блога, а не правило. Важен принцип: баг ловят на самом низком уровне, где его вообще можно поймать.
Стоит назвать альтернативы:
- «рожок мороженого»: перевёрнутая пирамида, много ручных и UI-тестов, мало юнитов. Итог: медленный CI и постоянно нестабильные прогоны;
- трофей тестирования (Кент Доддс) и соты (Spotify): упор на интеграционные тесты. Для микросервиса, где своей логики мало, а риски в стыках с базой и соседями, это честнее классической пирамиды.
Метрики из практики: время прогона, доля нестабильных тестов, покрытие через pytest-cov, параллельный запуск через pytest-xdist.
Где спотыкаются
Называют пирамиду жёстким правилом и сыплют процентами, не объясняя, откуда разница в стоимости уровней.
Мокают всё подряд, включая ORM и собственные модули. Юниты зелёные, а приложение падает на первой реальной миграции, потому что поведение базы никто не проверял.
Относят к юнит-тестам всё, что запускается через pytest. Тест, который ходит в настоящую PostgreSQL, остаётся интеграционным, как бы его ни назвали.