Gradle Jacoco插件未生成报告

hot*_*oup 1 java gradle jacoco

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

我现在正在尝试让Jacoco进行以下工作:

  1. 它不包括我的com.me.myapp.domain.model包裹及其所有内容;和
  2. 如果未排除类的代码覆盖率低于70%,则构建失败。和
  3. 通过或失败,我想在该build/目录下生成HTML版本的Jacoco报告;和
  4. 理想情况下,我可以使用相同的Gradle命令调用./gradlew clean build来使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
Run Code Online (Sandbox Code Playgroud)

当我./gradlew clean build使用build.gradle上面的以下内容(^^^)运行时,如果我的覆盖率小于70%,Jacoco 的确会失败。但是,它不会为我生成任何HTML报告,这在修复它方面根本没有帮助。

有任何想法吗?

Luk*_*fer 5

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

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

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

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

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

jacocoTestCoverageVerification.dependsOn jacocoTestReport
Run Code Online (Sandbox Code Playgroud)