web-dev-qa-db-fra.com

Couverture du code Jacoco dans Android studio

J'essaie de générer un rapport de couverture de code Jacoco. J'ai utilisé AndroidTestCase pour mes classes de test.

J'ai trouvé qu'en utilisant testCoverageEnabled true et en utilisant default Android -studio default jacoco, ./gradlew connectedCheck ou createDebugCoverageReport créer le pourcentage de cas de test réussis/échoués, mais aucun rapport de couverture.

Ensuite, j'ai essayé jacoco {toolVersion "0.7.1.201405082137"}, et la tâche jacocoTestReport (type: JacocoReport, dependOn: "testDebug"). J'ai essayé de changer la valeur dependOn avec diverses tâches. Le rapport montre une couverture de test de 0 (zéro), ce qui est impossible car au moins la moitié de toutes les classes sont testées.

J'ai suivi diverses réponses acceptées de débordement de pile au cours des derniers jours. Le résultat est négatif.

Mon dossier de fin d'études:

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

apply plugin: 'com.Android.application'
apply plugin: 'jacoco'

Android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "test.gradle.com.myapplicationtestgradle"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false            
            proguardFiles getDefaultProguardFile(
            'proguard-Android.txt'), 'proguard-rules.pro'
        }
        debug {
            testCoverageEnabled true
        }
    }

    jacoco {
        version "0.7.1.201405082137"
    }

    packagingOptions {
        exclude 'LICENSE.txt'
    }
}


jacoco {
    toolVersion "0.7.1.201405082137"
}

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
    group = "Reporting"

    description = "Generate Jacoco coverage reports"

   // exclude auto-generated classes and tests
    def fileFilter = ['**/R.class', '**/R$*.class', 
    '**/BuildConfig.*', '**/Manifest*.*',           
     'Android/**/*.*']
    def debugTree = fileTree(dir:   
    "${project.buildDir}/intermediates/classes/debug", 
    excludes: fileFilter)
    def mainSrc = "${project.projectDir}/src/main/Java"

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    additionalSourceDirs = files([
            "${buildDir}/generated/source/buildConfig/debug",
            "${buildDir}/generated/source/r/debug"
    ])
    executionData = fileTree(dir: project.projectDir, includes: 
                    ['**/*.exec', '**/*.ec'])

    reports {
        xml.enabled = true
        xml.destination = "${buildDir}/jacocoTestReport.xml"
        csv.enabled = false
        html.enabled = true
        html.destination = "${buildDir}/reports/jacoco"
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('junit:junit:4.11') {
        exclude module: 'hamcrest-core'
    }
}
22
user1365169

Je vois que vous l'avez déjà fait fonctionner, cependant, il existe une méthode plus simple pour obtenir les données d'exécution du test unitaire. Je me suis récemment penché sur cela aussi, j'ai en fait fait une écriture complète plus tôt aujourd'hui .

Dans ma situation, je ne voulais pas créer une tâche Gradle supplémentaire car je voulais que le rapport soit généré dans le cadre du flux de travail existant. Je ne voulais pas non plus ajouter explicitement le plugin Jacoco, car Google déjà dups les tâches Jacoco Ant pour les rapports de couverture pour les tests d'instrumentation.

En plus de définir les propriétés Android.jacoco.version et buildTypes.debug.testCoverageEnabled, J'ai ajouté ce qui suit aux arguments JVM testDebug pour générer les données d'exécution:

project.afterEvaluate {
  def append = "append=true"
  def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec"
  testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile"

  createDebugCoverageReport.dependsOn testDebug
}

Cela ajoute les données d'exécution du test unitaire au fichier de couverture généré par connectedAndroidTest, de sorte que votre rapport reflète à la fois les tests d'instrumentation et les tests unitaires, plutôt que chaque variante individuellement.

Notez que connectedAndroidTest écrase le fichier de couverture, tenez-en compte lors de la création de votre rapport. Si la tâche testDebug n'a pas de modifications et que vous exécutez createDebugCoverageReport, elle ne reflétera que votre couverture de test d'instrumentation. Donc, modifiez vos tests unitaires. La commande Linux touch peut être utile ici, même si je n'ai pas encore essayé.

12
Patrick McLaren

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 un 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

J'ai écrit un article sur le rapport de couverture de test dans Android et l'ai publié sur mon blog il y a quelque temps. Si vous êtes intéressé par ce sujet, vous pouvez le lire sur:

Mise à jour (Couverture des tests unitaires pour les tests Robolectric)

Si vous souhaitez créer un rapport de couverture de test à partir de tests unitaires écrits avec Robolectric et générer un rapport de couverture de test avec Jacoco , Travis CI et Codecov.io , veuillez consulter le nouvel article sur mon blog:

43
piotr.wittchen

J'ai complètement supprimé Android studio, Android sdk, gradle. Ensuite, réinstallez tout. Aujourd'hui, j'ai complètement supprimé Android studio, Android sdk, gradle. Ensuite, réinstallez tout. Après cela, je viens d'ajouter à l'intérieur de l'application build.gradle.

debug {
    testCoverageEnabled true
}

Ensuite, je lance ./gradlew connectedChec. Tout fonctionne parfaitement. Android studio par défaut Jacoco fonctionne bien pour moi. Je pense qu'il est également possible de créer une tâche jacocoTestReport puis de créer une couverture de code.Je ne sais pas pourquoi gradle et Android le studio ne fonctionnait pas auparavant.

2
user1365169

j'ai étudié la bonne façon d'obtenir un rapport de couverture de code fusionné avec Jacoco, vous pouvez le vérifier ici: https://Gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba

J'ai utilisé AndroidStudio 2.2.2 avec Gradle 3.2 et Android Gradle Plugin 2.2.2

1
ultraon