【问题标题】:Code Coverage Quality Gates for New Lines of Code新代码行的代码覆盖质量门
【发布时间】:2017-12-02 04:10:29
【问题描述】:

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

我已经看到有关将 git blame 和排除/包含列表与 SonarQube 或 JaCoCo 结合使用的建议,但是这将报告整个课程的覆盖范围,而不仅仅是新的/更改的行,因此我们可能会遇到问题由于缺乏遗留覆盖,合并被阻止。

【问题讨论】:

  • “防止合并新代码”:我个人的看法是你不应该这样做。在某些情况下,达到覆盖目标是没有意义的。强制要求只会浪费精力,对质量没有任何积极影响。

标签: java sonarqube code-coverage jacoco


【解决方案1】:

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

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

作为一种(虽然可能是自动化的有点痛苦)解决方法:

  1. 为分支添加一个额外的 SQ 项目,并在分支拆分之前对 master 进行分析。
  • 使用 sonar.version 值“master”*。这将建立您的泄漏基线
  • 请务必使用sonar.branch 分析属性将其与您的主分析区分开来。
  1. 配置分支项目的泄露周期为since_previous_version
  2. 更新您的分支项目分析作业以指向分支并将sonar.version 重置为“分支”*
  3. 在合并前建立一个流程来检查分支 QG 状态
  4. 删除分支后删除分支SQ项目

*或者任何让你开心的价值

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

编辑 21June21 现在,所有商业版本的分支机构和 PR 都可以测量新代码的覆盖率。

【讨论】:

  • 我知道 SonarQube 可以在单个项目/分支上执行此操作,但是除非新代码 > 80% 或其他任意数字,否则我们如何防止合并到 master?我不确定 SonarQube 能否为我们提供这种能力,我们希望采取预防方法来保持我们的质量门通过,而不是允许某人合并新代码,只是在我们的主分支构建后失败。我们正在寻找的基本上是将 master 的 HEAD 与 feature 分支的 HEAD 进行比较,然后对 delta 执行 % 覆盖率。
  • 查看我的第二次尝试@dforrest。
  • 感谢您提供有关解决方法的信息。这是有道理的,但不幸的是,这会给我们的构建过程增加很多时间,所以我不确定它的可行性。新的“强大的分支分析”功能正在提供什么样的支持?这个用例是否正在考虑?如果是这样,您是否有下一个具有增强分支分析支持的 LTS 版本的时间表?
  • “正在筹备中”?没有。下一个 LTS(2017 年 10 月)将没有它。之后的应该。 “什么样的支持?”仍然未定义,但我们确实计划它是“强大的”。
  • 我认为强制新代码的覆盖率大于 X% 无论如何都是一个有缺陷的概念。当每个人都在添加主要是全新代码的新功能时,它可能看起来很有效,但是如果您的团队中有一个开发人员定期修复警告,那么看到只命中一两行的 PR 是很常见的,我们已经看到许多情况下,Sonar 在这种情况下表现得不太明智。 (例如,您进行的两个单行修复会导致重复代码检查。或者您所做的单行修复会导致条件覆盖检查,即使它没有触及任何实际代码行。)
【解决方案2】:

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 次测试)。这可能会减慢一些更改,但您将覆盖所有修改区域,这将使未来的事情变得更好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2011-02-26
    • 2012-06-30
    相关资源
    最近更新 更多