在一个Android项目中,Jacoco通过单元测试报告了0个Kotlin类的报道

时间:2017-11-26 18:06:56

标签: android gradle junit kotlin jacoco

我正在使用Android Gradle Plugin 3.0.0。

我正在将Android应用程序从java迁移到kotlin。我的应用程序包含Java和Kotlin的类,测试使用Java。

我运行$.views.converters.getName.depends

这会运行单元测试(./gradlew clean jacocoTestReport)和检测测试(src/test)。

jacoco在src/androidTest中制作的报告没有显示Kotlin类的报道,这些报道确实涵盖了单元测试。

报告确实从仪器测试中正确显示了覆盖范围。

注意:我遇到了其他问题,这些问题并不完全相同:

我的app模块build.gradle的相关部分:

app/build/reports/jacoco/jacocoTestReport/html/index.html

1 个答案:

答案 0 :(得分:3)

我必须将apply plugin: 'jacoco' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' ... android { defaultConfig { sourceSets { main.java.srcDirs += "$projectDir/src/main/kotlin" } } testOptions { unitTests { all { jvmArgs '-noverify', '-ea' } includeAndroidResources = true } } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" .... } jacoco { toolVersion '0.7.9' } task jacocoTestReport(type: JacocoReport, dependsOn: ["testDebugUnitTest", "createDebugCoverageReport"]) { reports { html.enabled = true } classDirectories = fileTree( dir: "${buildDir}", includes: ["tmp/kotlin-classes/debug/ca/rmen/android/poetassistant/**/*.class", "intermediates/classes/debug/ca/rmen/android/poetassistant/**/*.class"], excludes: ["**/R.class", "**/R*.class", "**/Manifest.class", "**/Manifest*.class", "**/BuildConfig.class", // ignore databinding generated code: "**/ca/rmen/android/poetassistant/databinding/*.class", ... other excludes ... "**/ca/rmen/android/poetassistant/BR.class", "**/com/android/**/*.class"]) sourceDirectories = files("${project.projectDir}/src/main/java", "${project.projectDir}/src/main/kotlin") executionData = fileTree( dir: "${buildDir}", includes: [ "jacoco/testDebugUnitTest.exec", "outputs/code-coverage/connected/*coverage.ec" ]) } 添加到我的gradle文件中,如下所示,以使jacoco报告通过单元测试反映Kotlin类的覆盖范围:

includeNoLocationClasses = true

注意:此解决方案适用于从命令行运行测试,但在Android Studio内部使用coverage运行时仍然可以获得0%的覆盖率。