Покрытие Android Jacoco пусто с Gradle
Я пытаюсь заставить jacoco создать отчет о покрытии кода для моего проекта тестирования Android. У меня есть следующее в build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'jacoco'
...
jacoco {
toolVersion = "0.7.1.201405082137"
}
...
android {
buildTypes {
release {
}
debug {
testCoverageEnabled true
}
}
}
когда я запускаю gradlew -i createDebugCoverageReport, я получаю отчет о покрытии, но он пустой. конец выполнения gradle выглядит следующим образом:
:androidTest:connectedAndroidTest (Thread[main,5,main]) completed. Took 2 mins 36.951 secs.
:androidTest:createDebugCoverageReport (Thread[main,5,main]) started.
:androidTest:createDebugCoverageReport
Executing task ':androidTest:createDebugCoverageReport' (up-to-date check took 0.006 secs) due to:
Output file /home/akos/src/androidTest/build/outputs/reports/coverage/debug has changed.
Output file /home/akos/src/androidTest/build/outputs/reports/coverage/debug/index.html has been removed.
Output file /home/akos/src/androidTest/build/outputs/reports/coverage/debug/.resources/package.gif has been removed.
[ant:reportWithJacoco] Loading execution data file /home/akos/src/androidTest/build/outputs/code-coverage/connected/coverage.ec
[ant:reportWithJacoco] Writing bundle 'debug' with 3 classes
:androidTest:createDebugCoverageReport (Thread[main,5,main]) completed. Took 0.215 secs.
BUILD SUCCESSFUL
Total time: 4 mins 53.467 secs
и действительно, упомянутый выше файл cover.ec пуст (имеет длину 0)
в каталоге build/ промежуточные / покрытие-инструментарий-классы /, кажется, у меня есть файлы инструментированных классов
это с Gradle 2.1
Что я делаю неправильно?
8 ответов
Попробуйте создать отчет о покрытии отладки, используя Nexus device
(5 или 5x), он будет работать отлично. Я столкнулся с той же проблемой с Samsung devices
(cover.ec пусто) но после этого я запускаю его с Nexus 5x
и все работало нормально.
Джакоко должен быть внутри android
закрытие и объявление плагина jacoco не требуется:
apply plugin: 'com.android.application'
...
android {
buildTypes {
release {
}
debug {
testCoverageEnabled true
}
}
jacoco {
toolVersion = "0.7.1.201405082137"
}
}
Я использую тот же gradle.build и просто ввожу команду ниже для терминала. Он дал мне отчет о покрытии и результаты теста в виде HTML-страницы.
$. / gradlew createDebugCoverageReport
Другое предложение есть; введите терминал
$./gradlew --gui
он открывает окно графического интерфейса, и вы можете найти правильную команду.
Иногда из-за некоторых ограничений безопасности базового оборудования вы не можете получить отчеты о покрытии. В моем случае я использовал android:sharedUserId="android.uid.system", и из-за этого он не покрывал никакого покрытия и давал мне пустой файл.
Поэтому я согласен с тем, что вы должны попробовать запустить его на разных устройствах и убедиться, что ваше приложение не использует android:sharedUserId="android.uid.system".
Проблема в плагине Android Gradle 0.14.0, который генерирует пустой файл cover.ec. Он известен и был исправлен в одной из веток, но пока еще не сделал его публичным: https://code.google.com/p/android/issues/detail?id=78556
С другой стороны, прекрасный шаблон обходного проекта для Android Studio можно найти здесь, используя Jacoco и RoboElectric: https://github.com/nenick/android-gradle-template
Поэтому вы можете подождать, пока Google исправит это, или использовать чей-то репозиторий библиотеки сборки, но плагин gradle для Android Studio 1.0.0 бесполезен.
Теперь (октябрь 2015) вы можете использовать его, так как команда Android исправила ошибку.
android {
...
buildTypes {
debug {
testCoverageEnabled true
}
}
...
dependencies{
androidTestCompile 'com.android.support.test:runner:0.4.1'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4.1'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1'
}
}
Тогда просто используйте ./gradlew createDebugCoverageReport
,
Я нашел решение той же проблемы из покрытия кода Jacoco в Android Studio со вкусами. У него есть пример, что делать в случае, если вместо cover.ec сгенерирован testDebug.exec
,
Я создал
jacocoTestReport
задача.Я казнил
$./gradlew createDebugCoverageReport
который генерируетcoverage.ec
файл- После этого я казнил
$./gradlew jacocoTestReport
и это создает HTML.
Я сделал интересное наблюдение. У меня была такая же проблема, с coverage.ec
Файл размером 0 байт. Я попробовал все ответы здесь, а также эти:
https://code.google.com/p/android/issues/detail?id=170607
Это ничего не изменило. мой build.gradle
Файл имеет только эти настройки, чтобы Jacoco работал:
apply plugin: 'com.android.application'
apply plugin: 'jacoco'
android {
...
buildTypes {
...
debug {
testCoverageEnabled true
}
}
...
}
Моя версия Android Studio 1.2.2. У меня есть следующие настройки Gradle в "Файл -> Структура проекта":
- Версия Gradle: 2.2.1
- Версия плагина Android: 1.2.3
Я пытался запустить контрольно-измерительные приборы с gradlew cC
на Motorola Moto G 4G LTE - Android 4.4.4
с правильно проведенных контрольно-измерительных приборов, но с coverage.ec
файл, имеющий 0 байтов. Сегодня я попробовал другое устройство: LG Spirit 4G LTE - Android 5.0
и теперь покрытие кода работает!!! coverage.ec
Файл имеет 322 байта, и я вижу правильные отчеты о покрытии HTML.
То, что я думаю, это то, что иногда работает с Gradle gradlew cC --debug
показывает, что coverage.ec
не может быть найдено на устройстве, и иногда это показывает, что файл извлекается. Но, возможно, в обеих ситуациях его нельзя найти на устройстве. Таким образом, выбор другого устройства может решить проблему. Удачи!