Почему важно писать юнит-тесты?
Что проверяют
Есть ли у вас личная причина писать тесты, кроме «так принято в индустрии». Следом обычно спрашивают, что именно вы покрываете, что осознанно не покрываете и как поступаете, когда баг нашли уже на проде.
Как отвечать
Держитесь практической пользы, а не лозунгов про качество:
- страховка при изменениях: тесты позволяют менять внутренности функции и через секунды узнать, что поведение не поехало. Без них рефакторинг превращается в ручную проверку по чек-листу;
- скорость обратной связи: сотни юнит-тестов прогоняются за секунды, а поднять окружение и покликать руками это минуты. Ошибка ловится там, где её дешевле всего чинить;
- давление на дизайн: если функцию тяжело протестировать, обычно она делает слишком много или тянет за собой сеть, время и глобальное состояние. Тест это первый пользователь вашего API;
- фиксация краевых случаев: пустой список, отрицательное число,
None, перевод часов. Это лучше записать тестом, чем комментарием; - живая документация:
pytestс говорящими именами иparametrizeпоказывает контракт функции точнее README, потому что он не устаревает молча.
Добавьте инструменты: pytest с фикстурами, monkeypatch или unittest.mock для внешних зависимостей, hypothesis для проверки свойств на сгенерированных данных, freezegun или подмена источника времени. Отдельно скажите про баг на проде: он закрывается тестом, который сначала падает и становится зелёным после исправления. Так регрессия не повторяется.
Полезно обозначить границу: юнит-тест проверяет логику без базы и сети, связку компонентов проверяет интеграционный тест. Они не заменяют друг друга.
Где спотыкаются
Меряют качество процентом покрытия. Сто процентов достигаются тестами вообще без проверок; полезнее смотреть, ловят ли тесты реальные поломки, вплоть до мутационного тестирования.
Пишут тесты на реализацию: проверяют, что вызвался конкретный внутренний метод. Любой рефакторинг красит их в красный при неизменном поведении, и команда начинает их отключать.
Мокают всё вокруг, включая ту логику, ради которой тест написан. Прогон зелёный, а в проде код падает на первом же расхождении с настоящей библиотекой.