JaCoCo renvoie 0% de couverture avec Kotlin et Android 3.0

j'essaie de vérifier ma couverture de code pour un cas test que j'ai écrit dans Kotlin. Quand j'execute ./gradlew createDebugCoverageReport --info, ma couverture.le fichier ec est vide et mes rapports indiquent que j'ai une couverture de 0%. Veuillez noter que les cas de test sont 100% réussis. Est-ce que quelqu'un peut penser aux raisons de ma couverture?le fichier ec renvoie 0 bytes?

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"
    ])
}
30
demandé sur nhaarman 2017-08-02 17:49:59

2 réponses

vous pouvez obtenir une couverture ligne par ligne pour le code Java et Kotlin en définissant les deux répertoires différents pour generated .les fichiers de classe:

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

alors, incluez simplement les deux fichiers dans vos répertoires de classe:

classDirectories = files([debugTree], [kotlinDebugTree])
22
répondu farmerbb 2017-09-06 19:36:44

Après quelques jours, j'ai trouvé une solution à ce problème. Pour ceux d'entre vous rencontre des problèmes similaires: Dans votre dossier intermediates, il doit y avoir un dossier tmp. Ce dossier contient les .les fichiers de classe pour la Kotlin fichiers. Si vous changez le chemin de fileTree(dir: "${buildDir}/intermediates/classes/debug", exclut: fileFilter) vers l'emplacement de ces fichiers de classe, Jacoco générera une couverture de code pour vous! Veuillez noter que vous ne pourrez pas voir un aperçu complet, ligne par ligne. de votre protection en utilisant cette méthode.

0
répondu Floam 2017-09-01 19:24:21