Android CodeCov/Jacoco 图书馆模块

Android CodeCov/Jacoco for Library Module

我正在尝试按照此处所述实施 CodeCov/Jacoco:

https://about.codecov.io/blog/code-coverage-for-android-development-using-kotlin-jacoco-github-actions-and-codecov/

本指南非常适用于主应用模块,在应用级别 build.gradle 中用 'com.android.application 指定。

但是,我有一个名为 video_library 的第二个库模块,它被指定为在其 build.gradle 上带有 'com.android.library' 的库。

每当我尝试 运行 video_library 模块的 Jacoco 任务时,任务 运行 但它无法 运行 我编写的任何单元测试,好像找不到任何测试(虽然这个模块有 50 多个)

项目结构如下:

├── app
│   ├── build
│   └── src
├── build
│   └── kotlin
├── gradle
│   └── wrapper
└── library_video
    ├── build
    ├── sampledata
    └── src

我已经以与应用程序模块相同的方式实现了 jacocoTestReport:

plugins {
        id 'com.android.library'
        id 'kotlin-android'
        id 'kotlin-kapt'
        id 'org.jetbrains.dokka'
        id 'maven-publish'
        id 'jacoco'
    }
    
    task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {
    
        reports {
            xml.enabled = true
            html.enabled = true
        }
    
        def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
        def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
        def mainSrc = "${project.projectDir}/src/main/java"
    
        sourceDirectories.setFrom(files([mainSrc]))
        classDirectories.setFrom(files([debugTree]))
        executionData.setFrom(fileTree(dir: "$buildDir", includes: [
                "jacoco/testDebugUnitTest.exec",
                "outputs/code-coverage/connected/*coverage.ec"
        ]))
    }

我是否需要对 library_video 模块实现进行调整才能找到测试?

您需要在 :app 模块中手动包含 classDirectories library_video 类。这至少是帮助我实现多模块代码覆盖的原因。

:app 模块中(我使用 Gradle KTS,因此在 Kotlin 中):

val library_video_dir = fileTree(mapOf("dir" to "${buildDir}/../../library_video/build/classes/kotlin/main", "excludes" to fileFilter))

classDirectories.setFrom(files(listOf(debugTree, library_video_dir)))

尝试使用 dir 路径进行试验,因为它与 Java

不同