web-dev-qa-db-fra.com

Rapport Jacoco de la tâche de gradle Générez un fichier de rapport HTML vide (aucun fichier de classe spécifié)

J'aimerais utiliser Jacoco pour générer un rapport de couverture de code sur tous mes tests (AndroidTest + Unitest).

J'ai donc mis en œuvre un script étape par étape (jacoco.gradle) pour créer une tâche qui m'a permis de générer un rapport qui a fusionné deux rapports de couverture de code.

Mon problème est que le fichier généré HTML est vide (en app\build\jacocoReport\index.html):

Aucun fichier de classe spécifié. Jacoco 0.8.3.201901230119

J'exécute la tâche "TestIntegrationDebUnittest":

  • AndroidTest Code Coverage Report a été créé sur App/Build/Rapports/Couverture/Intégration/Débogage/Index.html et il est d'accord.

  • Un fichier 'EC' a été généré sur l'application\build\sorties\code_coverage\integrationdebugandroidtest\Connected\pixel_2_api_24 (AVD) - 7.0- Coverage.ec

  • Un fichier 'Exec' a été généré sur App/Build/Jacoco/TesinteGrationDebugUnittest.exec

Avez-vous une idée d'où vient mon problème? Voici mon code:

jacoco.gradle:

apply plugin: 'jacoco'

jacoco {
    toolVersion = "$jacocoVersion"
    reportsDir = file("$buildDir/jacocoReport")
}

project.afterEvaluate {

    Android.applicationVariants.all { variant ->
        def variantName = variant.name
        def testTaskName = "test${variantName.capitalize()}UnitTest"
        def androidTestCoverageTaskName = "create${variantName.capitalize()}CoverageReport"

        tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: ["$testTaskName", "$androidTestCoverageTaskName"]) {
            group = "Reporting"
            description = "Generate Jacoco coverage reports for the ${variantName.capitalize()} build."

            reports {
                xml.enabled = false
                html.enabled = true
                html.destination "$buildDir/jacocoReport"
            }

            def excludes = ['**/R*.class',
                            '**/*$InjectAdapter.class',
                            '**/*$ModuleAdapter.class',
                            '**/*$ViewInjector*.class'
            ]

            def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug", excludes: excludes)
            def mainSrc = "$project.projectDir/src/main/Java"

            sourceDirectories = files([mainSrc])
            classDirectories = files([debugTree])
            executionData = fileTree(dir: project.buildDir, includes: [
                    "jacoco/${testTaskName}.exec", "outputs/code_coverage/${variantName}AndroidTest/connected/**/*.ec"
            ])
        }
    }
}

Projet de gradle:

buildscript {
    ext.kotlin_version = '1.3.21'
    ext.jacocoVersion = '0.8.3'

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:3.3.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'io.realm:realm-gradle-plugin:5.8.0'
        classpath 'com.google.gms:google-services:4.2.0'
        classpath 'io.fabric.tools:gradle:1.28.0'
        classpath "org.jacoco:org.jacoco.core:$jacocoVersion"
    }
}

task installGradle(type: Wrapper) {
    group = "*********"
    gradleVersion = '4.10.1'
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

app gradle:

apply plugin: 'com.Android.application'
apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-Android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-Android'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'
apply from: '../scripts/jacoco.gradle'

Android.applicationVariants.all { variant ->
    if (variant.name == 'demoDebug' || variant.name == 'evalDebug' || variant.name == 'stagingDebug') {
        project.tasks.getByName('process' + variant.name.capitalize() + 'GoogleServices').enabled = false
        project.tasks.getByName('fabricGenerateResources' + variant.name.capitalize()).enabled = false
    }
}

Android {

    compileSdkVersion 28
    defaultConfig {
        applicationId "***********"
        minSdkVersion 23
        targetSdkVersion 28
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {
        debug {
            testCoverageEnabled true
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation 'com.Android.support:appcompat-v7:28.0.0'
    implementation 'com.Android.support:support-v4:28.0.0'
    implementation 'com.Android.support:recyclerview-v7:28.0.0'
    implementation 'com.Android.support:design:28.0.0'
    implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
    implementation 'Android.Arch.lifecycle:extensions:1.1.1'
    implementation 'com.google.firebase:firebase-core:16.0.8'
    implementation 'com.crashlytics.sdk.Android:crashlytics:2.9.9'

    testImplementation 'junit:junit:4.12'
    testImplementation 'org.mockito:mockito-core:2.25.1'
    testImplementation 'Android.Arch.core:core-testing:1.1.1'

    androidTestImplementation 'com.Android.support.test:runner:1.0.2'
    androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.2'
    androidTestImplementation 'org.mockito:mockito-Android:2.25.1'
    androidTestImplementation 'Android.Arch.core:core-testing:1.1.1'
}
11
Dev Loots

Configurez-vous le plugin Jacoco avec Maven, si vous voulez vérifier le chemin de la configuration.it doit être un chemin de classe du répertoire cible/classes, et non au chemin de l'emballage.

0
guanziao