Что такое code coverage
Что проверяют
Знаете ли вы, что покрытие измеряет факт исполнения кода, а не его проверку, и умеете ли читать отчёт в мобильном проекте, где тесты идут в двух разных средах.
Как отвечать
Code coverage это доля кода, исполненного при прогоне тестов. Основной инструмент в Android-проектах это JaCoCo: он считает инструкции, ветви, строки, методы, классы и цикломатическую сложность. Метрики стоит назвать по возрастанию строгости: строчная говорит лишь о том, что строка выполнилась; ветвевая требует, чтобы каждое условие прошло и по истинной, и по ложной ветке; покрытие путей на практике не считают из-за комбинаторного взрыва.
Ключевая особенность Android: цифр всегда две. Unit-тесты идут на JVM, инструментальные на устройстве или эмуляторе, и отчёты нужно объединять, иначе весь код, завязанный на фреймворк, выглядит непокрытым.
Правильная позиция на собеседовании: покрытие это индикатор незакрытых мест, а не цель. Полезнее смотреть покрытие изменённого кода в пул-реквесте, чем общее число по проекту, которое меняется на доли процента и ни о чём не говорит.
Где спотыкаются
Назначают целевое число и начинают гнаться за ним. Появляются тесты, которые прогоняют код без единой проверки: покрытие растёт, дефекты проходят мимо. Разницу между исполнением и проверкой хорошо показывает мутационное тестирование, и упомянуть его уместно.
Смотрят только на отчёт JVM-тестов и делают вывод о всём проекте. Экраны, работа с жизненным циклом и всё, что требует настоящего окружения, в этот отчёт не попадает, поэтому картина систематически занижена в одной половине кода и завышена в другой.
Не учитывают сгенерированный компилятором код: проверки аргументов на null, методы data-классов, ветки when. Они попадают в знаменатель и портят ветвевую метрику. Лечится это настройкой исключений в отчёте, а не написанием тестов на автогенерацию.