Jacoco de couverture de code dans Android Studio avec des saveurs

j'ai essayé de faire des tests sur Jacoco depuis un moment maintenant. J'ai essayé plusieurs solutions possibles rapportées dans ces sujets:

code de test Android avec JaCoCo Gradle plugin

Comment puis-je obtenir un rapport de couverture jacoco en utilisant le plugin Android gradle 0.10.0 ou plus?

J'exécute les essais dans un dispositif émulaté en utilisant genymotion. Voici ce que j'ai ajouté à construire.gradle:

apply plugin: 'jacoco'

android{       
    jacoco {
        version "0.7.1.201405082137"
    }        
    buildTypes{
        debug{
                    testCoverageEnabled = true
        }
    }
}

jacoco {
    toolVersion "0.7.1.201405082137"
}

à exécutez-je utiliser quelque chose comme

./gradlew clean
./gradlew createFLAVOR_NAMEDebugCoverageReport

pertinentes générées fichiers/dossier sont les suivantes:

/build/intermediates/coverage-instrumented-classes
/build/intermediates/jacoco
/build/outputs/code-coverage/connected/flavors/MyFlavor/coverage.ec

Toutefois, il n'y a rien @ construire/rapports/jacoco/test/html/index.html ou toute page html / code rapport de couverture @ / build / outputs.

j'ai aussi essayé de créer une tâche dédiée pour construire un rapport de couverture:

def coverageSourceDirs = [
    'src/main/java',
]

task jacocoTestReport(type: JacocoReport, dependsOn: "connectedAndroidTestFLAVOR_NAMEDebug") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled = true
        html.enabled = true
    }
    classDirectories = fileTree(
        dir: './build/intermediates/classes/debug',
        excludes: ['**/R*.class',
                   '**/*$InjectAdapter.class',
                   '**/*$ModuleAdapter.class',
                   '**/*$ViewInjector*.class'
        ])
    sourceDirectories = files(coverageSourceDirs)
    executionData = files("$buildDir/jacoco/connectedAndroidTestMyFlavorDebug.exec")
    // Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174.
    // We iterate through the compiled .class tree and rename $$ to $.
    doFirst {
       new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
            if (file.name.contains('$$')) {
                file.renameTo(file.path.replace('$$', '$'))
            }
        }
    }
}

./gradlew propre et ./ gradlew jacocoTestReport. La sortie est la même que ci-dessus, donc, pas de code html page de couverture du rapport ou tout autre fichier.

J'utilise actuellement Android Studio v1.0.2 avec la dernière version de gradle. Je suis assez nouveau à gradle, il est donc possible que je manque quelque chose de base ici.

Merci

16
demandé sur Community 2015-01-22 12:37:44

2 réponses

Après avoir passé toute la journée à chasser cette question, j'ai trouvé le problème. Contrairement aux exemples que j'ai vus, le fichier généré par la construction de testDebug n'est pas le .fichier exec@$buildDir/jacoco / testDebug.exec.

Avec mon gradle et studio version du fichier généré est un .ce @build/sorties/code-couverture/connecté/saveurs/myFlavor/la couverture.ce

Je n'ai trouvé aucune information pertinente à ce sujet. Il peut être d'une récente changer, cependant, en créant une tâche JacocoReport personnalisée et en changeant la variable executionData en conséquence j'ai résolu le problème. Voici mon oeuvre:

task jacocoTestReport(type: JacocoReport) {

  def coverageSourceDirs = [
        'src/main/java'
  ]

  group = "Reporting"
  description = "Generates Jacoco coverage reports"
  reports {
      xml{
          enabled = true
          destination "${buildDir}/reports/jacoco/jacoco.xml"
      }
      csv.enabled false
      html{
          enabled true
          destination "${buildDir}/jacocoHtml"
      }
  }

  classDirectories = fileTree(
          dir: 'build/intermediates/classes',
          excludes: ['**/R.class',
                     '**/R$*.class',
                     '**/BuildConfig.*',
                     '**/Manifest*.*',
                     '**/*Activity*.*',
                     '**/*Fragment*.*'
          ]
  )

  sourceDirectories = files(coverageSourceDirs)
  additionalSourceDirs = files(coverageSourceDirs)
  executionData = files('build/outputs/code-coverage/connected/flavors/smartcompanion/coverage.ec')
}
9
répondu Adr3nl 2015-01-22 18:33:26

