Android Studio 3 / Kotlin代码覆盖率

时间:2017-07-27 12:15:30

标签: android unit-testing junit kotlin code-coverage

我的Android应用程序是多模块项目:

&

我正在使用Junit / Mockito进行测试,我遇到了为kotlin安卓模块生成代码覆盖率的问题code coverage report 测试线对于android studio是可见的。

ui.viewmodel包中的测试类:

tested lines for kotlin-android module

但是,对于纯kotlin (例如域名,演示文稿),测试覆盖率正常: code coverage report pure kotlin module

我正在使用Android Studio 3.0 Canary 8 您可以在github上查看我的build.gradle文件:

build.gradle

dependencies.gradle

application.build.gradle

presentation.build.gradle

android应用程序模块中的示例测试:

MostPopularViewModelTest

纯kotlin模块中的示例测试:

MostPopularPresenterTest

有人可以帮我解决问题吗?我试过通过Jacoco生成代码覆盖,但它也没有显示代码覆盖率。

2 个答案:

答案 0 :(得分:8)

解决方案是在build.gradle中为模块添加此gradle任务:

task copyTestClasses(type: Copy) {
    from "build/tmp/kotlin-classes/debugUnitTest"
    into "build/intermediates/classes/debug"
}

并运行:

gradlew copyTestClasses

然后生成代码覆盖率报告没有问题。

答案 1 :(得分:0)

尽管@Hype的解决方案有效,但是当您最终将kotlin类文件和META-INF与java中的类文件放在同一目录中时,也会使环境有些混乱。这可能会给您第二次运行编译时带来的一些问题。

另一种解决方案是仅将kotlin类的路径添加到jacoco配置参数classDirectories中。 该解决方案仅告诉jacoco它需要评估来自两个不同文件树的文件。好处是它不会改变您的环境。 以下是如何组合多个目录中的类文件(不包括任何不需要的文件)的示例(这取决于您的项目设置,您可能使用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。