我正在使用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
答案 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%的覆盖率。