Плагин 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 из агента. Из-за различий между ними агрегированные числа инструкций и ветвей могут отличаться от чисел в отчетах о покрытии кода во время сборки.
Если у вас есть другие отзывы или вы хотите сообщить о проблеме, воспользуйтесь системой отслеживания ошибок.