2009-09-14 239 views
14

我正在将几个项目从一个ant构建迁移到一个maven项目。构建服务器现在仍将是Hudson。Hudson中的Java代码覆盖范围

由于tests run and recorded twice problem由于cobertura,我一直在哈德森记录代码覆盖率问题。

该项目是多模块,它将是很好的,虽然不是必需的,有一个汇总输出的代码覆盖率数据。

总而言之,解决我在寻找绝:

所有模块
  • 进行自动测试,并记录结果一次;
  • 在Hudson中显示个人模块代码覆盖范围;
  • 易于配置一次为整个项目,不在每个模块中。

解决方案可以基于Cobertura或Emma或任何其他Java代码覆盖工具。


更新:运行艾玛测试还是复制的结果,并没有merge能力,所以它不是一个真正可用的多模块构建。

回答

1

罗伯特,

我有这个问题,以及发现哈德森没有双报告,如果你设置的项目作为自由泳项目,而不是一个Maven2的项目。你确实失去了一个maven2项目的好处,但对我们来说,这是一个我们必须做的交易。

杰夫

+0

感谢您的回答。很高兴知道,我将此作为备选方案。 – 2009-09-15 06:39:03

+0

当然。另外,我并不是100%确定的,但我相信会发生什么情况是,在未安装代码之前,已插装的代码将在类路径中结束,然后当单元测试由Surefire插件运行时,它将运行已插装的代码,结果被计算两次。如果你有其他插件运行单元测试,你会看到测试次数再次增加。您可以使用mvn -X运行您的构建以获取应该提供类路径的调试信息。 – 2009-09-15 12:35:23

1

我们使用自由式项目,没有这个问题,从而表明,这可能是你的问题的根源。

为了提供合并功能,我们创建了自己的工件存储库(我们不使用Maven)。在每次构建结束时,我们将cobertura.ser文件复制到网络共享中,并在过程中对其进行重命名。我们有一个整合的视图工作,将所有cobertura文件和源代码文件(复制到网络共享的另一个构建工件)复制到本地构建目录中,并生成Cobertura报告。

Hudson中缺乏标准的工件存储库有点令人沮丧,但它有意义,使作者通常使用Maven来满足这些需求。我们的构建过程运行在多个服务器上,所以我们不能只将相对路径用于其他工作目录。

请注意,我们对其他度量做同样的事情:测试结果,JavaNCSS等。并使用正确的工具或一些自定义代码加入。

我们对传统构建工件使用相同的存储库:DLL,JAR,安装脚本。

1

你考虑过Atlassian's Clover吗?

maven-clover2-plugin有一个新的目标:clover2:setup它将简单地测试你的测试而不会分叉生命周期或运行两次测试。

你会明确目标在哈德森这样运行:

mvn clover2:setup verify clover2:aggregate clover2:clover 

的Maven的clover2-插件是完全免费试用30天。

+0

感谢您的回复。我确实考虑过三叶草,但是AFAIK并不适用于M2 Hudson的工作,只适用于自由泳。 – 2009-09-23 13:18:51

+0

嗨罗伯特, 我会研究一下。它绝对有效,如果你使用自由式的maven工作。 干杯, 尼克 – npellow 2009-09-26 05:27:38

6

这有点冒失,但我使用的方法是使用modified version of the Maven cobertura plugin(这是available from their repo)。它提供了一个cobertura:generate-report目标,以便您可以分别在测试运行之前和之后插入cobertura:instrument和cobertura:generate-report到您的生命周期。这将为您提供您想要的覆盖率数据,而无需重复测试执行/记录。

潜在的问题是,我遇到的所有非三叶草Maven覆盖插件都是围绕着与Maven生命周期中主要测试执行分开的覆盖范围运行测试的想法构建的。显然,这导致两组测试执行。如果您使用的是自由式项目,则只会记录一组测试(因为即使执行两次测试,也只有一个测试输出副本),但Maven项目类型实际上拦截了Maven mojo执行并且在测试执行时记录测试输出/结果,而不是像自由式项目一样在构建结束时一次性记录测试输出/结果。这有很多优点,但它也有一个相当明显的缺点,即一次执行两次的测试会被计为两次测试。尽管我已经看到了针对非检测和检测代码运行测试的强烈争论,但我更愿意仅针对检测代码运行一次测试 - 而不仅仅是因为Maven/Hudson问题,但因为当你需要45分钟的测试时,运行它们两次以产生相同的结果似乎相当愚蠢。

+0

看起来很有趣,谢谢。 – 2009-09-28 20:26:27

+0

链接无法正常工作,也许你可以更新它们?谢谢! – dhiller 2011-11-09 07:11:35

1

请参阅SD Java测试覆盖率,了解具有良好GUI的极低开销工具。我不确定我是否理解你的“运行两次”问题,但是如果你使用SD工具两次运行(相同的确定性)测试,你将得到相同的测试覆盖率数据,例如它的幂等性。 如果您的测试不确定,您将得到两个不同的测试运行,但这些工具很容易将几次运行的结果合并为一个总体摘要。它们也可以处理非常大的应用程序,并且很好地处理多线程应用程序(小时间碎片可以使理论上的答案稍微不准确,但实践这个并不是问题)。

+0

感谢您的回答。是否有任何改变这个工具的Maven插件?我无法找到一个。 – 2009-10-03 12:18:51

+0

对不起,没有maven插件。 – 2009-10-03 16:10:27