android kotlin code-coverage jacoco

JaCoCo devuelve una cobertura del 0% con Kotlin y Android 3.0



code-coverage (2)

Después de unos días, descubrí una solución a este problema. Para aquellos de ustedes que experimenten problemas similares: en su carpeta de intermedios debería haber una carpeta tmp. Esta carpeta contiene los archivos .class para los archivos Kotlin. Si cambia la ruta de fileTree (dir: "$ {buildDir} / intermedios / classes / debug", excluye: fileFilter) a la ubicación de esos archivos de clase, Jacoco generará la cobertura de código para usted. Tenga en cuenta que no podrá ver un resumen completo, línea por línea, de su cobertura con este método.

Estoy tratando de verificar la cobertura de mi código para un caso de prueba que escribí en Kotlin. Cuando ejecuto ./gradlew createDebugCoverageReport --info , mi archivo de cobertura está vacío y mis informes indican que tengo una cobertura del 0%. Tenga en cuenta que los casos de prueba son 100% exitosos. ¿Alguien puede pensar en alguna razón por la que mi archivo de cobertura.ec siga devolviendo 0 bytes?

He buscado por todas partes sin suerte.

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


Puede obtener cobertura línea por línea para los códigos Java y Kotlin definiendo los dos directorios diferentes para los archivos .class generados:

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

Luego, simplemente incluya ambos fileTrees en su classDirectories:

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