为什么JaCoCo会看到我的JUnit而忽略我的Spock测试?

时间:2017-01-14 17:38:45

标签: java gradle junit spock jacoco

我有一个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'
}

1 个答案:

答案 0 :(得分:5)

如果我从您的项目中删除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 - 你的build in Travis states

  

未找到覆盖率报告。

     

请访问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实现的目标:

  

此机制允许在类加载期间对所有类文件进行内存预处理,独立于应用程序框架

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