Comment puis-je obtenir un rapport de couverture jacoco en utilisant Android gradle plugin 0.10.0 ou supérieur?

J'essaie d'obtenir un rapport de couverture de test en utilisant Gradle Android plugin 0.10.2. Mais je ne peux toujours pas obtenir un rapport de couverture après avoir effectué quelques tests. (connectedAndroidTest).

La construction de mon module principal.gradle est :

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.+'
}

Et la section buildscript de la gradle de construction du projet est:

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

Une fois que j'ai exécuté un gradlew connectedAndroidTest à partir du terminal, je peux trouver le dossier coverage-instrumented-classes et code-coverage dans le dossier build. Mais je ne trouve pas le dossier coverage dans le dossier reports. (Seulement je peux voir est androidTests dossier)

Y a-t-il quelque chose qui manque pour obtenir un rapport de couverture jacoco?

36
demandé sur Taeho Kim 2014-05-22 03:40:41

5 réponses

Au cours des centaines de fois en cherchant la réponse pour obtenir un rapport de couverture, j'ai finalement trouvé une réponse exacte ce que je veux.

À partir du Cet article de blog , j'ai trouvé que gradlew createDebugCoverageReport crée le rapport de couverture jacoco.

Aussi, à partir du plugin gradle code source, le plugin utilise jacoco 0.6.2.201302030002 par défaut. (par conséquent, La définition de la version jacoco n'est pas requise Si vous utilisez une version par défaut)

En résumé, le étapes essentielles pour obtenir un rapport de couverture jacoco avec le plugin Android gradle sont:

  1. version du plugin Android gradle0.10.0 ou supérieur (généralement dans build.gradle de votre projet)
  2. ajouter testCoverageEnabled true pour le type de construction que vous voulez (c'est à dire debug)
  3. exécuter $ gradlew createDebugCoverageReport ou gradlew connectedCheck pour obtenir un jacoco rapport de couverture.

Vous pouvez trouver votre rapport de couverture sur le build/reports/coverage/{buildType}. (c'est-à-dire build/reports/coverage/debug pour la construction de débogage)

(ajouter Cas Multi-saveur de @ odiggity commentaire)

Si votre projet utilise une configuration multi-saveur, utilisez create{flavorName}CoverageReport à la place. Le rapport de couverture sera généré à build/reports/coverage/{flavorName}/{buildType}.

Exemple pour la saveur krInternal avec debug type de construction:

  • Commande: ./gradlew createKrInternalDebugCoverageReport
  • le rapport est généré à: build/reports/coverage/krInternal/debug

Astuce :

Puisque vous ne pouvez obtenir un rapport de couverture qu'avec les emulator et device with root permission, Vous obtiendrez l'erreur suivante après avoir exécuté une commande sur le dispositif régulier (non enraciné):

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.
96
répondu Taeho Kim 2015-03-17 00:57:06

Je dois ajouter une réponse au lieu d'un commentaire puisque ma réputation est inférieure à 50...

Ce que je veux compléter est:

Google a publié de nouveaux outils de construction corrigeant le méchant problème" VerifyError " (link).

Essayez de modifier vos paramètres dans gradle pour utiliser les derniers outils de construction si vous rencontrez le problème "VerifyError". Par exemple,

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

Étant donné que les outils de construction 21.0.0 sont bogués, veuillez utiliser une version supérieure à 21.0.0. J'utilise 21.1.1.

6
répondu Better Shao 2014-11-14 02:56:11

J'ai créé un plugin open source pour cela.

Construction racine.gradle

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

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

Ensuite, exécutez simplement

./gradlew jacocoTestReportDebug // or jacocoTestReportRelease

Il exécutera les tests JUnit, puis vous donnera la sortie Jacoco sous forme xml et html dans le répertoire de construction correspondant pour le type de construction de débogage.

6
répondu Niklas 2016-03-31 09:09:50

Si vous souhaitez utiliser une version différente de la version par défaut, ajoutez

jacoco {
    version = '0.7.3.201502191951'
}

À l'intérieur de la balise android dans build.gradle de votre application.

Une façon de trouver le dernier numéro de version: rechercher " org.jacoco: jacoco " sur JCenter .

3
répondu nhaarman 2015-02-26 01:56:04

Gradle dispose déjà d'un support intégré pour générer des rapports de couverture de test et nous n'avons pas besoin de créer de configurations supplémentaires ou d'ajouter des plugins pour générer un rapport de couverture de test. En gros, la seule chose que nous devons faire, est de testCoverageEnabled paramètre true dans build.gradle fichier comme suit:

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

Ensuite, nous pouvons exécuter la tâche Gradle suivante à partir de CLI:

./gradlew createDebugCoverageReport

Sous Windows, nous pouvons l'exécuter comme ceci:

gradlew.bat createDebugCoverageReport

La tâche analysera le code de notre projet dans /src/main/java/ répertoire et tests unitaires placés dans le répertoire /src/androidTest/java/. Après l'exécution de cette tâche, nous pouvons trouver le rapport de couverture de test dans le répertoire suivant du module:

/build/outputs/reports/coverage/debug/

Lorsque nous ouvrons le fichier index.html, nous pouvons voir le rapport visuel de la couverture de test, qui peut être consulté dans un navigateur web.

Il ressemble à l'image ci-dessous.

entrez la description de l'image ici

Article sur le rapport de couverture de test dans L'application Android http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

2
répondu Yuliia Ashomok 2016-12-21 18:51:49