当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么JaCoCo会看到我的JUnit而忽略我的Spock测试?》经验,为你挑选了1个好方法。

我有一个项目,使用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'
}

Godin.. 5

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

由于生成的报告包含覆盖率,我猜测你有一些其他应该导入覆盖率数据的工具存在问题.既然你提到了"GitHub shield",我猜这个问题可能与https://codecov.io有关 - 你在Travis的构建中说:

未找到覆盖率报告.

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

此机制允许在类加载期间内存预处理所有类文件,而与应用程序框架无关.

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



1> Godin..:

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

由于生成的报告包含覆盖率,我猜测你有一些其他应该导入覆盖率数据的工具存在问题.既然你提到了"GitHub shield",我猜这个问题可能与https://codecov.io有关 - 你在Travis的构建中说:

未找到覆盖率报告.

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

此机制允许在类加载期间内存预处理所有类文件,而与应用程序框架无关.

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


@RossDrew你刚认识了一个JaCoCo开发人员;)我们很乐意提供帮助,特别是当提供易于使用的复制器时;)很酷,你的问题解决了!
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有