Просмотр отчетов о покрытии кода (с агентом на устройстве)

Плагин Android Gradle (AGP) может создавать отчеты о покрытии кода для инструментальных тестов с помощью агента покрытия на устройстве. По умолчанию AGP инструментирует классы приложения с помощью JaCoCo при сборке приложения, то есть добавляет код, который записывает, какие части приложения запускают ваши тесты. При использовании агента покрытия на устройстве AGP собирает приложение без этого дополнительного кода, а агент инструментирует классы приложения на тестовом устройстве во время выполнения тестов. На этой странице описано, как включить покрытие кода на устройстве и создать отчеты.

По сравнению с покрытием кода во время сборки, покрытие кода на устройстве предлагает следующие преимущества:

  • Более быстрая сборка. AGP не выполняет этап инструментирования JaCoCo для классов приложения и их зависимостей, что может сократить время сборки на 10–20 %.
  • Меньший размер отладочных APK. AGP не добавляет код отслеживания покрытия в классы приложения, что может уменьшить размер отладочного APK на 20–25 %.

Фактическое время сборки и размер APK зависят от вашего проекта.

Требования

Чтобы использовать покрытие кода на устройстве, убедитесь, что ваш проект и тестовые устройства соответствуют следующим требованиям:

  • AGP 9.6.0-alpha01 или более поздней версии.
  • Устройство или эмулятор с Android 9 (уровень API 28) или более поздней версии.
  • Тип отладочной сборки для тестируемого варианта, например debug. Агент может подключаться только к приложениям, доступным для отладки.
  • Инструментальные тесты, которые выполняются с помощью AndroidJUnitRunner или расширяющего его пользовательского средства запуска тестов.

Включить покрытие кода на устройстве

Для покрытия кода на устройстве используется то же свойство enableAndroidTestCoverage, что и для покрытия кода во время сборки. Задайте для enableAndroidTestCoverage значение true в файлах сборки на уровне модуля для каждого варианта, для которого вы хотите получать отчеты о покрытии:

Kotlin

android {
    // ...
    buildTypes {
        debug {
            // Enable coverage for instrumentation tests
            enableAndroidTestCoverage = true
        }
    }
}

Яркий

android {
    // ...
    buildTypes {
        debug {
            // Enable coverage for instrumentation tests
            enableAndroidTestCoverage true
        }
    }
}

Затем включите агент покрытия на устройстве и агрегирование отчетов в файле gradle.properties проекта:

android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true

Для создания HTML-отчета о покрытии кода на устройстве используется тот же обработчик, что и для унифицированных отчетов о покрытии кода, поэтому требуются оба свойства.

Создание отчетов о покрытии кода на устройстве

Чтобы запустить инструментальные тесты и создать отчеты о покрытии, подключите устройство или запустите эмулятор, а затем выполните следующую задачу:

Область действия Команда Местоположение ошибки
Один вариант ./gradlew :module-name:createVariantNameAndroidTestCoverageReport path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html

Отличия от покрытия кода во время сборки

Отчеты о покрытии на устройстве и во время сборки могут показывать разные результаты для одних и тех же тестов. При сравнении этих двух отчетов или переносе пороговых значений покрытия из одного отчета в другой учитывайте следующие различия:

Район Покрытие кода во время сборки Покрытие кода на устройстве
Когда классы инструментируются Когда AGP создает приложение с помощью JaCoCo, на тестовом устройстве во время выполнения тестов с помощью агента покрытия;
Классы в отчете Все скомпилированные классы, кроме кода, помеченного как сгенерированный, например фабрики Dagger. Классы с исходным файлом в папках с исходным кодом модуля, включая фабрики Dagger.
Количество инструкций Инструкции байт-кода Java Инструкции байт-кода DEX
Количество ветвей Ветви в байт-коде Java Ветви в байт-коде DEX. D8 может компилировать условия в разные ветви, а каждый инструмент исключает разные ветви, созданные компилятором, поэтому количество может отличаться.
Счетчики Инструкции, ветви, строки, сложность, методы и классы Инструкции, ветви, строки, методы и классы. Счетчики сложности пока не поддерживаются.
Тестовые устройства Все уровни API, которые поддерживает ваше приложение. Android 9 (уровень API 28) или более поздняя версия
Необработанные данные об области захвата .ec файла coverage_metadata.pb и coverage_hits.pb файл

Чтобы вернуться к покрытию кода во время сборки, задайте для свойства значение android.experimental.androidTest.coverage.useOnDeviceAgent=false или удалите его. Вам не нужно менять файлы сборки или выполняемые задачи.

Известные проблемы

При покрытии кода на устройстве возникают следующие известные проблемы:

  • Сгенерированный код. Отчеты на устройстве включают сгенерированный код, например фабрики Dagger, которые обычно пропускаются в отчетах о времени сборки. Если ваши тесты не выполняют этот код, он считается непокрытым.
  • Сводные отчеты. Если в вашем проекте также собираются данные о покрытии из тестов хоста, например модульных тестов, сводный отчет о покрытии, созданный задачами testAllSuites и testAllSuitesWithDependencies, объединяет количество байт-кода Java из этих тестов с количеством байт-кода DEX от агента. Из-за различий между ними агрегированные числа инструкций и ветвей могут отличаться от чисел в отчетах о покрытии кода во время сборки.

Если у вас есть другие отзывы или вы хотите сообщить о проблеме, воспользуйтесь системой отслеживания ошибок.