我的构建可以规定我的代码覆盖率永远不会变差吗?

时间:2008-12-23 18:27:25

标签: java hudson code-coverage continuous-integration

我正在使用hudson CI来管理一个直接的java web项目,使用ant来构建。

我想强制要求单元测试覆盖率不会比之前的版本差,从而确保始终测试任何新代码,或者至少覆盖范围不断改进。

是否有以这种方式工作的哈德森插件?

编辑:我目前正在使用Emma,但愿意切换到另一个覆盖应用。

另外,作为澄清,我已经看到了一些Hudson插件的阈值,但这并不是我所追求的。例如,我想要的是,如果Build#12的覆盖率总体上是46%,并且有人在Build#13中检查了45%的覆盖率,则构建将会中断。

我想这样做的原因是我有一个测试覆盖率低的代码库。我们没有时间回去并追溯写单元测试,但我想确保覆盖率不断提高。

更新:Dan指出了我的计划的边缘案例肯定会成为一个问题。我想我需要重新考虑这是否是一个好主意。

4 个答案:

答案 0 :(得分:8)

是。您使用的是哪种覆盖工具?

Hudson的Cobertura插件绝对支持这一点。在项目配置屏幕上,您可以指定阈值。

或者,您可以通过使用cobertura-check任务使Ant失败构建(而不是Hudson)。

编辑:我不确定您是否可以完全满足您的要求。即使你可以,也可能证明是有问题的。例如,假设您的平均覆盖率为75%,但对于一个级别,您的覆盖率为80%。如果删除80%的类及其所有测试,即使其他代码都没有比之前测试的更少,也会降低整体覆盖率。

答案 1 :(得分:3)

这是一种黑客行为,但我们使用Findbugs和Checkstyle的原因类似。您可以设置Ant任务来执行以下操作(这可以拆分为多个任务,但为了简洁我将它们组合在一起):

  1. 使用覆盖率运行测试
  2. 解析覆盖率结果并获得覆盖率百分比
  3. 从上一次构建中读取tmp / lastCoverage.txt(参见步骤#5a)
  4. 将当前的覆盖率百分比与从lastCoverage.txt
  5. 中读取的百分比进行比较
    1. 如果百分比DID没有减少,请在tmp / lastCoverage.txt的内容上写下新的百分比
    2. 如果DID百分比减少,请保留原始文件并回显“COVERAGE FAILURE”(使用ant的echo任务)。
  6. 请注意,步骤2到5不一定需要使用本机Ant任务完成 - 您可以使用Ant的javac任务来运行Java程序来为您执行此操作。

    然后,配置Hudson:

    • 在“源代码管理”下,确保选中“使用更新”。这将允许在构建之间保留lastCoverage.txt文件。请注意,如果你真的需要在构建之间清理东西,这可能会有问题。
    • 使用带有正则表达式的Hudson Text Finder插件在构建输出中搜索“COVERAGE FAILURE”(确保为插件选中“还搜索控制台输出”)。文本查找器插件可以标记构建不稳定。

    显然,您可以将文件名/路径和控制台输出等内容替换为构建上下文中的任何内容。

    正如我上面提到的,这是相当hacky,但它可能是为数不多的(只有?)方法之一,让Hudson将之前版本中的内容与当前版本进行比较。

答案 2 :(得分:0)

另一种方法是使用Hudson的Sonar插件来保持覆盖率随时间的趋势,并使其更容易吸收和分析结果。它还将显示其他度量的上下文,例如checkstyle和pmd

答案 3 :(得分:0)

Atlassian的Clover支持你想要的东西。查看clover-check Ant任务,特别是historyDir属性。