为什么 JaCoCo 看到了我的 JUnit 但忽略了我的 Spock 测试?

Why does JaCoCo see my JUnit but ignore my Spock tests?

我有一个 project,它使用 JUnit 形成简单的单元测试 (test/java),并使用 Spock 执行更复杂的数据驱动单元测试 (test/groovy)。我用 Gradle.

构建了所有这些

我的问题是生成 JaCoCo 报告导致代码覆盖率非常低,因为它似乎只考虑了 JUnit 测试。我可以 运行 这些测试在 IntelliJ 中都很好,Pitest 并且通过 Gradle 也可以找到所有测试并报告正确的线路覆盖率。

(我需要 JaCoCo 来设置我的 GitHub 防护罩)

如何让 JaCoCo 使用这两种测试框架报告线路覆盖率?

build.gradle

group 'com.rox'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'jacoco'
apply plugin: 'info.solidsoft.pitest'
apply plugin: 'application'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.3.11'
    compile group: 'junit', name: 'junit', version: '4.11'
    compile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
    compile group: 'org.spockframework', name: 'spock-core', version: '1.1-groovy-2.4-rc-1'
}

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "info.solidsoft.gradle.pitest:gradle-pitest-plugin:1.1.4"
    }
}

task runDebugUI(type: JavaExec, group: 'run') {
    classpath sourceSets.main.runtimeClasspath
    main = mainClassName = 'com.rox.emu.P6502.dbg.UI'
}

如果我从您的项目中删除 src/test/java 并使用 ./gradlew clean build jacocoTestReport 生成 JaCoCo 报告,那么 build/reports/jacoco/test/html/index.html 中的报告会显示一些覆盖率。由于只剩下 src/test/groovy - 我的结论是实际上考虑了 Spock 测试。唯一未涵盖的软件包是 com.rox.emu.P6502.dbg.ui,但您似乎没有对其进行任何测试。

由于生成的报告包含覆盖率,我猜您在使用其他一些应该导入覆盖率数据的工具时遇到了问题。既然你提到了 "GitHub shield",我猜这个问题可能出在 https://codecov.io - your build in Travis states:

No coverage report found.

Please visit http://docs.codecov.io/docs/supported-languages

根据 https://github.com/codecov/example-gradle/blob/master/README.md#add-jacoco-plugin :将 JaCoCo 集成到 Codecov 中需要生成 JaCoCo XML 报告。所以添加

jacocoTestReport {
    reports {
        xml.enabled true
    }
}

进入build.gradle并且不要忘记执行gradlew jacocoTestReport.

注意:JaCoCo 本身独立于测试框架。要获得覆盖率,您的测试应该只执行 JaCoCo 检测的 类,这是通过使用 JaCoCo Java agent:

实现的

This mechanism allows in-memory pre-processing of all class files during class loading independent of the application framework.

而 JaCoCo Gradle 插件只是增强了 Gradle 任务,因此他们将使用此代理。