14

我正在将几个项目从 ant 构建迁移到 maven 构建。构建服务器是并且将继续是 Hudson。

由于测试运行并记录了两次问题,我一直无法用 cobertura 在哈德逊记录代码覆盖率。

该项目是多模块的,虽然不是必需的,但最好有代码覆盖率数据的聚合输出。

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

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

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


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

4

6 回答 6

8

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

替代文字 http://sonar.codehaus.org/wp-content/uploads/2009/08/dashboard.png

于 2009-10-03T16:16:57.533 回答
6

这有点 hackish,但我使用的方法是使用Maven cobertura 插件的修改版本可从他们的 repo 获得)。它提供了一个 cobertura:generate-report 目标,以便您可以分别在测试运行之前和之后将 cobertura:instrument 和 cobertura:generate-report 插入到您的生命周期中。这将为您提供所需的覆盖率数据,而无需重复的测试执行/记录。

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

也就是说,虽然我已经看到了针对非插桩代码和插桩代码运行测试的有力论据,但我更喜欢只针对插桩代码运行一次测试——不仅仅是因为 Maven/Hudson 问题,而是因为当你有需要 45 分钟的测试,坦率地说,运行两次以产生相同的结果似乎很愚蠢。

于 2009-09-28T15:29:35.970 回答
1

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

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

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

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

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

于 2009-09-15T11:44:15.790 回答
1

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

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

于 2009-10-03T04:50:24.103 回答
1

罗伯特,

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

杰夫

于 2009-09-15T02:37:10.043 回答
1

你考虑过Atlassian 的 Clover吗?

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

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

mvn clover2:setup verify clover2:aggregate clover2:clover

maven-clover2-plugin 完全免费试用 30 天。

于 2009-09-23T11:24:44.123 回答