You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven Jacoco:如何将单元与集成测试覆盖率结果合并至同一概览

Merging Jacoco Coverage for Unit and Integration Tests + Execution Order

Great question! Let's break this down clearly—this is such a common need when tracking full test coverage, so I’ve got you covered.

Do I need to run unit tests before integration tests?

Short answer: It’s strongly recommended, but not strictly required by Jacoco itself.

Here’s why the order makes practical sense:

  • Unit tests are fast, run in isolation, and catch low-level bugs early. Running them first lets you fix issues quickly before moving on to slower, more resource-heavy integration tests.
  • Most build tools (like Maven or Gradle) follow a default lifecycle where unit tests run in an early phase (e.g., test in Maven/Gradle) and integration tests run later (e.g., verify in Maven, integrationTest in Gradle). Sticking to this flow keeps your build consistent with standard industry practices.

That said, Jacoco doesn’t enforce any order—all it cares about is that both test suites generate their execution data files, which we’ll use to merge coverage later.

How to merge coverage results into a single Jacoco overview

The core trick is to collect execution data from both test suites, then use Jacoco’s aggregation feature to generate a unified report. Below are step-by-step guides for the two most common build tools:

For Maven

  1. Configure Jacoco for unit tests to generate execution data:

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.10</version>
        <executions>
            <!-- Unit test coverage setup -->
            <execution>
                <id>jacoco-ut</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
                <configuration>
                    <destFile>${project.build.directory}/jacoco-ut.exec</destFile>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
  2. Add Jacoco configuration for integration tests (typically tied to the verify phase):

    <execution>
        <id>jacoco-it</id>
        <goals>
            <goal>prepare-agent-integration</goal>
        </goals>
        <configuration>
            <destFile>${project.build.directory}/jacoco-it.exec</destFile>
        </configuration>
    </execution>
    
  3. Add the aggregation report goal to combine both execution files:

    <execution>
        <id>jacoco-aggregate-report</id>
        <phase>verify</phase>
        <goals>
            <goal>report-aggregate</goal>
        </goals>
        <configuration>
            <dataFiles>
                <file>${project.build.directory}/jacoco-ut.exec</file>
                <file>${project.build.directory}/jacoco-it.exec</file>
            </dataFiles>
            <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory>
        </configuration>
    </execution>
    

Run mvn verify—your combined coverage report will live at target/site/jacoco-aggregate/index.html.

For Gradle

  1. Apply the Jacoco plugin and configure integration tests (if you haven’t already):

    plugins {
        id 'java'
        id 'jacoco'
    }
    
    // Define integration test source set (adjust paths to match your project)
    sourceSets {
        integrationTest {
            java {
                srcDir file('src/integrationTest/java')
            }
            resources {
                srcDir file('src/integrationTest/resources')
            }
            compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath
            runtimeClasspath += output + compileClasspath
        }
    }
    
    task integrationTest(type: Test) {
        testClassesDirs = sourceSets.integrationTest.output.classesDirs
        classpath = sourceSets.integrationTest.runtimeClasspath
        jacoco {
            destinationFile = file("$buildDir/jacoco/integrationTest.exec")
        }
    }
    
  2. Set up the combined Jacoco report:

    jacocoTestReport {
        executionData = files(
            "$buildDir/jacoco/test.exec", // Unit test execution data
            "$buildDir/jacoco/integrationTest.exec" // Integration test execution data
        )
        reports {
            html.required = true // Enable HTML report
            xml.required = true // Optional: Enable XML for CI tools
        }
    }
    
    // Ensure integration tests run before generating the merged report
    jacocoTestReport.dependsOn integrationTest
    

Run ./gradlew jacocoTestReport—your merged report will be at build/reports/jacoco/test/html/index.html.

Quick Tips

  • Double-check that both test suites are generating their .exec files in the paths you’ve configured—missing files will break the merged report.
  • For multi-module projects, the same logic applies; you’ll just need to reference execution files from all relevant modules in the aggregation step.
  • The combined report will show total coverage across both test types, making it easy to see how much of your code is covered by any test, regardless of type.

内容的提问来源于stack exchange,提问作者user9835597

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:07:01