1

情况 我正在开发一个运行良好的 Spring Boot 应用程序,但是构建-测试周期需要很长时间,在普通的开发环境中不实用。

所以,我最近决定将我的单元测试和集成测试分开。集成测试基于 Cucumber,而单元测试是纯 JUnit 5 测试。

为此,我使用了 Gradle 插件org.unbroken-dome.test-sets,它很好地创建了相关的 sourceSets 等。

testSets {
    intTest { dirName = 'int-test' }
}

一切运行良好,我的测试按预期执行。当我进行构建时仍会执行单元测试,而当我调用“gradlew intTest”时会执行集成测试。这是设计使然,因为我不想一直执行所有测试。

运行测试后,我还有一个jacoco/test.exec文件和一个jacoco/inttest.exec文件。所有这些都是设计和测试集插件所宣传的。

问题 这是我的问题。当我的所有测试仍在 test-SourceSet 中时,因此在拆分之前并且仅test.exec生成文件时,JaCoCo 报告的覆盖率约为 75%。但是现在我已经拆分了测试并拥有了test.exec文件intTest.exec,JaCoCo 只报告了 15% 的覆盖率,考虑到我的单元测试和集成测试的范围,这几乎是正确的。

问题 我怎样才能让 JaCoCo 同时使用test.execintTest.exec文件来报告覆盖率并允许覆盖率验证任务再次考虑两者?

相关代码 这里是一些相关代码:jacoco.gradle

apply plugin: 'java'
apply plugin: 'jacoco'

// -----------------------------------------------------------
//
// JaCoCo
dependencies {
    implementation "org.jacoco:org.jacoco.agent:${jacocoToolVersion}:runtime"
}

jacoco {
    toolVersion = "${jacocoToolVersion}"
}

jacocoTestReport {
    dependsOn test
    reports {
        xml.enabled false
        csv.enabled true
        html.destination file("${buildDir}/reports/jacoco/Html")
        csv.destination file("${buildDir}/reports/jacoco/jacoco.csv")
    }
}

jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = minCodeCoverage
            }
        }
    }
}

check.dependsOn jacocoTestCoverageVerification

来自 build.gradle 的片段:

tasks.withType(Test) {
    useJUnitPlatform()
    testLogging {
        events "passed", "skipped", "failed"
    }
    testLogging.showStandardStreams = true
    reports {
        junitXml.enabled = true
        html.enabled = true
    }
}

testSets {
    intTest { dirName = 'int-test' }
}

intTest.mustRunAfter test
check.dependsOn intTest

test {
    systemProperties System.getProperties()

    finalizedBy jacocoTestReport
}

提前感谢您帮助我或指出我正确的方向。

4

1 回答 1

0

好的,你知道一旦你提出了你的问题,你就知道谷歌什么了吗?好吧,经过更多的挖掘,我得到了一些灵​​感,这给了我一个 jacocoTestReport 定义:

jacocoTestReport {
    dependsOn test
    sourceSets sourceSets.main
    executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
    reports {
        xml.enabled false
        csv.enabled true
        html.destination file("${buildDir}/reports/jacoco/Html")
        csv.destination file("${buildDir}/reports/jacoco/jacoco.csv")
    }
}

我犯的错误是我在 jacocoTestCoverageVerification 部分而不是 jacocoReport 中聚合了 exec 文件。

因此,将 executionData 部分放在正确的位置,再次给了我正确的覆盖率值。呜呜!!!

于 2021-01-31T18:13:24.307 回答