持续集成:确保新的提交包含在测试中

时间:2013-04-03 18:41:38

标签: java jenkins continuous-integration code-coverage jacoco

我正在开发一个项目,其中包含许多未包含在测试中的遗留代码。

有没有办法设置集成服务器来检查所有新提交的测试数量是否最少(例如,覆盖率> 70%)?

基本上,我看到两个选项:

  1. 如果单元测试未涵盖已提交的更改,则会以某种方式将CI服务器设置为使构建失败。这将确保每个新代码都有测试,并且遗留代码的测试将随着每次更改而增加。
  2. 设置整个项目的覆盖率阈值,如果提交后覆盖率降低,则构建失败。这样做的问题是,如果我删除一个包含100条指令的类并添加一个包含50条指令的新类,那么覆盖百分比将会上升而不会编写任何测试。
  3. 我更喜欢选项1,因为它会强制遗留代码中的更改进行单元测试。这应该会增加整体测试覆盖率。

    现在我们使用Jenkins作为CI服务器,使用JaCoCo作为测试覆盖。 Maven用于构建项目,SVN是我们的主要源代码控制。

4 个答案:

答案 0 :(得分:1)

我知道您可以配置Jenkins以验证在提交过程中至少有一个测试文件。这不能保证良好的测试覆盖率,但至少你会知道存在某种与测试相关的变化。

答案 1 :(得分:0)

对于选项2,您可以使用Jenkins JaCoCo plugin跟踪每个构建的代码覆盖率,并根据覆盖率指标将构建结果设置为传递或失败。

我也更喜欢选项1,但我不知道Jenkins这样做的内置方式。对于覆盖数据进行后处理并将其与SVN修订信息相结合应该相当容易(至少在类级别),例如:

  1. 解析JaCoCo输出文件并查找覆盖率为0%的类
  2. 从SVN修订详细信息中获取为此版本更改的文件(Jenkins在环境变量中提供修订号,如果此版本只有一个SVN_REVISION,则为SVN_REVISION,SVN_REVISION_2,...为多个)
  3. 如果任何已更改的类具有0%覆盖率,则打印错误消息
  4. 如果打印出错误消息,请使用Jenkins Text Finder plugin使构建失败。
  5. 这不是一个完整的解决方案,对于未被测试覆盖的新方法或行变得更加棘手。给我一个新的Jenkins插件的想法;-)

答案 2 :(得分:0)

一些覆盖工具(如cobertura)支持排除包裹。这样,您可以排除所有旧代码(假设它可以进行模式匹配)并让cobertura仅检查新代码(涵盖新提交)。

我希望这会有所帮助。

答案 3 :(得分:0)

我已经构建了一个完全正确的工具

https://github.com/exussum12/coverageChecker

传入分支的差异和测试的封面测试输出。该工具可以确定diff中哪些行也位于三叶草文件中。并且如果小于某个百分比

则失败

使用

bin/diffFilter --phpunit diff.txt clover.xml 70
当测试覆盖少于70%的差异时

失败构建

我可以根据需要添加其他格式

编辑

我添加了jacoco

Bin/diffFilter --jacoco diff.txt jacoco.xml