Springboot - 多module - 代码覆盖率统计 - JaCoCo

之前一直使用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模块(破环了项目原有结构),希望日后找到更好的方法......

发布了56 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/luo15242208310/article/details/100143802