Test du rapport de couverture utilisant Jacoco avec des saveurs Android:

considérons que vous avez des saveurs nommées "free" et "paid"

  • Etape 1 : Créer le fichier jacoco.gradle dans le répertoire des modules de vos projets (par défaut app) où build.gradle existe, il devrait être à côté de construire.dossier gradle. structure du répertoire tel qu'indiqué ci-dessous

    app > jacoco.gradle

  • Etape 2: Coller ci-dessous code dans le fichier que nous avons créé à L'Étape 1 , le code a commentaires explicatifs pour comprendre

apply plugin: 'jacoco'

jacoco {
    toolVersion = "0.7.5.201505241946"
}
project.afterEvaluate {
    // Grab all build types and product flavors
    def buildTypes = android.buildTypes.collect { type ->
        type.name
    }
    def productFlavors = android.productFlavors.collect { flavor ->
        flavor.name
    }
    // When no product flavors defined, use empty
    if (!productFlavors) productFlavors.add('')

    //iterate over the flavors

    productFlavors.each {

        productFlavorName ->
//iterate over build types like debug,release,prod etc.
        buildTypes.each {

            buildTypeName ->
                //sourceName — e.g. freeDebug ,sourcePath — e.g. free/debug
            def sourceName, sourcePath
            if (!productFlavorName) {
                sourceName = sourcePath = "${buildTypeName}"
            } else {
                sourceName = "${productFlavorName}${buildTypeName.capitalize()}"
                sourcePath = "${productFlavorName}/${buildTypeName}"
            }
                // testTaskName —  e.g. testFreeDebugtest task that the coverage task depends on,
            def testTaskName = "test${sourceName.capitalize()}UnitTest"
            // Create coverage task of form 'testFlavorTypeCoverage' depending on 'testFlavorTypeUnitTest'
            task "${testTaskName}Coverage" (type:JacocoReport, dependsOn: "$testTaskName") {
                group = "Reporting"
                description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build."
                classDirectories = fileTree(
                        dir: "${project.buildDir}/intermediates/classes/${sourcePath}",
                        excludes: [
                                '**/R.class',
                                '**/R$*.class',
                                '**/*$ViewInjector*.*',
                                '**/*$ViewBinder*.*',
                                '**/BuildConfig.*',
                                '**/Manifest*.*'
                        ]
                )
                def coverageSourceDirs = [
                        "src/main/java",
                        "src/$productFlavorName/java",
                        "src/$buildTypeName/java"
                ]
                additionalSourceDirs = files(coverageSourceDirs)
                sourceDirectories = files(coverageSourceDirs)
                executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")
                reports {
                    //enables and disable the type of file you need
                    xml.enabled = false
                    html.enabled = true
                }
            }
        }
    }
}
  • Etape 3: Exécutez les commandes ci-dessous dans le terminal android studio pour construire l'application

    ./gradlew propre assembler

  • Étape 4: sur build sucessfull , exécutez la commande ci-dessous pour générer le rapport de test (changez la chaîne "testFreeDebugUnitTestCoverage" à votre propre flavor / build type, par exemple pour la commande de version payante sera ./ gradlew testpaidddebugunittestcoverage)

    ./ gradlew testFreeDebugUnitTestCoverage

  • Étape 5:

il devrait donner le message de succès dans le terminal, maintenant allez dans le répertoire

>app > build > reports >jacoco >${testName} >look for html or xml file report file
  • Étape 6: vous pouvez maintenant ouvrir et visualiser le fichier html test coverage dans le navigateur

bonne Chance !!!

0
répondu Pravin Madavi 2017-01-06 18:50:28