Hudson中的Java代码覆盖率

时间:2009-09-14 19:21:03

标签: java hudson code-coverage cobertura emma

我正在将一些项目从ant build迁移到maven。构建服务器现在是Hudson。

由于tests run and recorded twice problem,我一直无法使用cobertura在哈德森录制代码覆盖率。

该项目是多模块的,虽然不是必需的,但它可以很好地获得代码覆盖率数据的聚合输出。

总而言之,我正在寻找的解决方案必须:

  • 对所有模块运行自动化测试并记录结果一次;
  • 在Hudson中显示单个模块代码覆盖率 ;
  • 可以为整个项目轻松配置一次,而不是在每个模块中配置。

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


更新:使用Emma运行测试仍然会复制结果,并且没有merge功能,因此它不适用于多模块构建。

6 个答案:

答案 0 :(得分:8)

Sonar是一个非常酷的工具,很容易与Hudson集成,我真的很喜欢它与多模块项目的组织。你应该试一试

alt text http://sonar.codehaus.org/wp-content/uploads/2009/08/dashboard.png

答案 1 :(得分:6)

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

潜在的问题是我遇到的所有非三叶草Maven覆盖插件都是围绕着与Maven生命周期中的主要测试执行分开运行测试的想法而构建的。显然,这导致两组测试执行。如果你正在使用一个自由式项目,你将只记录一组测试(因为,即使有两个测试执行,只有一个测试输出的副本),但Maven项目类型实际上拦截了Maven mojo执行和在测试执行时记录测试输出/结果,而不是像自由式项目那样在构建结束时记录测试输出/结果。这有很多优点,但它也有一个相当明显的缺点,即执行两次的单个测试被计为两次测试。

尽管如此,虽然我已经看到了针对非检测代码和检测代码运行测试的强大论据,但我更倾向于仅针对检测代码运行测试一次 - 不仅仅是因为Maven / Hudson问题,而是因为当你进行45分钟的测试时,运行它们两次以产生相同的结果似乎很愚蠢。

答案 2 :(得分:1)

罗伯特,

我也遇到了这个问题,发现如果你把项目设置为自由式项目而不是Maven2项目,Hudson不会报告。你确实失去了拥有maven2项目的一些好处,但对我们来说,这是我们必须做的交易。

杰夫

答案 3 :(得分:1)

我们使用自由风格的项目并没有这个问题,因此如上所述,这可能是您问题的根源。

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

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

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

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

答案 4 :(得分:1)

您考虑过Atlassian's Clover吗?

maven-clover2-plugin有一个新的目标:clover2:setup,它可以简单地测试你的测试,而不需要花费生命周期,或者运行测试两次。

您可以像这样定义在Hudson中运行的目标:

mvn clover2:setup verify clover2:aggregate clover2:clover

maven-clover2-plugin绝对可以免费试用30天。

答案 5 :(得分:1)

请参阅SD Java测试覆盖率,以获得具有良好GUI的极低开销工具。我不确定我理解你的“运行两次”问题,但是如果用SD工具运行两次(相同的确定性)测试,你将得到相同的测试覆盖率数据,例如,它的幂等。 如果您的测试是不确定的,那么您将获得两个不同的测试运行,但这些工具可以轻松地将多个运行的结果合并为一个总体摘要。

它们还可以处理非常大的应用程序,并且可以很好地处理多个线程应用程序(小时间碎片可以使理论上的答案稍微不准确,但实践这不是一个问题)。