我如何让Maven的Emma或Cobertura报告其他模块中的源代码报道?

我有一个带有Java代码的多模块Maven设置。

我的unit testing,在其中一个模块中,在多个模块中练习代码。 当然,模块具有相互依赖性,并且在测试执行之前根据需要编译所有相关模块中的代码。

那么:我如何获得整个代码库的覆盖率报告?


注意:我不是要问如何在多个模块中组合测试覆盖率的结果。 我问如何使用来自多个模块的检测代码在单个模块中获得测试的覆盖率。 任何对前者感兴趣的人都可以参考其他 问题 ,以及Crowne为Maven Dashboard和Sonar提出的建议。

我成功地使用纯Ant获得完整的报道。 [编辑:]我将开发运行时目录中的所有jar都检测到了一个临时目录; 将临时目录添加到类路径中; 然后使用批处理测试从Ant运行测试。

Ant可以从Maven运行,但这里的挑战是无缝集成(即,自动将所有类路径和源路径元素从Maven提供给Ant),这就是为什么我没有使用Maven的工具来实现此目的。

关于集成测试还有其他 问题 。 但是,默认情况下,默认情况下,每个项目的报告仅报告同一项目中代码的覆盖率,而我的测试则在多个项目中执行代码。

这篇西class牙语的文章可能是相关的。 这是另一篇特定于Seam的文章 。


托马斯·桑德伯格最近发表的这篇博文包含了一种方法,通过使用ant进行cobertura调用,而不是使用maven cobertura插件来部分解决问题。

它依赖于以下基本方法和专门的pom.xml和build.xml文件:

从父pom上的典型maven编译开始,它将编译子模块中的所有类。

mvn clean compile # maven-compile-plugin called for compiling 

然后检测所有模块类:

 ant instrument # cobertura called for instrumentation 

然后调用maven-surefire-plugin调用使用检测类进行测试,将cobertura作为测试依赖项

 mvn test 

然后使用自定义报告调用从不同模块中提取所有结果:

 ant report # cobertura called for reporting 

ant build.xml文件的关键元素是分别检测所有模块,然后在合并结果后报告所有模块。 需要在他的示例中为每个模块调用此函数:

         

然后在测试完成后,报告阶段首先将来自所有不同目录的所有结果合并到一个新的.ser文件中(在他的示例中称为sum.ser)

                

有可能使用antrun插件将ant组件集成到maven中,但是我不熟悉阶段/生命周期来知道将不同的调用放在哪里。

这对我来说非常有用,因为我在我的api模块中编写抽象测试类,然后在我的lib模块中为它们提供实现。 到目前为止,cobertura和emma都无法处理此设计,因此我的代码覆盖范围通常为0或单个数字。

从未尝试过,但这可能是实现它的一种方法:

  • 在每个模块中,就在安装阶段之前,让cobertura检测jar文件并将检测到的jar文件(!)安装到本地Maven存储库中
  • 在tests-module中,Maven将使用本地Maven存储库中的工件依赖项来运行测试。 这些检测类现在应该出现在数据文件中,例如cobertura.ser
  • 像往常一样从项目的测试模块中运行cobertura-report生成,例如mvn site

请参阅cobertura文档,了解如何手动调用cobertura以就地检测外部JAR文件:

…您还可以传入jar文件,使用标准的ant文件集进行检测。 Cobertura将从jar子中提取每个类并对其进行检测。 如果未指定’todir’,那么原始jar将被一个检测版本覆盖 ……

pom.xml的构建插件可能如下所示 – 如果您不想在本地存储库中覆盖它们,您可能需要添加配置文件或使用分类器来区分最终的jar文件和已检测的jar文件。 然后,在tests模块中,您只需使用分类器为其他模块定义依赖项。

   org.apache.maven.plugins maven-antrun-plugin   cobertura-inplace-instrumentation package            run      net.sourceforge.cobertura cobertura 1.9.4.1    

通常,报告与其特定模块有关,但可以汇总,
两种方法是:

  • Maven的仪表板插件
  • 声纳

我建议您尝试使用声纳为您执行报告聚合。

查看他们的公共实例“ nemo ”,看看提供的令人印象深刻的function。

我怀疑是否可能,因为覆盖信息是由cobertura / emma通过检测编译的类获得的。 虽然这适用于指定项目中的类,但这些工具是否会依赖于仪器依赖库是值得怀疑的。

看看maven cobertura插件的使用情况似乎也没有表明任何这种可能性。

我发现这很简单(虽然我不久前做过,可能会生锈的细节……

我的核心项目包含所有模块。 我使用Cobertura来衡量我的测试覆盖率。 我正在使用Hudson作为持续集成引擎,并为Hudson提供Cobertura插件。

它已经有一段时间了。

祝好运 !