使用Jacoco插件的build.gradle不会为集成测试生成覆盖率报告

时间:2016-10-10 22:49:24

标签: java testing gradle junit jacoco

我有一个build.gradle文件,它可以单独或一起成功运行单元和集成测试(使用像 gradle test integrationTest 这样的命令)。两者都使用Junit,我使用的是Gradle 3,这不是Android项目。在不同的目录中为每个成功生成一份报告。我还可以使用 gradle test jacoco 成功生成单元测试覆盖率的Jacoco报告。我无法使用 gradle integrationTest jacoco 获取我的其他工作集成测试的覆盖率报告,尽管测试成功运行并生成了integrationTest.exec文件。

更明确一点,我在build / reports / index.html中获取单元测试覆盖率报告,在build / reports / test / index.html和build / reports / integrationTest / index.html中获取Junit报告。创建了build / reports / jacoco目录,但只包含一个空的“test”目录。 build /还包含一个jacoco /目录,其中包含.exec文件和classpathdumps。

这是我的缩写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,但我尝试过的任何东西都没有成效。似乎确实存在similar question,但其build.gradle较少,唯一的回复是上一个链接中该问题的作者的0-up-vote,not-accepted响应。

由于这已经很长了,我不想过多提供比这里更多,但如果有什么不清楚我很乐意提供更多。

我已经确认没有像单元测试结果覆盖集成测试那样愚蠢 - 运行集成测试和jacoco没有定期测试甚至不会产生类似的文件。

我能做些什么来获得集成测试覆盖率吗?

[首次编辑]我创建了一个小型Github仓库,其中包含了重现此问题所需的一切:https://github.com/micseydel-tile/gradle-jacoco-integration-test

2 个答案:

答案 0 :(得分:1)

您可以将两个测试任务写入同一目标文件,并将它们附加到现有文件(如果有)。这样,您可以运行任一测试任务,并在HTML报告中单独查看coverage。 此代码段来自您的小型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代码块并启用追加即可。

答案 1 :(得分:0)

我最终可以通过以下方法获得汇总报告: 根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