Gradle Jacoco插件未生成报告

时间:2018-07-10 14:09:09

标签: java gradle jacoco

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/目录下生成HTML版本的Jacoco报告;和
  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报告,这对于修复它完全没有帮助。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

如果将插件与Java插件一起应用,则会创建上述每种类型的任务,即jacocoTestReportjacocoTestCoverageVerification。如您所见,这两个名称均与test任务相关联。

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

  

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

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

jacocoTestCoverageVerification.dependsOn jacocoTestReport

答案 1 :(得分: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