Multi Module Spring Boot集成测试使用JaCoCo生成测试覆盖率

一般的SpringBoot项目会由多Module组成,每个Module为不同的功能模块。项目启动时,多个Module提供不同的服务,共同支持了本项目所提供的服务。若采用启动SpringBoot的方式进行多Module集成测试,一般test case会放在SpringApplication类所在的Module中,该Module一般仅提供了服务的入口,并无太多实际业务功能「简单来说,业务代码都不在这个Module中」。本文探讨运行集成测试,对多Module测试覆盖率合并统计的方法。

项目结构

本文所述的项目具有如下结构:

1
2
3
4
5
6
7
- pom.xml

- subModule 1
- - pom.xml

- subModule 2
- - pom.xml

Root pom.xml管理项目公共Maven配置,subModule 1为应用入口,SpringApplication类也在其中,SpringBoot也在此Module中启动;subModule 2为业务功能模块,提供Service服务。

选择JaCoCo

一般测试覆盖率统计工具,单独在Module内执行test case,并分别为每个Module创建覆盖率报告,没有跨Module覆盖率的内置支持,也没有多个Module的合并报告。根据这篇文章Java覆盖率工具jacoco,Cobertura可知,JaCoCo有很多优势,基本成为了目前唯一可用的工具,根据JaCoCo官方文档MavenMultiModule所述,JaCoCo 0.7.7版实现了新的Maven Goal jacoco:report-aggregate 。所以本文就基于以上资料,研究并生成Maven多Module覆盖率汇总文档。

使用JaCoCo生成测试覆盖率文档

由于官方只是强调实现了该功能,并未给出最佳实践,再次通过搜索资料,发现了这篇 StackOverflow 回复给出了最佳实践,按其中的指示操作即可:

  1. 在根 pom.xml 中添加 jacoco-maven-plugin:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?xml version="1.0" encoding="UTF-8"?>
    <project>
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.4</version>
    </dependency>
    </dependencies>
    </dependencyManagement>
    <build>
    <plugins>
    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.4</version>
    <executions>
    <execution>
    <id>prepare-agent</id>
    <goals>
    <goal>prepare-agent</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
    </project>
  2. 在启动SpringBoot的子Module中,添加如下构建配置即可,不要忘了使用maven-surefire-plugin插件对test case进行管理。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <project>
    <dependencies>
    <dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    </dependency>
    </dependencies>
    <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    </plugin>
    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.4</version>
    <executions>
    <execution>
    <id>report-aggregate</id>
    <phase>verify</phase>
    <goals>
    <goal>report-aggregate</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
    </project>
  3. 配置好后,只需要在应用根目录下「Root pom.xml所在的目录下」,执行Maven指令 mvn verify,之后在SpringBoot子Module中,打开target/site/jacoco-aggregate/index.html,即可在浏览器中查看详细的测试覆盖率报告了。覆盖率报告示例如下:

参考资料

  1. Maven中测试插件(surefire)的相关配置及常用方法
  2. Creating Multi-project Builds
  3. java - Reporting and Merging multi-module jacoco reports with report-aggregate - Stack Overflow
  4. MavenMultiModule · jacoco/jacoco Wiki · GitHub
  5. Java覆盖率工具jacoco,Cobertura_zzhongcy的专栏-CSDN博客_cobertura 端口占用