Покрытие 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,

  1. Я создал jacocoTestReport задача.

  2. Я казнил $./gradlew createDebugCoverageReport который генерирует coverage.ec файл

  3. После этого я казнил $./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 не может быть найдено на устройстве, и иногда это показывает, что файл извлекается. Но, возможно, в обеих ситуациях его нельзя найти на устройстве. Таким образом, выбор другого устройства может решить проблему. Удачи!

Другие вопросы по тегам