簡體   English   中英

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 studio可以看到經過測試的行。

ui.viewmodel包中的測試類:

測試了kotlin-android模塊的行

但是,對於純kotlin (例如域,演示)測試覆蓋率工作正常: 代碼覆蓋率報告純kotlin模塊

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

的build.gradle

dependencies.gradle

application.build.gradle

presentation.build.gradle

android應用程序模塊中的示例測試:

MostPopularViewModelTest

純kotlin模塊中的示例測試:

MostPopularPresenterTest

有人可以幫我解決我的問題嗎? 我嘗試通過Jacoco生成代碼覆蓋,但它也沒有顯示代碼覆蓋率。

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

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

並運行:

gradlew copyTestClasses

然后生成代碼覆蓋率報告沒有問題。

雖然來自@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

這是一個很好的指南 ,介紹如何為Java設置它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM