Сложность кода: не весь код легко тестируется изолированно (например, взаимодействие с внешними системами, базы данных).
Необходимость мокирования/стабов: для изоляции юнитов требуются заглушки, которые тоже нужно поддерживать и которые могут неточно имитировать поведение реальных зависимостей.
Пограничные условия и комбинации: количество возможных входных данных и их комбинаций может быть бесконечным или слишком большим для полного покрытия.
Нефункциональные требования: unit-тесты не проверяют производительность, удобство использования, безопасность и другие нефункциональные аспекты.
Ошибки интеграции: unit-тесты проверяют компоненты по отдельности, но не гарантируют их корректную работу вместе.
Недостатки в понимании требований: тесты пишутся на основе понимания требований, и ошибки в понимании приведут к неполному покрытию реальных сценариев использования.
Стоимость и время: достижение 100% покрытия может быть нерационально с точки зрения затрат времени и ресурсов при незначительном повышении качества.