新代码行的代码覆盖质量关卡
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 状态)
作为(有点痛苦但可能自动化的)解决方法:
- 在分支拆分之前通过对 master 的分析为分支添加一个额外的 SQ 项目。
- 使用
sonar.version
值“master”*。这建立了你的泄漏基线
- 一定要使用
sonar.branch
分析属性来区别于你的master分析
- 配置分支项目的泄漏周期为
since_previous_version
- 更新您的分支项目分析作业以指向分支并将
sonar.version
重置为“分支”*
- 在合并前建立一个检查分支 QG 状态的流程
- 删除分支后删除分支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 次测试)。这可能会减慢一些更改的速度,但您将获得所有修改区域的覆盖范围,这将使将来的事情变得更好
对于 Java 应用程序,有没有人对如何构建质量门有任何建议,以防止合并没有至少 80% 代码覆盖率的新代码?我们正在使用遗留代码库,虽然我们希望看到那里的覆盖率有所提高,但我们希望停止流血并对未来的新代码强制执行适当的测试覆盖率。
我看到过有关将 git blame 和 exclusions/inclusions 列表与 SonarQube 或 JaCoCo 结合使用的建议,但是这会报告整个 class 的覆盖范围,而不仅仅是new/changed 行,因此我们可以 运行 解决由于缺少遗留覆盖而导致合并受阻的问题。
您正在寻找的是新代码的覆盖率,它包含在默认质量门中,要求达到 80%。
不幸的是,由于您希望阻止将 低覆盖率分支合并到主分支中,这意味着您需要进行稳健的分支分析。它在计划中,但我们还没有。此外,PR 分析(在处理分支机构时总是第一个候选人)也无济于事,因为 a) 它不查看覆盖范围 b) 它不检查分支机构的质量门状态(技术上没有 QG PR 状态)
作为(有点痛苦但可能自动化的)解决方法:
- 在分支拆分之前通过对 master 的分析为分支添加一个额外的 SQ 项目。
- 使用
sonar.version
值“master”*。这建立了你的泄漏基线 - 一定要使用
sonar.branch
分析属性来区别于你的master分析
- 配置分支项目的泄漏周期为
since_previous_version
- 更新您的分支项目分析作业以指向分支并将
sonar.version
重置为“分支”* - 在合并前建立一个检查分支 QG 状态的流程
- 删除分支后删除分支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 次测试)。这可能会减慢一些更改的速度,但您将获得所有修改区域的覆盖范围,这将使将来的事情变得更好