为什么 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 任务,因此他们将使用此代理。
我有一个 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 任务,因此他们将使用此代理。