Jacoco + Cucumber + Maven设置

时间:2017-04-06 07:36:01

标签: maven cucumber jacoco

我之前搜索过并使用过有关此问题的答案,但最后我不确定是否可以继续,我想确保jacoco支持此问题。    我有一个multimodule maven项目,我正在使用黄瓜进行集成测试:

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

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

验证测试模块未在父pom的标签中定义,但验收测试pom.xml与其余模块定义的父级相同。

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

在我的情况下,我需要生成一个包含所有使用类的报告,即使它们来自另一个模块。我也设法做到这一点,但我只能找到第一级的覆盖范围&#39;如果一个类直接来自spb-acceptance,它包含在报告中,但我找不到任何有关间接使用的类的信息。

使用jacoco可以实现这种覆盖吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

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

结果就是

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

这是它破坏的地方,依赖于前一个的新模块将使用生成的依赖项。现在缓存在本地Maven缓存中的jar。 jar中的类没有检测,也没有为它们记录用法。

我使用的解决方案是

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

几年前我写了blog post

答案 1 :(得分:0)

问题是我没有重复使用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的目​​标。

答案 2 :(得分:0)

在与多模块项目挣扎之后,我创建了一个complete simple demo project显示单元,集成,黄瓜测试。测试覆盖范围通过Jacoco显示。 您可以在module3中看到Cucumber测试。

  • 多模块项目
  • 单元测试(通过mvn clean install)
  • 集成测试(通过mvn clean install -P integration-test)
  • 黄瓜测试(通过mvn clean install) - 演示单元/ it-testing
  • Jacoco - 测试覆盖率(聚合数据文件和汇总报告)
  • FindBugs - 代码质量

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

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

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

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