之前一直使用cobertura进行代码覆盖率统计,但是切换到Springboot2且jdk升级到1.8后,发现cobertura对jdk1.8支持不够好,每次遇到lamba表达式时,都会报warn,且cobertura对多模块支持不够友好(需要使用ant,没有实际测试过)且年久失修(好久都没人更新),故使用了JaCoCo进行多模块代码覆盖率统计;
初步方案如下:
项目结构:
说明:web为启动模块,依赖关系:web->service->manager->dao->entity+common
注:test模块是为了统一代码覆盖率报告而单独建的模块,且test->web+service+manager+dao+entity+common(test依赖其他所有子模块)
最外层父POM:
<build>
<plugins>
<!-- jacoco插件 -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report-aggregate</id>
<phase>verify</phase>
<goals>
<goal>report-aggregate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins></build>
子模块POM:
子模块POM只需继承(parent)父POM即可
问题:
实际测试过程中,会在每个子模块中target/site/jacoco-aggregate文件夹下生成index.html,通过浏览器查看该index.html即可直观的看到当前代码测试的覆盖率报告;
但是实际测试结果并不好,多模块统计结果是进行合并了,但是只有当前模块pom中显式的依赖了其他模块,才会在当前模块的报告中去回去合并显式声明的其他模块,例如:web->service->manager,实际在web中的target/site/jacoco-aggregate/index.html只能查看到service(显式依赖)的统计结果,无法查看到manager(传递依赖)的统计结果,并且web中的index.html也无法查看到自己模块(web)的统计信息;
最终解决方案:
新建了test模块,当前模块里什么代码都没有,但是POM中显式依赖了其他所有模块,显式依赖就是为了聚合其他所有模块的统计报告;
test模块POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion><groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mx-vehicle-parts-management-test</name><parent>
<groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent><dependencies>
<!-- 依赖所有子模块 -->
<dependency>
<groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management-web</artifactId>
</dependency>
<dependency>
<groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management-service</artifactId>
</dependency><dependency>
<groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management-manager</artifactId>
</dependency>
<dependency>
<groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management-dao</artifactId>
</dependency>
<dependency>
<groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management-entity</artifactId>
</dependency>
<dependency>
<groupId>com.mx.server.tsp</groupId>
<artifactId>mx-vehicle-parts-management-common</artifactId>
</dependency>
</dependencies>
</project>
综上,为了合并多module的代码测试覆盖率统计报告,
(1)采用了JaCoCo插件,
(2)且单独为了聚合统计报告而新建了一个test模块,当前模块没有任何代码,只是显式依赖了其他所有子模块,
(3)在项目根目录下执行mvn install后,即可通过test模块下的target/site/jacoco-aggregate/index.html查考到合并后的代码测试覆盖率报告;
缺陷:
test模块除了生成聚合报告,没有任何实际作用,且所有Springboot多模块项目为了聚合代码测试覆盖率报告都需要单独建立一个test模块,成本有点大,且引入了多余的test模块(破环了项目原有结构),希望日后找到更好的方法......