web-dev-qa-db-fra.com

Comment obtenir un rapport de couverture jacoco en utilisant Android plugin gradle 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 parviens toujours pas à obtenir un rapport de couverture après avoir exécuté certains tests. (ConnectedAndroidTest).

le build.gradle de mon module principal 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 du gradle de construction du projet est:

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

Une fois que je lance un gradlew connectedAndroidTest depuis le terminal, je peux trouver coverage-instrumented-classes et code-coverage dans le dossier build. Mais je ne trouve pas le dossier coverage dans le dossier reports. (Je ne vois que le dossier androidTests)

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

36
Taeho Kim

Au cours des centaines de fois où j'ai cherché la réponse pour obtenir un rapport de couverture, j'ai finalement trouvé la réponse exacte que je voulais.

D'après cet article de blog , j'ai trouvé que gradlew createDebugCoverageReport crée le rapport de couverture jacoco.

De plus, à partir du plugin gradle code source , le plugin utilise par défaut jacoco 0.6.2.201302030002. (par conséquent, la définition de la version jacoco n'est pas requise si vous allez utiliser une version par défaut)

En résumé, les étapes [~ # ~] essentielles [~ # ~] pour obtenir un rapport de couverture jacoco avec Android gradle est:

  1. Version du plugin Android Gradle 0.10.0 ou supérieure (généralement dans le build.gradle)
  2. ajouter testCoverageEnabled true au type de construction que vous souhaitez (c'est-à-dire debug)
  3. courir $ gradlew createDebugCoverageReport ou gradlew connectedCheck pour obtenir un rapport de couverture jacoco.

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

(Ajouter un cas multi-saveur à partir du commentaire de @ odiggity)

Si votre projet utilise une configuration à plusieurs saveurs, utilisez create{flavorName}CoverageReport au lieu. Le rapport de couverture sera généré à build/reports/coverage/{flavorName}/{buildType}.

Exemple pour la saveur krInternal avec debug type de build:

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

Pointe :

Comme 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 périphérique normal (non rooté):

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.

Script de construction Travis-CI pour obtenir la couverture du code

Inclure ce bloc dans build.gradle, pour tous les modules (bibliothèque, exemple, etc.)

Android {
    lintOptions {
        abortOnError false
    }
}

Ci-dessous est le .travis-ci.yml fichier

language: Android
jdk: oraclejdk8
Sudo: required

Android:
  components:
  # Uncomment the lines below if you want to
  # use the latest revision of Android SDK Tools
  - tools
  - platform-tools
  # The BuildTools version used by your project
  - build-tools-28.0.3
  # The SDK version used to compile your project
  - Android-28
  - Android-22
  - add-on
  # Additional components
  - extra-google-google_play_services
  - extra-Android-support
  - extra-google-m2repository
  - extra-Android-m2repository
  # Specify at least one system image,
  # if you need to run emulator(s) during your tests
  - sys-img-armeabi-v7a-Android-22

  licenses:
  - 'Android-sdk-preview-license-52d11cd2'
  - 'Android-sdk-license-.+'
  - 'google-gdk-license-.+'

before_cache:
- rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/

cache:
  directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/
    - $HOME/.Android/build-cache

before_install:
- yes | sdkmanager "build-tools;28.0.3"

before_script:
- echo no | Android create avd --force -n test -t Android-22 --abi armeabi-v7a -c 100M
- emulator -avd test -no-audio -no-window &
- Android-wait-for-emulator
- sleep 180
- adb devices
- adb Shell input keyevent 82 &

script:
- ./gradlew build connectedCheck

after_success:
- bash <(curl -s https://codecov.io/bash)
100
Taeho Kim

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

Racine build.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 et vous donnera ensuite la sortie Jacoco sous forme xml et html dans le répertoire de construction correspondant pour le type de construction de débogage.

7
Niklas

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

Ce que je veux compléter, c'est:

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

Veuillez essayer de modifier votre paramètre dans gradle pour utiliser les derniers outils de génération 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
Better Shao

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 le build.gradle de votre application.

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

3
nhaarman

Gradle a déjà 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. Fondamentalement, la seule chose que nous devons faire est de définir le paramètre testCoverageEnabled sur 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 /src/androidTest/Java/ répertoire. Après avoir exécuté 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 index.html fichier, nous pouvons voir le rapport visuel de la couverture du test, qui peut être consulté dans un navigateur Web.

Il ressemble à l'image ci-dessous.

enter image description here

article sur le rapport de couverture des tests dans Android http://blog.wittchen.biz.pl/test-coverage-report-for-Android-application/

2
Yuliia Ashomok