build.gradle 使用 Jacoco 插件不会为集成测试生成覆盖率报告
build.gradle with Jacoco plugin doesn't generate coverage report for integration tests
我有一个 build.gradle 文件,它可以单独或一起成功 运行 单元和集成测试(使用 gradle test integrationTest一起)。两者都使用 Junit,我使用的是 Gradle 3,这不是 Android 项目。在单独的目录中为每个生成关于成功的报告。我还可以使用 gradle test jacoco 成功生成 unit 测试覆盖率的 Jacoco 报告。我无法通过使用 gradle integrationTest jacoco 获得我的其他工作集成测试的覆盖率报告,尽管测试成功 运行 和 integrationTest.exec 文件生成。
更明确地说,我在 build/reports/index.html 中获得单元测试覆盖率报告,在 build/reports/test/index.html 和 [=41] 中获得 Junit 报告=].html.创建了一个 build/reports/jacoco 目录,但只包含一个空的 "test" 目录。 build/ 还包含一个 jacoco/ 目录,其中包含 .exec 文件和类路径转储。
这是我的缩写build.gradle
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'jacoco'
repositories {
mavenCentral()
}
sourceSets {
main {
java {
srcDirs = ['src/java']
}
test {
java {
srcDirs = ['test/java']
}
}
resources {
srcDirs = ['src/java', 'conf', 'resource']
}
}
integrationTest {
java {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('integration_test/java')
}
}
}
test {
jacoco {
append = false
destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
classDumpFile = file("$buildDir/jacoco/classpathdumps")
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
/* SNIP */
task integrationTest(type: Test) {
dependsOn startserver
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
integrationTest.finalizedBy stopserver
check.dependsOn integrationTest
integrationTest.mustRunAfter test
tasks.withType(Test) {
reports.html.destination = file("${reporting.baseDir}/${name}")
}
jacoco {
toolVersion = "0.7.6.201602180812"
}
jacocoTestReport {
reports {
xml.enabled false
csv.enabled false
html.destination "$buildDir/reports"
}
}
我已经看到有关合并两个报告、生成我已有的 Junit 集成测试报告的现有问题,以及关于 Maven 和 Ant 的类似但最终没有帮助的问题。我找到的最接近的是 this, but nothing I've tried adapting from it has been fruitful. There does seem to be a similar question,但他们的 build.gradle 较少,唯一的回复是 0-up-vote,上一个问题的作者未接受的回复 link.
由于这已经很长了,我不想提供比这里更多的内容,但如果有任何不清楚的地方,我很乐意提供更多。
我已经证实,没有发生像单元测试结果覆盖集成测试这样愚蠢的事情 - 运行宁集成测试和没有定期测试的 jacoco 甚至不会生成类似的文件。
我能做些什么来获得集成测试覆盖率?
[第一次编辑] 我创建了一个小型 Github 回购,其中包含重现此问题所需的一切:https://github.com/micseydel-tile/gradle-jacoco-integration-test
您可以让这两个测试任务都写入同一个目标文件,并附加到现有文件(如果有)。通过这种方式,您可以 运行 任一测试任务并在 HTML 报告中单独查看覆盖率。
此代码片段来自您的小型 github 存储库
`task integrationTest(type: Test) {jacoco {
append = true
destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
classDumpFile = file("$buildDir/jacoco/classpathdumps")
}
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath}`
您可以简单地添加 jacoco 代码块并打开追加。
我终于可以通过以下方法获得汇总报告:
根 build.gradle
-
subprojects {
apply(plugin: 'org.jetbrains.kotlin.jvm')
repositories {
jcenter()
mavenCentral()
}
}
task codeCoverageReport(type: JacocoReport) {
// Gather execution data from all subprojects
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
// Add all relevant sourcesets from the subprojects
subprojects.each {
sourceSets it.sourceSets.main
}
reports {
xml.enabled true
html.enabled true
csv.enabled false
}
}
// always run the tests before generating the report
codeCoverageReport.dependsOn {
subprojects*.test
}
运行 gradle codeCoverageReport
我有一个 build.gradle 文件,它可以单独或一起成功 运行 单元和集成测试(使用 gradle test integrationTest一起)。两者都使用 Junit,我使用的是 Gradle 3,这不是 Android 项目。在单独的目录中为每个生成关于成功的报告。我还可以使用 gradle test jacoco 成功生成 unit 测试覆盖率的 Jacoco 报告。我无法通过使用 gradle integrationTest jacoco 获得我的其他工作集成测试的覆盖率报告,尽管测试成功 运行 和 integrationTest.exec 文件生成。
更明确地说,我在 build/reports/index.html 中获得单元测试覆盖率报告,在 build/reports/test/index.html 和 [=41] 中获得 Junit 报告=].html.创建了一个 build/reports/jacoco 目录,但只包含一个空的 "test" 目录。 build/ 还包含一个 jacoco/ 目录,其中包含 .exec 文件和类路径转储。
这是我的缩写build.gradle
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'jacoco'
repositories {
mavenCentral()
}
sourceSets {
main {
java {
srcDirs = ['src/java']
}
test {
java {
srcDirs = ['test/java']
}
}
resources {
srcDirs = ['src/java', 'conf', 'resource']
}
}
integrationTest {
java {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('integration_test/java')
}
}
}
test {
jacoco {
append = false
destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
classDumpFile = file("$buildDir/jacoco/classpathdumps")
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
/* SNIP */
task integrationTest(type: Test) {
dependsOn startserver
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
integrationTest.finalizedBy stopserver
check.dependsOn integrationTest
integrationTest.mustRunAfter test
tasks.withType(Test) {
reports.html.destination = file("${reporting.baseDir}/${name}")
}
jacoco {
toolVersion = "0.7.6.201602180812"
}
jacocoTestReport {
reports {
xml.enabled false
csv.enabled false
html.destination "$buildDir/reports"
}
}
我已经看到有关合并两个报告、生成我已有的 Junit 集成测试报告的现有问题,以及关于 Maven 和 Ant 的类似但最终没有帮助的问题。我找到的最接近的是 this, but nothing I've tried adapting from it has been fruitful. There does seem to be a similar question,但他们的 build.gradle 较少,唯一的回复是 0-up-vote,上一个问题的作者未接受的回复 link.
由于这已经很长了,我不想提供比这里更多的内容,但如果有任何不清楚的地方,我很乐意提供更多。
我已经证实,没有发生像单元测试结果覆盖集成测试这样愚蠢的事情 - 运行宁集成测试和没有定期测试的 jacoco 甚至不会生成类似的文件。
我能做些什么来获得集成测试覆盖率?
[第一次编辑] 我创建了一个小型 Github 回购,其中包含重现此问题所需的一切:https://github.com/micseydel-tile/gradle-jacoco-integration-test
您可以让这两个测试任务都写入同一个目标文件,并附加到现有文件(如果有)。通过这种方式,您可以 运行 任一测试任务并在 HTML 报告中单独查看覆盖率。 此代码片段来自您的小型 github 存储库
`task integrationTest(type: Test) {jacoco {
append = true
destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
classDumpFile = file("$buildDir/jacoco/classpathdumps")
}
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath}`
您可以简单地添加 jacoco 代码块并打开追加。
我终于可以通过以下方法获得汇总报告:
根 build.gradle
-
subprojects {
apply(plugin: 'org.jetbrains.kotlin.jvm')
repositories {
jcenter()
mavenCentral()
}
}
task codeCoverageReport(type: JacocoReport) {
// Gather execution data from all subprojects
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
// Add all relevant sourcesets from the subprojects
subprojects.each {
sourceSets it.sourceSets.main
}
reports {
xml.enabled true
html.enabled true
csv.enabled false
}
}
// always run the tests before generating the report
codeCoverageReport.dependsOn {
subprojects*.test
}
运行 gradle codeCoverageReport