3

在我的 gradle 构建中,我有 2 个这样的测试任务:

task testAAA(type: Test) {
    filter {

        includeTestsMatching "*AAA*"
    }

    finalizedBy jacocoTestReport
}

task testBBB(type: Test) {
    filter {

        includeTestsMatching "*BBB*"
    }

    finalizedBy jacocoTestReport
}

这会在 build/jacoco 中生成 2 个 .exec 文件:

  • 测试AAA.exec

  • testBBB.exec

我想生成一个单一的覆盖率报告,该报告从两个/所有 .exec 文件中获取输入,我试过这个:

jacocoTestReport {
    executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")

    reports {
        xml.enabled true
    }

}

当我尝试出现此错误时:

Execution failed for task ':Project1:jacocoTestReport'.
> Unable to read execution data file Project1/build/jacoco/test.exec

Project1/build/jacoco/test.exec (No such file or directory)

当我明确提供 executionData 规范时,为什么 jacocoTestReport 会寻找“test.exec”?

4

3 回答 3

8

我为此苦苦挣扎了一段时间,甚至取得了成功。直到我昨天回来。花了几个小时搜索并在 GH 上找到了这个。

jacocoTestReport {
  getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec")) 
}

从 Gradle 6.0 开始,这是要走的路。已经针对具有 2 组测试的 repo 对其进行了测试,我可以单独运行或同时运行两者,并且 Jacoco 不会崩溃。

Jacoco JavaDocs
GH 问题与解决方案

于 2021-01-15T16:00:26.593 回答
7

我建议传入测试任务而不是文件树。这将允许插件确保查找正确的文件解决一些可能发生的执行顺序问题,例如确保此报告任务在测试任务本身之后运行。

所以像:

jacocoTestReport {
    executionData tasks.withType(Test)

    reports {
        xml.enabled true
    }
}
于 2020-04-09T16:31:38.040 回答
1

预定义的 JacocoReport 任务名称为jacocoTestReport默认设置一个执行数据文件,其名称为“test.exec”。

因此,您可以尝试以下代码:

task testAAAReport(type: JacocoReport) {
    sourceSets sourceSets.main

    executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")

    reports {
        xml.enabled true
    }

}

源代码

于 2021-09-16T15:03:33.697 回答