39 votes

JaCoCo renvoie 0% de couverture avec Kotlin et Android 3.0

J'essaie de vérifier la couverture de mon code pour un cas de test que j'ai écrit dans Kotlin. Lorsque j'exécute ./gradlew createDebugCoverageReport --info , mon fichier couverture.ec est vide et mes rapports indiquent que j'ai une couverture de 0%. Veuillez noter que les tests sont réussis à 100%. Quelqu'un peut-il imaginer une quelconque raison pour laquelle mon fichier couverture.ec renvoie 0 octet en permanence?

J'ai cherché partout sans succès.

 apply plugin: 'com.android.library'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'jacoco'


android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

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


    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }

}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:25.4.0'
    testImplementation 'junit:junit:4.12'
    implementation files('pathtosomejarfile')

}



jacoco {
    toolVersion = "0.7.6.201602180812"
    reportsDir = file("$buildDir/customJacocoReportDir")

}



task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {

    reports {
        xml.enabled = true
        html.enabled = true
    }

    def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
    def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
    def mainSrc = "${project.projectDir}/src/androidTest/java"

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: "$buildDir", includes: [
            "jacoco/testDebugUnitTest.exec",
            "outputs/code-coverage/connected/*coverage.ec"
    ])
}
 

29voto

farmerbb Points 266

Vous pouvez obtenir une couverture ligne par ligne pour le code Java et le code Kotlin en définissant les deux répertoires différents des fichiers .class générés:

 def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
def kotlinDebugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug", excludes: fileFilter)
 

Ensuite, incluez simplement les deux fileTrees dans votre classDirectories:

 classDirectories = files([debugTree], [kotlinDebugTree])
 

0voto

Floam Points 429

Après quelques jours, j'ai trouvé une solution à ce problème. Pour ceux d'entre vous rencontre des problèmes similaires: Dans votre intermédiaires dossier il devrait y avoir un dossier tmp. Ce dossier contient les .les fichiers de classe pour la Kotlin fichiers. Si vous modifiez le chemin d'accès de fileTree(dir: "${buildDir}/intermédiaires/classes/debug", ce qui exclut: fileFilter) à l'endroit où les fichiers sont situés, Jacoco va générer de couverture de code pour vous! Veuillez noter que vous ne serez pas en mesure de voir un complet, ligne par ligne, vue d'ensemble de votre couverture à l'aide de cette méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X