【问题标题】:Gradle Jacoco plugin not generating reportsGradle Jacoco 插件不生成报告
【发布时间】:2018-12-18 10:17:35
【问题描述】:

Java 8 和 Gradle 4.6 在这里。我正在尝试将我的 Gradle 构建配置为使用 Jacoco Plugin,但遇到了一些困难。我已经让它与 Checkstyle 和 Findbugs 一起使用,这样运行 ./gradlew clean build 会调用 Checkstyle 和 Findbugs 任务,因为它们是 check 任务的依赖项。

我现在正试图让 Jacoco 工作:

  1. 它不包括我的com.me.myapp.domain.model 包及其所有内容;和
  2. 如果非排除类的代码覆盖率低于 70%,我的构建将失败;和
  3. 通过或失败,我想要build/目录下生成的Jacoco报告的HTML版本;和
  4. 理想情况下我可以使用 ./gradlew clean build 的相同 Gradle 命令调用来让 Jacoco 像这样工作

迄今为止我最好的尝试:

plugins {
    id 'java-library'
    id 'checkstyle'
    id 'findbugs'
    id 'jacoco'
}

dependencies {
    compile(
        'org.hibernate:hibernate-core:5.0.12.Final'
        ,'com.fasterxml.jackson.core:jackson-core:2.8.10'
        ,'com.fasterxml.jackson.core:jackson-databind:2.8.10'
        ,'com.fasterxml.jackson.core:jackson-annotations:2.8.0'
    )

    testCompile(
        'junit:junit:4.12'
    )
}

repositories {
    jcenter()
    mavenCentral()
}

checkstyle {
    config = rootProject.resources.text.fromFile('buildConfig/checkstyle/checkstyle.xml')
    toolVersion = '8.11'
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled false
        html.enabled true
    }
}

findbugs {
    excludeFilter = file('buildConfig/findbugs/findbugs-exclude.xml')
}

jacocoTestReport {
    reports {
        xml.enabled false
        csv.enabled false
        html.enabled true
    }

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it,
                exclude: [
                    'com/me/myapp/domain/model/**'
                ]
            )
        })
    }
}

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

            failOnViolation true
        }
    }
}

jacoco {
    toolVersion = "0.8.1"
}

// to run coverage verification during the build (and fail when appropriate)
check.dependsOn jacocoTestCoverageVerification

当我运行./gradlew clean build 和上面的build.gradle (^^^) 如果我的覆盖率低于 70%,Jacoco 确实 会失败。 但是它不会为我生成任何 HTML 报告,这对于修复它根本没有帮助。

有什么想法吗?

【问题讨论】:

  • 启用后是否会生成 CSV 或 XML 报告?
  • 感谢@mascha (+1) 但,当我启用 XML/CSV 报告时,./gradlew clean build 也不会生成它们。

标签: java gradle jacoco


【解决方案1】:

请注意,Gradle Jacoco 插件确实提供了两个完全不相关的功能:

如果插件与 Java Plugin 一起应用,则会创建上述每种类型的任务,即jacocoTestReportjacocoTestCoverageVerification。正如您所看到的,它们都与test 任务相关联。

但是,这些任务都不会自动包含在常规 Gradle build 生命周期中。不包括报告任务的原因仅仅是因为它对于实际构建实际软件不是必需的。出于同样的原因,javadoc 任务不包含在build 生命周期中(可能是在创建 javadoc jar 时)。不包括验证任务的原因比较棘手,但让我们简单地引用文档:

JacocoCoverageVerification 任务不是 Java 插件提供的 check 任务的任务依赖项。这是有充分理由的。该任务当前不是增量的,因为它没有声明任何输出。执行检查任务时,任何违反声明规则的行为都会自动导致构建失败。并非所有用户都希望这种行为。 Gradle 的未来版本可能会改变这种行为。

您已经通过将check.dependsOn jacocoTestCoverageVerification 添加到您的构建文件中解决了这个问题。这样,每次构建都会检查代码覆盖率(如果不够,则会失败)。现在您想在所有构建中生成报告,即使它由于代码覆盖率不足而失败。您需要确保在构建可能失败之前生成报告。你可以使用:

jacocoTestCoverageVerification.dependsOn jacocoTestReport

【讨论】:

    【解决方案2】:

    来自文档https://docs.gradle.org/current/userguide/jacoco_plugin.html 默认情况下启用 HTML 报告。所以没有必要在配置中放入html.enabled。此外,文档还显示了如何指定目标文件夹。您可以尝试将其设置为某个已知文件夹以检查它是否可以正常工作,例如html.destination file("${buildDir}/jacocoHtml")。 HTML 报告应该结束的默认报告目录是$buildDir/reports/jacoco/test 将 Jacoco 报告目录设置为某个显式值也有助于识别任何配置问题 reportsDir

    【讨论】:

    • 谢谢@mascha (+1) - 但是将html.destination file("${buildDir}/jacocoHtml") 添加到我的reports 闭包中也没有任何作用。 很有趣当我通过 ./gradlew clean build jacocoTestReport 调用 Gradle 时,如果我有足够的测试覆盖率,那么就会生成报告!只有当我运行./gradlew clean build jacocoTestReport AND 覆盖率未达到我的 70% 阈值时,构建才会失败并且在build/reports 下不会生成任何报告!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2021-01-29
    • 2019-09-07
    • 2018-09-09
    • 2022-06-13
    • 2022-06-15
    • 2014-05-15
    相关资源
    最近更新 更多