多个 Maven 项目,单个 JaCoCo 站点?
Multiple Maven Projects, Single JaCoCo Site?
我在一家使用多个 Maven projects/modules 来创建最终将成为一个产品的公司工作。为了帮助我解释,想象一个类似于下面的文件结构:
- Parent Directory
- Project_1
- /src/
- /target/
- POM.xml
- Project_2
- /src/
- /target/
- POM.xml
在我们使用 JUnit 对代码进行单元测试的过程中,一项重要的合同要求是我们通过测试实现超过一定百分比阈值的代码覆盖率。
我们正在使用 JaCoCo 以 HTML 网站的形式生成覆盖率报告。 JaCoCo 本身被证明是无价的,但我们遇到的一个主要问题是这会在 /target/site/jacoco/
目录下创建一个站点。
我自己做了一些调查,发现除非我弄错了,默认情况下 JaCoCo 不支持将多个 Maven 项目聚合到一个 JaCoCo 报告中的能力。
所以我的问题是,任何人都可以提出一个替代解决方案 - 可以让我们将多个报告集中到一个网络服务器上的解决方案吗?
我们的一个选择是将所有站点移动到网络服务器上的单独文件夹中,然后有一个索引页面将它们链接在一起,但它充其量是 "clumsy"。例如:
- Web Server
- index.html
- Project_1
- (Generated report files)
- Project_2
- (Generated report files)
如有更好的建议,将不胜感激。
截至目前,JaCoCo 并未提供执行此操作的简单方法。但是,他们确实指定了此处描述的三个备选方案:https://github.com/jacoco/jacoco/wiki/MavenMultiModule
他们最合适的方法是创建一个单独的报告模块,其中包含对所有其他模块的依赖项(在 github 文章中称为策略:具有依赖项的模块 ).
reporter 模块使用 jacoco:report-aggregate (http://www.eclemma.org/jacoco/trunk/doc/report-aggregate-mojo.html) maven 目标来获取所有单独的报告并将它们绑定在一起。
示例项目:
https://prismoskills.appspot.com/lessons/Maven/Chapter_06_-_Jacoco_report_aggregation.jsp
您可以采用多种不同的方法。
首先,您可能需要考虑像 Sonar 这样的东西,这样您就可以编译所有模块,并且 运行 一个 Sonar 可以检查覆盖范围等。 Sonar 将获取结果并上传到 Sonar 服务器(包含数据库和所有内容),以便您能够在 UI 中看到哪里出了问题
另一种方法是使用您自己的 Maven 插件(假设您使用的是 Maven)。如果我没记错的话,jacoco 生成的报告也是 XML 报告。所以它可以很容易地被解析。因此,可以编写一个 Maven 插件来识别所有这样的报告,解析它们并提供一些统一的视图。
另一种方法是在覆盖率未达到某个阈值时导致整个构建失败。我知道,它不会直接回答你的问题,但如果你这样做,你将保证最低水平的覆盖范围(可以在项目级别不时增加)。
我在一家使用多个 Maven projects/modules 来创建最终将成为一个产品的公司工作。为了帮助我解释,想象一个类似于下面的文件结构:
- Parent Directory
- Project_1
- /src/
- /target/
- POM.xml
- Project_2
- /src/
- /target/
- POM.xml
在我们使用 JUnit 对代码进行单元测试的过程中,一项重要的合同要求是我们通过测试实现超过一定百分比阈值的代码覆盖率。
我们正在使用 JaCoCo 以 HTML 网站的形式生成覆盖率报告。 JaCoCo 本身被证明是无价的,但我们遇到的一个主要问题是这会在 /target/site/jacoco/
目录下创建一个站点。
我自己做了一些调查,发现除非我弄错了,默认情况下 JaCoCo 不支持将多个 Maven 项目聚合到一个 JaCoCo 报告中的能力。
所以我的问题是,任何人都可以提出一个替代解决方案 - 可以让我们将多个报告集中到一个网络服务器上的解决方案吗?
我们的一个选择是将所有站点移动到网络服务器上的单独文件夹中,然后有一个索引页面将它们链接在一起,但它充其量是 "clumsy"。例如:
- Web Server
- index.html
- Project_1
- (Generated report files)
- Project_2
- (Generated report files)
如有更好的建议,将不胜感激。
截至目前,JaCoCo 并未提供执行此操作的简单方法。但是,他们确实指定了此处描述的三个备选方案:https://github.com/jacoco/jacoco/wiki/MavenMultiModule
他们最合适的方法是创建一个单独的报告模块,其中包含对所有其他模块的依赖项(在 github 文章中称为策略:具有依赖项的模块 ).
reporter 模块使用 jacoco:report-aggregate (http://www.eclemma.org/jacoco/trunk/doc/report-aggregate-mojo.html) maven 目标来获取所有单独的报告并将它们绑定在一起。
示例项目:
https://prismoskills.appspot.com/lessons/Maven/Chapter_06_-_Jacoco_report_aggregation.jsp
您可以采用多种不同的方法。
首先,您可能需要考虑像 Sonar 这样的东西,这样您就可以编译所有模块,并且 运行 一个 Sonar 可以检查覆盖范围等。 Sonar 将获取结果并上传到 Sonar 服务器(包含数据库和所有内容),以便您能够在 UI 中看到哪里出了问题
另一种方法是使用您自己的 Maven 插件(假设您使用的是 Maven)。如果我没记错的话,jacoco 生成的报告也是 XML 报告。所以它可以很容易地被解析。因此,可以编写一个 Maven 插件来识别所有这样的报告,解析它们并提供一些统一的视图。
另一种方法是在覆盖率未达到某个阈值时导致整个构建失败。我知道,它不会直接回答你的问题,但如果你这样做,你将保证最低水平的覆盖范围(可以在项目级别不时增加)。