Android Studio 3/Kotlin 代码覆盖率
Android Studio 3/Kotlin code coverage
我的 android 应用是多模块项目:
include (android-app/kotlin-android)':application', (pure kotlin)':presentation', (pure kotlin)':domain', (android-library/kotin-android)':dataproviders'
我正在使用 Junit/Mockito 进行测试,但我在为 kotlin android 模块 仅 生成代码覆盖时遇到了问题。
android 工作室可以看到测试线。
在 ui.viewmodel 包中测试 class:
但是,对于 pure kotlin(例如域、演示),测试覆盖率工作正常:
我正在使用 Android Studio 3.0 Canary 8
您可以在 github:
查看我的 build.gradle 文件
android 应用程序模块中的示例测试:
纯kotlin模块中的示例测试:
有人可以帮我解决我的问题吗?我尝试通过 Jacoco 生成代码覆盖率,但它也没有显示代码覆盖率。
解决方案是在 build.gradle 模块中添加此 gradle 任务:
task copyTestClasses(type: Copy) {
from "build/tmp/kotlin-classes/debugUnitTest"
into "build/intermediates/classes/debug"
}
和运行:
gradlew copyTestClasses
然后生成代码覆盖率报告没有问题。
虽然@Hype 的解决方案有效,但它也会让环境变得有点混乱,因为您最终会在与来自 java。这可能会给您带来一些问题 运行 第二次编译。
另一种解决方案是将 kotlin classes 的路径添加到 jacoco 配置参数 classDirectories
。
该解决方案将简单地告诉 jacoco 它需要评估来自两个不同文件树的文件。好处是它不会改变您的环境。
这是一个示例,说明如何合并来自多个目录的 class 文件,排除任何不需要的文件(这取决于您的项目设置,您可能使用 dagger 并且必须排除 dagger 生成的文件):
def javaAndKotlinClassFiles = files(fileTree(dir: "${project.buildDir}/intermediates/classes/${sourcePath}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
'**/*_Provide*Factory*.*',
'**/*$*$*.*', // Anonymous classes generated by kotlin
'**/*Test*.*', // Test files
'**/*Spec*.*' // Test files
]
).files)
.from(files(fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${sourcePath}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
'**/*_Provide*Factory*.*',
'**/*$*$*.*', // Anonymous classes generated by kotlin
'**/*Test*.*', // Test files
'**/*Spec*.*' // Test files
]).files)
)
classDirectories = javaAndKotlinClassFiles
这里有 nice guide 如何设置 Java。
我的 android 应用是多模块项目:
include (android-app/kotlin-android)':application', (pure kotlin)':presentation', (pure kotlin)':domain', (android-library/kotin-android)':dataproviders'
我正在使用 Junit/Mockito 进行测试,但我在为 kotlin android 模块 仅 生成代码覆盖时遇到了问题。
在 ui.viewmodel 包中测试 class:
但是,对于 pure kotlin(例如域、演示),测试覆盖率工作正常:
我正在使用 Android Studio 3.0 Canary 8 您可以在 github:
查看我的 build.gradle 文件android 应用程序模块中的示例测试:
纯kotlin模块中的示例测试:
有人可以帮我解决我的问题吗?我尝试通过 Jacoco 生成代码覆盖率,但它也没有显示代码覆盖率。
解决方案是在 build.gradle 模块中添加此 gradle 任务:
task copyTestClasses(type: Copy) {
from "build/tmp/kotlin-classes/debugUnitTest"
into "build/intermediates/classes/debug"
}
和运行:
gradlew copyTestClasses
然后生成代码覆盖率报告没有问题。
虽然@Hype 的解决方案有效,但它也会让环境变得有点混乱,因为您最终会在与来自 java。这可能会给您带来一些问题 运行 第二次编译。
另一种解决方案是将 kotlin classes 的路径添加到 jacoco 配置参数 classDirectories
。
该解决方案将简单地告诉 jacoco 它需要评估来自两个不同文件树的文件。好处是它不会改变您的环境。
这是一个示例,说明如何合并来自多个目录的 class 文件,排除任何不需要的文件(这取决于您的项目设置,您可能使用 dagger 并且必须排除 dagger 生成的文件):
def javaAndKotlinClassFiles = files(fileTree(dir: "${project.buildDir}/intermediates/classes/${sourcePath}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
'**/*_Provide*Factory*.*',
'**/*$*$*.*', // Anonymous classes generated by kotlin
'**/*Test*.*', // Test files
'**/*Spec*.*' // Test files
]
).files)
.from(files(fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${sourcePath}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
'**/*_Provide*Factory*.*',
'**/*$*$*.*', // Anonymous classes generated by kotlin
'**/*Test*.*', // Test files
'**/*Spec*.*' // Test files
]).files)
)
classDirectories = javaAndKotlinClassFiles
这里有 nice guide 如何设置 Java。