mutiModule maven 项目的综合声纳报告

Posted

技术标签:

【中文标题】mutiModule maven 项目的综合声纳报告【英文标题】:Aggregated Sonar report for mutiModule maven Project 【发布时间】:2021-03-25 03:12:04 【问题描述】:

我有一个类似这样的多模块模块项目的设置

模块1

|
 submodule1
|
submodule2

我在子模块 1 中编写了一个 Junit 测试,它也覆盖了子模块 2 的代码,但是当我尝试在声纳中查看覆盖率时,它显示子模块 2 的覆盖率为 0%,有什么方法可以显示子模块 2 的覆盖率吗?我也可以通过运行 mvn clean install jacoco:report-aggregate 来生成聚合的 xml 报告,但是如何将这个聚合的报告提供给声纳?如何设置模块和子模块的pom?

【问题讨论】:

您如何称呼声纳?马文?你从哪里打电话给 Maven? 请参考creating a parent pom.这应该会帮助你进一步。 【参考方案1】:

我不确定这是否是你正在做的,但我还是会说出来。如果您将 submodule1 创建为“代码”并将 submodule2 创建为“测试”,那么这是一种组织它的可怕方式。测试(特别是单元测试)应该与它正在测试的代码一起存储。因此,每个子模块都有 src/main/java 和 src/test/java。

现在,也就是说,您有一个“common-lib”模块,然后是依赖于该 lib 的其他模块(例如应用程序层),这似乎是合理的。您很有可能在应用程序层运行测试并调用 lib 模块中的代码。但是您不会因此获得代码覆盖率。 Jacoco 对 lib 的覆盖将完全基于 lib 中的测试。 “应用程序”测试只为您提供应用程序的覆盖范围。这与 jacoco 运行时发生的检测有关 - 它只会检测它正在运行的模块的本地内容。

是的,有一个 jacoco-aggregate 报告,但这会将模块报告合并在一起 - 每个模块的单个报告。它不会为您提供对调用 lib 方法等的应用层测试的统一覆盖。

最后,声纳。我相信只要你有 jacoco 文件,声纳扫描仪就会使用它们。我认为它在原始 jacoco.exec 文件上运行,但可能能够解释 jacoco-result.xml 或 jacoco-aggregate.xml。如果它让您感到悲伤,请包含您的 pom.xml

【讨论】:

作为 JaCoCo 开发人员,无法抗拒更正:默认情况下,JaCoCo 代理会检测所有加载到 JVM 中的类,无论它们是从哪个磁盘位置(即 Maven 模块)加载的。因此,jacoco:report-aggregate 可以“统一”覆盖一个 Maven 模块的类,因为来自另一个模块的类的调用。

以上是关于mutiModule maven 项目的综合声纳报告的主要内容,如果未能解决你的问题,请参考以下文章

如何通过非 maven 项目的声纳的 junit 测试来测量代码覆盖率

maven多模块项目中的模块级声纳分析

声纳项目集成

Jenkins 脚本管道声纳集成

声纳 Maven 集成

最新版本的声纳 Maven 插件已损坏