Код, покрытый тестами: где остановиться, чтобы не слить бюджет?
Многие команды стремятся достичь 100% покрытия кода тестами. Более того, в некоторых компаниях установлены высокие KPI (95-100%) на покрытие тестами кода. Высокое покрытие тестами - это отличная инвестиция в качество продукта. Однако высокое покрытие кода не гарантирует отсутствие ошибок, но дает дополнительные затраты на их написание и поддержку. Любая инвестиция должна быть рентабельной. Как понять что вложились достаточно и дальнейшие усилия принесут больше затрат, чем пользы?
Миф о 100% покрытии
Стремление к покрытию 100% кода тестами видится как идеал для любого проекта. Но если говорить о практической стороне, то 100% покрытие кода тестами практически не выполнимо. В некоторых случаях еще и слишком затратно.
⚠ Даже 100% покрытие кода тестами не гарантирует отсутствие дефектов. Тесты могут быть написаны формально, без проверки реальной логики работы. К тому же, покрытие всех строчек кода не гарантирует, что покрываются тестами все ветви и условия.
📈 После 80-90% затраты на написание тестов очень сильно растут (иногда даже экспоненциально). При этом, если проект активно развивается, то стоимость поддержки и исправления существующих тестов вносит значительный вклад в затраты на разработку.
🎯 Какой процент покрытия рентабелен
Согласно исследованиям, для большинства систем 80% - точка, при которой тесты рентабельны (Google, исследование UBC, практика Циана).
Почему не больше?Фокус на критических частях кода (биллинг, данные пользователей) даёт лучшую рентабельность, чем погоня за 100%. Лучше покрыть 80% качественными тестами, чем добиться 100% покрытия фиктивными.
Если приложение находится на стадии прототипирования (MVP/MLP), то покрытие в 40–60% позволит быстро итерироваться и внедрять изменения, сохраняя при этом достаточное качество ПО.
100% оправданы для критического ПО - инфраструктурного, авионики, ядра банковских систем.
⚖ Факторы влияющие на рентабельность
📌 Тип проекта:
- 🚀 Стартапы или прототипы - 40–60%
- 🏢 Корпоративные приложения - 50–90%
- 🛰 Высоконадежные системы (инфраструктура, авионика, ядра финтех) - 80–95%
📌 Критичность функциональности:
- ключевые модули должны быть покрыты тестами на 80–95%
📌 Стадии проекта:
- 🏗 запуск проекта - 40–60%
- ⚡ активная разработка - 50–90%
- 🛡 стадия поддержки - 80–95% (тесты позволяют не вносить регресс)
🛠 Практические советы по достижению рентабельного уровня
- 🎯 Фокусируйтесь на критически важных частях кода - направляйте усилия на тестирование тех частей кода, где ошибки могут привести к серьезным последствиям.
- ✅ Преследуйте качество, а не количество - лучше меньше тестов, но более качественных.
- 💰 Анализируйте стоимость ошибок - необходимо определить, во сколько обходится исправление дефекта на разных этапах и в различных частях системы, а после формируйте необходимый уровень покрытия.
- 🔄 Пересматривайте стратегию - оптимальный уровень покрытия может варьироваться в зависимости от типа проекта, его сложности и жизненного цикла.
📖 Интересная статья - Циан отказались от 100% покрытия. После анализа багов снизили до 80%, что почти не повлияло на пользовательский опыт, но высвободило дополнительные ресурсы.
🔗 Ссылки на материалы и исследования
- Quantifying Success: Measuring ROI in Test Automation
- QA Bible: Экономика тестирования
- Is 100% Test Coverage a Reasonable Requirement?
- Code Coverage: Why 100% Isn’t the Holy Grail
- Atlassian: Code Coverage
- Coverage is not strongly correlated with test suite effectiveness (UBC)
- Code Coverage at Google
- Singapore Management University Research
Мой канал в telegram