2017-04-06 50 views
0

我已经搜索过以前使用过的关于这个问题的答案,但是我最终处于一个我不确定是否有可能继续的地步,我想确保jacoco支持这个。 我有一个多模块Maven项目,我使用了集成测试黄瓜:Jacoco + Cucumber + 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文件夹。我发现的大多数例子都在每个模块中都有验收测试,覆盖范围是为属于该模块的代码生成的。

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

这种覆盖面是否可以通过jacoco来实现?

谢谢!

回答

0

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

结果是

  • 生产类被编译
  • 生产类被仪表所以代码覆盖可以被测量
  • 测试被执行和使用被记录
  • 用法结果被收集
  • 用下一个模块重复

这是断开的位置,依赖于前一个模块的新模块将使用生成的依赖关系。现在缓存在本地Maven缓存中的jar。 jar中的类不会被检测到,也不会记录它们的使用情况。

我使用了一个解决方案是

  • 编译所有代码
  • 仪器代码
  • 执行所有测试
  • 巩固和发展报告

我写了blog post大约在几年前。

+0

我会在周末看看是否可以应用此解决方案。感谢您的回复,至少现在我知道发生了什么。 –

0

问题是我没有重用jacoco-it.exec文件。它工作时,我有一个模块,而是一个子模块它是在模块的目标去和它不能再使用该文件

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

所以计算出的覆盖率不具有模块本身的模块。 如果b有b1和b2,则使用此条目$ {project.basedir} /../ target/jacoco-it.exec for sonar.jacoco.itReportPath它正在寻找b目标文件,而不是目标文件的主要聚甲醛。