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