14

我正在开发一个项目,该项目包含大量未包含在测试中的遗留代码。

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

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

  1. 当提交的更改未包含在单元测试中时,以某种方式设置 CI 服务器以使构建失败。这将确保每段新代码都有测试,并且旧代码的测试将随着每次更改而增加。
  2. 为整个项目设置覆盖阈值,如果在提交后覆盖百分比降低,则构建失败。这样做的问题是,如果我删除一个包含 100 条指令的类并添加一个包含 50 条指令的新类,那么覆盖率将上升而无需我编写任何测试。

我更喜欢选项 1,因为它强制对遗留代码的更改进行单元测试。这应该会增加整体测试覆盖率。

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

4

4 回答 4

1

我知道您可以配置 Jenkins 以验证至少有一个测试文件作为提交的一部分。这不能保证良好的测试覆盖率,但至少您会知道存在某种与测试相关的更改。

于 2013-04-03T18:47:36.327 回答
0

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

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

  1. 解析 JaCoCo 输出文件并找到覆盖率为 0% 的类
  2. 从 SVN 修订详细信息中获取为此构建更改的文件(Jenkins 使修订号在环境变量中可用,如果此构建只有一个,则为 SVN_REVISION 或 SVN_REVISION_1、SVN_REVISION_2、... 多个)
  3. 如果任何更改的类的覆盖率为 0%,则打印错误消息
  4. 如果打印错误消息,请使用Jenkins Text Finder 插件使构建失败。

这不是一个完整的解决方案,它对于测试未涵盖的新方法或行变得更加棘手。给了我一个新的 Jenkins 插件的想法;-)

于 2013-04-03T18:48:09.820 回答
0

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

我希望这有帮助。

于 2013-04-03T18:50:46.787 回答
0

我已经构建了一个工具,它正是这样做的

https://github.com/exussum12/coverageChecker

您传入分支的差异和测试的覆盖测试输出。该工具可以确定 diff 中的哪些行也在 clover 文件中。如果低于某个百分比,则构建失败

使用

bin/diffFilter --phpunit diff.txt clover.xml 70

当测试覆盖不到 70% 的差异时,构建失败

如果需要,我可以添加其他格式

编辑

我加了jacoco

Bin/diffFilter --jacoco diff.txt jacoco.xml
于 2017-08-17T16:46:27.863 回答