tgoop.com/Golang_google/2887
Create:
Last Update:
Last Update:
«Дифференциальное покрытие» — это приём, который помогает быстро находить проблемные участки в коде, сравнивая покрытие не‐упавших и упавших тестов.
📌 Зачем это нужно
- В больших кодовых базах вручную отслеживать, где именно тест упал — долго и сложно.
- Сравнивая два профиля покрытия (успешного и провального), можно автоматически выделить только те участки, которые запустились при падении теста и не запускались ранее.
🚀 Как применить на Go-проекте
1. Собираем профиль «успешного» запуска (пропускаем проблемный тест):
go test -coverprofile=c1.prof -skip='TestAddSub$'
Выделяем строки, уникальные для упавшего теста:
(head -1 c1.prof; diff c[12].prof | sed -n 's/^> //p') > c3.prof
head -1 сохраняет шапку профиля
diff… | sed отбирает только новые строки
Открываем результат в браузере:
```bash
go tool cover -html=c3.prof
🔍 Интерпретация отчёта
Зелёным подсвечены участки, которые запустились только в упавшем тесте.
Красным — код, который обычно выполняется, но не был затронут падением теста (может натолкнуть на дополнительные вопросы).
Именно зелёные строки стоят изучить в первую очередь — там, скорее всего, спрятана ошибка.
Пример из math/big
В примере теста TestAddSub падение происходило из-за пропущенного za.neg = false в ветке else.
Из более чем 15 000 строк кода дифференциальное покрытие сузило поиск до 10 строк — двух из них было достаточно, чтобы диагностировать баг.
⚠️ Ограничения
Если баг зависит от специфичных данных или тест не чувствителен к ошибке, покрытие может не указать на проблемный код.
Тем не менее, в большинстве случаев «дифф-покрытие» даёт мгновенный фокус на действительно важных местах.
Используйте дифференциальное покрытие при отладке любых модулей Go (и не только!) — это дешёвый и высокоэффективный способ быстро найти виновника падения теста.
@golang_google