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

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

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

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

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

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

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