Что использовать кроме тестов для обеспечения качества кода (линтеры, форматеры, статический анализ)
Что проверяют
Знаете ли вы, что качество кода держится не на одних тестах, и понимаете ли, чем перечисленные инструменты отличаются друг от друга. Заодно смотрят, работали ли вы в проекте, где проверки стоят в конвейере сборки и обязательны для всех, или видели линтер только как подчёркивание в редакторе.
Как отвечать
Разложить по слоям, от дешёвого к дорогому:
- форматеры:
black,ruff format. Они ничего не ищут, а приводят оформление к одному виду, чтобы в ревью не спорили про переносы и кавычки; - линтеры:
ruff,flake8,pylint. Ловят неиспользуемые импорты, затенение имён, подозрительные конструкции, отклонения от соглашений; - проверка типов:
mypy,pyright. Единственный слой, который видит несовпадение сигнатур между модулями и находитNoneтам, где его не ждут; - безопасность:
banditпо своему коду иpip-auditпо зависимостям, это разные риски; - процессы: обязательное ревью,
pre-commitна машине разработчика и те же самые проверки в CI, покрытие как подсказка, а не как цель.
Главная мысль ответа: инструмент работает, только когда его нельзя обойти. Проверка, которая живёт в инструкции, а не в конвейере, не выполняется никем.
Где спотыкаются
Путают линтер с форматером и заявляют, что линтер ловит синтаксические ошибки. Синтаксис ловит сам интерпретатор при импорте, линтер работает уровнем выше, а форматер вообще ничего не проверяет: он переписывает текст. Их стилевые правила ещё и конфликтуют, поэтому в проекте с форматером стилевую часть линтера отключают.
Включают строгий набор правил разом на старой кодовой базе, получают тысячи замечаний и выключают проверку целиком. Внедряют иначе: фиксируют текущее состояние, требуют чистоты только от новых и изменённых файлов, ужесточают правила по одному.
Считают проверку типов заменой тестам. Аннотации в рантайме не проверяются, данные из сети и из базы приходят какими угодно, и статический анализатор про них ничего не знает. Обратная ошибка касается покрытия: цифра показывает выполненные строки, а не проверенные утверждения.