最近再做单元测试覆盖率统计问题,最终决定方案是 jacoco+sonar进行数据集成。
但在实现过程中发现由于我们项目是一个maven的多模块工程,数据从jacoco.exec同步至sonar 后无法读取其它模块的覆盖率。
如上图,使我们的模块划分。单元测试执行完后会在xxxx-user-web 的 target文件夹中生成jacoco.exec,数据同步至sonar后,我发现sonar中的单元测试覆盖率是错误的,完全没有读取到xxxx-user-core 和 xxxx-user-api 这两个模块下代码的覆盖率。
web模块 pom.xml中jacoco的配置
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<!--当前模块测试报告-->
<executions>
<execution>
<id>report-aggregate</id>
<phase>test</phase>
<goals>
<goal>report-aggregate</goal>
</goals>
</execution>
</executions>
</plugin>
于是开始了漫长的找资料和试错的过程。
- 方案1:有说升级至JDK11 然后将sonar 版本升级至最新版本。
成本太大风险太高放弃了没有尝试
- 方案2:修改pom配置 增加 ** <append>true</append>** 使用所谓的追加模式。
失败,并不能解决问题
最后找到文章:maven多模块工程jacoco、sonar单元测试覆盖率及集成测试覆盖率
里面提到存在官方的多模块案例:https://github.com/SonarSource/sonar-scanning-examples/tree/master/sonarqube-scanner-maven/maven-multimodule
拉取案例分析,发现该案例解决方案是在每个模块都写自己模块的单元测试来实现覆盖率统计的准确性。
但是明显不适用于我们这种工程,我们的单元测试都写在一个模块中。尝试将官方案例的单元测试全部移动至一个模块后,执行 发现并没有奇迹,覆盖率依然是错误的。
这时候的我已经在崩溃边缘,心态爆炸,开启求援模式,拉上项目组中其他同事一起研究解决该问题
最后发现sonar低版本的想要读取到对应模块的覆盖率,有一个要求就是该模块下必须要有jacoco.exec文件
于是我们修改脚本,在单元测试执行完后,将生成的jacoco.exec文件 拷贝至core模块下,最终实现覆盖率准确导入sonar
脚本如下:
{ mvn clean test ; [ $? -ne 0 ] && exit 1 ; }
cp *-web/target/jacoco.exec *-core/target/ && mvn sonar:sonar
1、执行测试 如单元测试执行失败则立刻结束;2、拷贝新生成的jacoco.exec至指定目录;3、数据推送至sonar