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