Jacoco + Cucumber + Maven 设置

Jacoco + Cucumber + Maven setup

我之前搜索过并使用了关于这个问题的答案,但我最终不确定是否可以继续,我想确保 jacoco 支持这个问题。 我有一个多模块 Maven 项目,我正在使用 Cucumber 进行集成测试:

<modules>
  <module>a</module>
  <module>b</module>
  <module>c</module>
</modules>

  <profiles>
    <profile>
        <id>env-local</id>
        <modules>
            <module>acceptance-tests</module>
        </modules>
    </profile>

acceptance-tests 模块未在父 pom 的标记中定义,但 acceptance-tests pom.xml 具有与其余模块相同的父定义。

问题是所有集成测试都在验收测试中。我在这个模块中甚至没有 src/main/java 文件夹。我发现的大多数示例在每个模块中都有验收测试,并且会为属于该模块的代码生成覆盖率。

在我的例子中,我需要生成一个包含所有使用的 class 的报告,即使它们来自另一个模块。我也设法做到了这一点,但我只能找到 'first level' 的覆盖范围:如果直接从 spb-acceptance 使用 class,它会包含在报告中,但我找不到任何有关的信息间接使用的 classes。

jacoco可以实现这种覆盖吗?

谢谢!

你的问题是 Maven 在构建项目时使用了深度优先的方法。也就是说,它将在继续下一个模块之前完成一个模块中的所有内容。

结果是

  • 生产 类 得到编译
  • 生产 类 得到检测,因此可以测量代码覆盖率
  • 执行测试并记录使用情况
  • 使用结果收集
  • 重复下一个模块

这就是问题所在,依赖于前一个模块的新模块将使用生成的依赖项。现在缓存在本地 Maven 缓存中的 jar。 jar 中的 类 未检测,不会记录它们的使用情况。

我用过的一个解决方案是

  • 编译所有代码
  • 检测代码
  • 执行所有测试
  • 整合并构建报告

我大约在几年前写了一篇 blog post

问题是我没有重复使用 jacoco-it.exec 文件。当我有一个模块时它工作但是对于一个子模块它正在模块目标中并且它无法重用文件

<modules>
  <module>a</module>
  <module>b</module>
  <module>c</module>
</modules>

因此它计算了本身没有模块的模块的覆盖率。 如果 b 有 b1 和 b2,则使用此条目 ${project.basedir}/../target/jacoco-it.exec sonar.jacoco.itReportPath 它在 b 的目标中寻找文件,而不是在主 pom 的目标中。

在努力完成多模块项目后,我创建了一个 complete simple demo project 显示单元、集成、黄瓜测试。测试覆盖率通过 Jacoco 显示。 您可以在 module3 Cucumber 测试中看到。

  • 多模块项目
  • 单元测试(通过 mvn clean install)
  • 集成测试(通过 mvn clean install -P 集成测试)
  • Cucumber 测试(通过 mvn 全新安装)- 演示 unit/it-testing
  • Jacoco - 测试覆盖率(聚合数据文件和聚合报告)
  • FindBugs - 代码质量

在这个项目中,有一个单独的 jacoco-aggregate 步骤来组合不同模块的 Jacoco 结果。然后您可以浏览 index.html 文件以查看所有模块的 Jacoco 结果。

当您使用 SonarQube 时,单独模块的 Jacoco 结果的聚合由 SonarQube 完成。因此,您可以省略聚合步骤。

我创造了 another simple project 以不同的方式解决问题。

  • 在 'build' 'pluginmanagement' 部分的父 pom 中定义 failsafe 和 surefire 插件的定义。
  • 在使用这些插件的每个模块中,通过使用 groupid 和 artifactid 的非常简单的引用来引用插件。就这样。