新代码行的代码覆盖质量关卡

Code Coverage Quality Gates for New Lines of Code

对于 Java 应用程序,有没有人对如何构建质量门有任何建议,以防止合并没有至少 80% 代码覆盖率的新代码?我们正在使用遗留代码库,虽然我们希望看到那里的覆盖率有所提高,但我们希望停止流血并对未来的新代码强制执行适当的测试覆盖率。

我看到过有关将 git blame 和 exclusions/inclusions 列表与 SonarQube 或 JaCoCo 结合使用的建议,但是这会报告整个 class 的覆盖范围,而不仅仅是new/changed 行,因此我们可以 运行 解决由于缺少遗留覆盖而导致合并受阻的问题。

您正在寻找的是新代码的覆盖率,它包含在默认质量门中,要求达到 80%。

不幸的是,由于您希望阻止 低覆盖率分支合并到主分支中,这意味着您需要进行稳健的分支分析。它在计划中,但我们还没有。此外,PR 分析(在处理分支机构时总是第一个候选人)也无济于事,因为 a) 它不查看覆盖范围 b) 它不检查分支机构的质量门状态(技术上没有 QG PR 状态)

作为(有点痛苦但可能自动化的)解决方法:

  1. 在分支拆分之前通过对 master 的分析为分支添加一个额外的 SQ 项目。
  • 使用 sonar.version 值“master”*。这建立了你的泄漏基线
  • 一定要使用sonar.branch分析属性来区别于你的master分析
  1. 配置分支项目的泄漏周期为since_previous_version
  2. 更新您的分支项目分析作业以指向分支并将 sonar.version 重置为“分支”*
  3. 在合并前建立一个检查分支 QG 状态的流程
  4. 删除分支后删除分支SQ项目

*或者任何让你开心的值

郑重声明,此上下文中的“新代码”是指自泄漏期开始以来添加的行和修改的(旧)行。泄漏期可以定义为最近 X 天(次优),自给定日期(更好但仍不完美),自特定版本以来,或自 previous_version 以来,这将为您提供一个浮动泄漏期版本变化。为确保投入生产的新代码满足您的质量要求,建议使用最后一个,但这意味着输入到您的分析中的版本字符串需要保持最新。

编辑 21 年 6 月 21 日 新代码覆盖率测量现在可用于所有商业版本中的分支和 PR。

https://github.com/exussum12/coverageChecker

此工具支持 Jacoco 格式,并且只会针对更改的行出错。

这是在 PHP 中编写的(因此您需要在 CI 服务器上安装 PHP)

如果您正常生成 Jacoco 报告,然后使用

git diff origin/master... > diff.txt

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

这将在更改的行覆盖率低于 80%(并显示遗漏行列表)的构建上失败,并通过任何大于 80% 的内容(如果适用,还会显示遗漏行列表)

如果您修改旧代码,此工具也会因缺少遗留覆盖而失败。 (您可能应该至少对要更改的代码进行 1 次测试)。这可能会减慢一些更改的速度,但您将获得所有修改区域的覆盖范围,这将使将来的事情变得更好