
Ложное чувство защиты: Почему 90% code coverage не спасает от багов
Andrey_Biryukov 10 минут назад Ложное чувство защиты: Почему 90% code coverage не спасает от багов Средний 11 мин 228 Блог компании OTUS Java * Программирование * Тестирование IT-систем * Туториал Привет, Хабр! Меня...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Значимый прорыв формирует отрасль ИИ: Andrey_Biryukov 10 минут назад Ложное чувство защиты: Почему 90% code coverage не спасает от багов Средний 11 мин 228 Блог компании OTUS Java * Программирование * Тестирование IT-систем * Туториал Привет, Хабр! Меня зовут Андрей Бирюков. Я — независимый эксперт в области ИТ и ИБ, преподаю в учебных центрах и пишу статьи и книги.
Проблема, о которой мы будем говорить сегодня знакома многим тестировщикам. Jenkins или GitLab CI рапортует: «Покрытие кода тестами — 94%». Зелёная галочка, начальство довольно, команда идёт пить кофе.
Технические детали
А на проде через две недели падает критическая фича, потому что кто-то поменял знак сравнения с > на >=, и все тесты… всё равно прошли зелёными. Добро пожаловать в самую дорогую иллюзию в разработке ПО: уверенность, основанную на покрытии строк. Покрытие в 90% — это как бронежилет из фольги.
Он выглядит убедительно на расстоянии, но первая же пуля покажет его настоящую природу. В этой статье мы разберём три конкретные метрики покрытия, их слепые зоны и инструмент, который безжалостно покажет дыры в ваших тестах — мутационное тестирование. Три типа покрытия: почему строки — самая бесполезная метрикаРазработчики обычно знают только один вид покрытия — сколько строк кода выполнилось во время тестов.
Это всё равно, что оценивать здоровье человека по тому, как часто он моргает. Давайте на реальном куске кода увидим разницу между тремя типами покрытия. public class PaymentProcessor { public String processPayment(double amount, String currency, boolean isCorporate) { String result = "pending"; if (amount <= 0) { result = "invalid_amount"; logError("Negative or zero amount: " + amount); return result; } if (currency == null currency.
isEmpty()) { result = "invalid_currency"; return result; } if (isCorporate) { // Применяем корпоративный дисконт, но только для валюты USD if ("USD". equals(currency)) { amount = amount * 0.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




