Как получить отчет о покрытии jacoco с помощью плагина Android gradle 0.10.0 или выше?

Я пытаюсь получить отчет о тестовом покрытии с помощью плагина Gradle Android 0.10.2. Но я все еще не могу получить отчет о покрытии после выполнения некоторых тестов. (ConnectedAndroidTest).

build.gradle моего основного модуля:

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            testCoverageEnabled true
        }

        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
}

и раздел buildscript сборки gradle проекта:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.10.+'
    }
}

Однажды я бегу gradlew connectedAndroidTest из терминала я могу найти coverage-instrumented-classes а также code-coverage папка внутри build папка. Но я не могу найти coverage папка в reports папка. (Только я вижу это androidTests папка)

Чего-то не хватает для получения отчета о покрытии от Jacoco?

5 ответов

Решение

В течение сотен раз поиска ответа на получение отчета о покрытии, я, наконец, нашел точный ответ, что я хочу.

Из этого поста в блоге я обнаружил, что gradlew createDebugCoverageReport создает отчет о покрытии jacoco

Кроме того, из исходного кода плагина Gradle плагин по умолчанию использует jacoco 0.6.2.201302030002. (следовательно, определение версии jacoco не требуется, если вы собираетесь использовать версию по умолчанию)

Таким образом, основные шаги, чтобы получить jacoco Отчет о покрытии с плагином Android Gradle:

  1. Плагин Android Gradle версии 0.10.0 или выше (обычно в вашем проекте build.gradle)
  2. добавлять testCoverageEnabled true к типу сборки, которую вы хотите (т.е. debug)
  3. бежать $ gradlew createDebugCoverageReport или же gradlew connectedCheck чтобы получить jacoco отчет о покрытии.

Вы можете найти свой отчет о покрытии на build/reports/coverage/{buildType}, (т.е. build/reports/coverage/debug для отладочной сборки)

(Добавьте случай с несколькими вкусами из комментария @odiggity)

Если ваш проект использует конфигурацию с несколькими вариантами, используйте create{flavorName}CoverageReport вместо. Отчет о покрытии будет создан на build/reports/coverage/{flavorName}/{buildType},

Пример для аромата krInternal с отладочным типом сборки:

  • Команда: ./gradlew createKrInternalDebugCoverageReport
  • Отчет составлен по адресу: build/reports/coverage/krInternal/debug

Совет:

Поскольку вы можете получить только отчет о покрытии с emulator а также device with root permissionвы получите следующую ошибку после запуска команды на обычном (не рутированном) устройстве:

05:48:33 E/Device: Error during Sync: Permission denied                         
java.io.IOException: com.android.ddmlib.SyncException: Permission denied
    at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:114)
    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:158)
    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:42)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)   
Caused by: com.android.ddmlib.SyncException: Permission denied
    at com.android.ddmlib.SyncService.doPullFile(SyncService.java:511)
    at com.android.ddmlib.SyncService.pullFile(SyncService.java:320)
    at com.android.ddmlib.Device.pullFile(Device.java:849)
    at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:107)
    ... 10 more                
:myDirections:connectedAndroidTest FAILED      

FAILURE: Build failed with an exception.

Gradle уже имеет встроенную поддержку для генерации отчетов о тестовом покрытии, и нам не нужно создавать какие-либо дополнительные конфигурации или добавлять какие-либо плагины для генерации отчета о тестовом покрытии. По сути, единственное, что нам нужно сделать, это установить testCoverageEnabled параметр для true в build.gradle файл следующим образом:

android {
   buildTypes {
      debug {
         testCoverageEnabled = true
      }
   }
}

Далее мы можем выполнить следующую задачу Gradle из CLI:

./gradlew createDebugCoverageReport

В Windows мы можем выполнить это так:

gradlew.bat createDebugCoverageReport

Задача проанализирует код нашего проекта в /src/main/java/ каталог и модульные тесты размещены в /src/androidTest/java/ каталог. После выполнения этой задачи мы можем найти отчет о покрытии теста в следующем каталоге модуля:

/build/outputs/reports/coverage/debug/

Когда мы открываем index.html В файле мы можем увидеть визуальный отчет из тестового покрытия, который можно посмотреть в веб-браузере.

Это выглядит как на картинке ниже.

статья об отчете по тестированию в приложении Android http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

Я создал плагин с открытым исходным кодом для этого.

Root build.gradle

apply plugin: "com.vanniktech.android.junit.jacoco"

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.3.0'
    }
}

Тогда просто выполните

./gradlew jacocoTestReportDebug // or jacocoTestReportRelease

Он запустит тесты JUnit, а затем выдаст вывод Jacoco в форме xml и html в соответствующем каталоге сборки для отладочного типа сборки.

Нужно добавить ответ вместо комментария, так как моя репутация ниже 50...

Что я хочу дополнить это:

Google выпустил новые инструменты сборки, исправляющие неприятную проблему "VerifyError" ( ссылка).

Пожалуйста, попробуйте изменить настройки Gradle, чтобы использовать новейшие инструменты сборки, если вы столкнулись с проблемой "VerifyError". Например,

android {
    ......
    buildToolsVersion '21.1.1'
    .....
}

Поскольку инструменты сборки 21.0.0 содержат ошибки, пожалуйста, используйте версию больше, чем 21.0.0. Я использую 21.1.1.

Если вы хотите использовать версию, отличную от версии по умолчанию, добавьте

jacoco {
    version = '0.7.3.201502191951'
}

внутри android тег в вашем приложении build.gradle,

Один из способов найти номер последней версии: выполнить поиск "org.jacoco:jacoco" в JCenter.

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