代码之家  ›  专栏  ›  技术社区  ›  Robert Munteanu

Hudson的Java代码覆盖率

  •  14
  • Robert Munteanu  · 技术社区  · 16 年前

    我将把几个项目从一个Ant构建迁移到一个Maven构建。构建服务器现在和将来都是Hudson。

    我和科贝图拉在哈德逊记录代码覆盖率时遇到了麻烦,因为 tests run and recorded twice problem .

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

    总之,我要寻找的解决方案必须:

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

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


    更新 :在Emma的情况下运行测试仍然重复结果,没有 merge 功能,所以它不能真正用于多模块构建。

    6 回复  |  直到 14 年前
        1
  •  8
  •   victor hugo    15 年前

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

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

        2
  •  6
  •   Robert Munteanu    16 年前

    这有点老土,但我使用的方法是 modified version of the Maven cobertura plugin (这是 available from their repo )它提供了一个cobertura:generate报告目标,这样您就可以分别在测试运行之前和之后将cobertura:instrument和cobertura:generate报告插入到您的生命周期中。这样就可以获得所需的覆盖率数据,而不需要重复的测试执行/记录。

    潜在的问题是,我遇到的所有非Clover Maven覆盖插件都是围绕着这样一个想法构建的,即运行覆盖率独立于Maven生命周期中的主要测试执行的测试。显然,这会导致两组测试执行。如果您使用的是Freestyle项目,那么您只会记录一组测试(因为即使有两个测试执行,也只有一个测试输出副本),但是Maven项目类型实际上会截取Maven Mojo执行,并在测试执行时记录测试输出/结果,而不是在构建结束时将所有测试都作为Freestyl记录下来。E项目做。这有很多优点,但它也有一个相当明显的缺点,即一个测试执行两次就被算作两个测试。

    这就是说,虽然我已经看到了针对非检测代码和检测代码运行测试的有力论据,但我更喜欢针对检测代码只运行一次测试——这不仅仅是因为Maven/Hudson问题,而是因为当您有需要45分钟的测试时,运行两次来生成相同的代码似乎相当愚蠢结果。

        3
  •  1
  •   Jeff Storey    16 年前

    罗伯特

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

    杰夫

        4
  •  1
  •   Jim Rush    16 年前

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

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

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

    注意,我们对其他度量也做同样的事情:测试结果、JavaNCS等。并使用正确的工具或某些自定义代码联接。

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

        5
  •  1
  •   Ira Baxter    16 年前

    用一个漂亮的GUI查看一个非常低的开销工具的SDJava测试覆盖率。我不确定我是否理解您的“运行两次”问题,但是如果您使用sd工具运行(相同的确定性)测试两次,您将获得相同的测试覆盖率数据,例如,它的等量性。 如果您的测试是不确定的,您将得到两个不同的测试运行,但是这些工具很容易将几个运行的结果合并到一个整体摘要中。

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

        6
  •  1
  •   Tim Cooper    14 年前

    你考虑过吗 Atlassian's Clover ?

    Maven-Clover2插件有一个新目标: clover2:setup 它只需在不分叉生命周期的情况下测试,或者运行测试两次。

    您可以这样定义在哈德逊运行的目标:

    mvn clover2:setup verify clover2:aggregate clover2:clover
    

    Maven-Clover2插件可以免费试用30天。