web-dev-qa-db-fra.com

JaCoCo retourne une couverture de 0% 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 coverage.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. Quelqu'un peut-il penser à des raisons pour lesquelles mon fichier coverage.ec continue de renvoyer 0 octet?

J'ai cherché partout sans chance.

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"
    ])
}
35
Floam

Vous pouvez obtenir une couverture ligne par ligne pour les deux Java et code Kotlin en définissant les deux répertoires différents pour les 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 vos classDirectories:

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

Après quelques jours, j'ai trouvé une solution à ce problème. Pour ceux d'entre vous rencontrant des problèmes similaires: Dans votre dossier intermédiaires, il devrait y avoir un dossier tmp. Ce dossier contient les fichiers .class des fichiers Kotlin. Si vous changez le chemin de fileTree (dir: "$ {buildDir}/intermediates/classes/debug", exclut: fileFilter) vers où se trouvent 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 couverture en utilisant cette méthode.

0
Floam