首页 文章

Android Studio 3 / Kotlin代码覆盖率

提问于
浏览
9

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

include (android-app/kotlin-android)':application', (pure kotlin)':presentation', (pure kotlin)':domain', (android-library/kotin-android)':dataproviders'

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

tested class in ui.viewmodel package:

tested lines for kotlin-android module

但是,对于 pure 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

    解决方案是在build.gradle for module中添加此gradle任务:

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

    并运行:

    gradlew copyTestClasses
    

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

  • 8

    虽然@Hype的解决方案有效,但是当你最终使用kotlin类文件和META-INF与java中的类文件放在同一目录中时,它也会混淆环境 . 这可能会让您在第二次运行编译时遇到一些问题 .

    另一个解决方案是将kotlin类的路径添加到jacoco配置参数 classDirectories . 这个解决方案只是告诉jacoco它需要评估来自两个不同文件树的文件 . 好处是它不会改变你的环境 . 下面是一个如何组合来自多个目录的类文件的示例,不包括任何不需要的文件(这取决于您的项目设置,您可能使用匕首并且必须排除匕首生成的文件):

    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设置它 .

相关问题