Gradle:如何使用jacoco为Integration测试生成覆盖率报告

时间:2013-09-26 10:00:08

标签: java gradle jacoco

我是新手。我使用以下代码。但它为单元测试用例生成了覆盖范围。但它没有为集成测试用例生成。我在src / test / java包中有我的测试类。

test {
    dependsOn jettyRunWar
    ignoreFailures true
    finalizedBy jettyStop
}

apply plugin: 'jacoco'

jacocoTestReport {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
    additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
}

4 个答案:

答案 0 :(得分:4)

使用Gradle 5.4.1(现在是5.5.1),我可以在完成任何测试任务后获得报告,目前我既有testintegrationTest任务。

EDIT2 :解决方案相同,我只是进行了调整

  • 要使用jacoco.reportsDir的报告目标,
  • executionData现在需要tasks.withType(Test)而不是[test, integrationTest]
  • 设置executionData是在doFirst块中完成,而不是doLast

编辑:查看JacocoReport的文档后,有一个JacocoReport:executionData变体可以直接执行Gradle任务。之所以有效,是因为the JaCoCo plugin adds a JacocoTaskExtension extension to all tasks of type Test。这样就不容易出错。报告任务将变为:

jacocoTestReport {
    doFirst {
        // The JaCoCo plugin adds a JacocoTaskExtension extension to all tasks of type Test.
        // Use task state to include or not task execution data
        // https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskState.html
        executionData(tasks.withType(Test).findAll { it.state.executed })
    }

    reports {
        xml.enabled true
        xml.destination(file("${jacoco.reportsDir}/all-tests/jacocoAllTestReport.xml"))
        html.enabled true
        html.destination(file("${jacoco.reportsDir}/all-tests/html"))
    }
}

同样的技巧也可以应用于sonarqube任务:

sonarqube {
    group = "verification"
    properties {
        // https://jira.sonarsource.com/browse/MMF-1651
        property "sonar.coverage.jacoco.xmlReportPaths", jacocoTestReport.reports.xml.destination
        properties["sonar.junit.reportPaths"] += integrationTest.reports.junitXml.destination
        properties["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
        // ... other properties
    }
}

较旧但非常有效的答案。同样,利用上面的知识(Test的任务被JacocoTaskExtension扩展了),可以用file和{{替换executionData的手动test.jacoco.destinationFile配置1}}。

integrationTest.jacoco.destinationFile

答案 1 :(得分:2)

看起来,您需要告诉build.gradle是使用sourceSets进行的Intergration测试(即包含这些IT测试的文件夹)的位置。在我的情况下,我有src / java下的源代码(而不是src / main / java - gradle默认)..我的单元测试(Junit)在test / java文件夹下,我的集成测试在src / java-test文件夹下。 / p>

sourceSets {
   main {
      java {
         srcDir 'src/java'
      }
   }
   test {
      java {
         srcDir 'test/java'
      }
      resources {
         srcDir 'test/resources'
         srcDir 'conf'
      }
   }
   integrationTest {
      java {
         srcDir 'src/java-test'
      }
   }
}

然后,我将IntegrationTest任务作为...你可以调整,因为你可能没有cleanTest(我创建的自定义任务),所以你可以忽略那个依赖...我认为在你的情况下你会使用类似于jettyStart的东西,因为你正在使用它进行IT测试(启动容器运行IT测试,然后用finalizeBy功能来停止jetty .. jetty插件)

task integrationTest( type: Test, dependsOn: cleanTest ) {
   jacoco {
      //destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
      destinationFile = file("$buildDir/jacoco/integrationTest.exec")
      //classDumpFile = file("$buildDir/jacoco/classpathdumps")
      classDumpFile = file("$buildDir/classes/integrationTest")
   }
   testClassesDir = sourceSets.integrationTest.output.classesDir
   classpath = sourceSets.integrationTest.runtimeClasspath
}

请参阅此帖子,了解我最终的详细输出结构和脚本。我得到单元测试(test.exec)和IT测试intergrationTest.exec的.exec但我没有得到两个测试的jacoco.xml / jacocoHtml报告。我还发现,如果我运行“gradle clean build”(包括调用“test”任务)和“gradle clean build integrationTest”,那么稍后会覆盖build / test-results文件夹中的单元测试数据和build / reports /测试文件夹。

Jacoco Unit and Integration Tests coverage - individual and overall

注意:在我的情况下,jacocoTestReport在其中一个公共gradle文件的global gradle init.d文件夹中定义。这将有助于我们不要在所有/项目级build.gradle文件中包含相同的代码。

答案 2 :(得分:2)

由于我无法通过任何答案使其运行,因此我将在此处添加解决方案。 如果您先运行测试任务(例如integTest),然后再调用jacocoTestReport,它将起作用。

您需要做的就是告诉jacocoTestReport任务从测试任务中找到收集的执行数据的位置。执行数据始终以测试任务命名。因此,如果您有一个名为integTest的测试任务,那么您的执行数据将存储在build/jacoco/integTest.exec中。通过将jacocoTestReport任务添加到属性executeData中,它们也可以配置为查找其他文件。您还可以添加包含通配符,以便将所有执行数据都考虑在内:

jacocoTestReport {
    executionData = fileTree(dir: project.projectDir, includes: ["**/*.exec"])
}

通过执行测试覆盖率下方的语句,将为您创建集成测试任务(例如integTest

./gradlew integTest jacocoTestReport

这也适用于要在模块integTest中运行a任务的多模块项目:

./gradlew a:integTest a:jacocoTestReport

答案 3 :(得分:0)

我相信最完整的答案将如下所示:

tasks.withType(Test) {
    finalizedBy jacocoTestReport
}

project.jacocoTestReport {
    getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec"))

    reports {
        csv.enabled true
    }
}

至少它完全适合我的集成和功能测试需求。