【问题标题】:build.gradle with Jacoco plugin doesn't generate coverage report for integration tests带有 Jacoco 插件的 build.gradle 不会为集成测试生成覆盖率报告
【发布时间】:2017-02-19 10:39:14
【问题描述】:

我有一个 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 和 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,不接受的回复。

由于这已经很长了,我不想提供比这里更多的东西,但如果有任何不清楚的地方,我很乐意提供更多。

我已经证实,没有发生像单元测试结果覆盖集成测试那样愚蠢的事情——运行集成测试和没有定期测试的 jacoco 甚至不会产生类似的文件。

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

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

【问题讨论】:

    标签: java testing gradle junit jacoco


    【解决方案1】:

    您可以让两个测试任务写入同一个目标文件,并附加到现有文件(如果有)。这样,您可以运行任一测试任务并在 HTML 报告中单独查看覆盖率。 此代码 sn-p 来自您的小型 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 代码块并打开附加。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 1970-01-01
        • 2019-02-18
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多