拉取请求的代码覆盖率

Azure DevOps Services

代码覆盖率是一个重要的质量指标,可帮助你度量项目的受测代码百分比。 为了确保项目的质量随着时间的推移不断提高(或至少不退步),必须对系统中的新代码进行良好的测试。 当开发人员提出拉取请求时,了解他们的变更是否已被测试覆盖率,有助于在变更合并到目标分支之前堵住测试漏洞。 存储库所有者可能还希望设置一些策略,以防止合并大量未经测试的更改。

完整覆盖率和差异覆盖率

完全覆盖率是指对项目的整个代码库进行覆盖率测量。 但是,在拉取请求的情况下,开发人员关注的是他们所做的更改,并想知道他们添加或更改的特定代码行是否被包含在内。 这种类型的覆盖率是差异覆盖率

先决条件

要获取拉取请求的覆盖率指标,首先请配置一个用于验证拉取请求的管道。 在此管道中,配置用来收集代码覆盖率指标的测试工具。 然后必须将覆盖率结果发布到服务器进行报告。

要详细了解如何为所选语言收集和发布代码覆盖率结果,请参阅生态系统部分。 例如,收集和发布 .NET Core 应用的代码覆盖率。

注意

虽然可以使用 Azure Pipelines 收集和发布许多不同语言的代码覆盖率结果,但本文档中所述的拉取请求代码覆盖率功能目前仅适用于使用 Visual Studio 代码覆盖率结果格式(文件扩展名为 .coverage)的 .NET 和 .NET Core 项目。 我们会在将来的里程碑中添加对其他语言和覆盖率格式的支持。

覆盖率状态、详细信息和指示符

一旦配置了收集和发布代码覆盖率的管道,它就会在创建拉取请求时发布代码覆盖率状态。 默认情况下,服务器会检查测试是否覆盖了至少 70% 的更改行。 可将差异覆盖率阈值目标更改为你选择的值。 有关详细信息,请参阅本文中的设置配置部分

显示覆盖率状态检查的屏幕截图。

状态检查将评估拉取请求中所有代码文件的差异覆盖率值。 如果你要查看每个文件的差异覆盖率值,可以按照配置部分中所述打开详细信息。 打开详细信息会将详细信息作为拉取请求中的注释发布。

显示覆盖率详细信息注释的屏幕截图。

在拉取请求的已更改文件视图中,已更改的行还用覆盖率指示符做了批注,以显示这些行是否覆盖在测试范围内。

显示覆盖率指示符的屏幕截图。

注意

虽然可以从 Azure Pipelines 支持的各种版本控制系统生成代码,但本文档中所述的拉取请求代码覆盖率功能目前仅适用于 Azure Repos。

配置覆盖率设置

如果你要更改拉取请求的代码覆盖率体验的默认设置,必须在存储库的根目录中包含一个名为 azurepipelines-coverage.yml 的 YAML 配置文件。 在此文件中设置所需的值,在管道下次运行时将自动使用这些值。

可更改的设置包括:

设置 说明 默认 允许的值
status 指示是否应在拉取请求中发布代码覆盖率状态检查。
关闭后不会发布任何覆盖率检查,覆盖率注释也不会出现在已更改文件视图中。
on on, off
目标 必须满足差异覆盖率的目标阈值才能成功发布覆盖率状态。 70% 所需百分比数字
comments 指示是否应在拉取请求中发布包含每个代码文件的覆盖率详细信息的注释 关闭 on, off

示例配置:

coverage:
  status:           # Code coverage status will be posted to pull requests based on targets defined below.
    comments: on    # Off by default. When on, details about coverage for each file changed will be posted as a pull request comment. 
    diff:           # Diff coverage is code coverage only for the lines changed in a pull request.
      target: 60%   # Set this to a desired percentage. Default is 70 percent

代码覆盖率 YAML 示例存储库中可以找到更多示例和详细信息。

注意

无论是否打开拉取请求注释详细信息,覆盖率指示符都会在已更改文件视图中亮起。

提示

覆盖率设置 YAML 不同于 YAML 管道。 这是因为覆盖率设置适用于存储库,并且无论哪个管道生成代码,都会使用这些设置。 这种隔离还意味着,如果你使用基于经典设计器的生成管道,则会应用拉取请求的代码覆盖率状态检查。

使用代码覆盖率策略保护分支

拉取请求的代码覆盖率状态检查只是给开发人员的一个建议,并不能阻止代码覆盖率低的拉取请求合并到目标分支。 要防止开发人员合并不符合覆盖率阈值的更改,必须使用覆盖率状态检查配置分支策略。

提示

从管道发布的代码覆盖率状态遵循命名约定 {name-of-your-pipeline/codecoverage}

注意

Azure Repos 中的分支策略(甚至是可选策略)会阻止拉取请求在失败时自动完成。 此行为并非特定于代码覆盖率策略。

从 2023 年 9 月开始,如果生成失败,代码覆盖率策略将不会重写为 Failed。 所有客户均可使用此功能

常见问题解答

哪些覆盖率工具和结果格式可用于验证拉取请求中的代码覆盖率?

拉取请求的代码覆盖率功能目前仅适用于 Visual Studio Code 覆盖率、.coverage、格式。 如果使用 Visual Studio 测试任务、dotnet 核心任务的测试动词和发布测试结果任务的 TRX 选项发布代码覆盖率,则可使用它。 我们会在将来的里程碑中添加对其他覆盖率工具和结果格式的支持。

如果在提出拉取请求时触发了多个管道,覆盖率是否会在各管道间合并?

如果在提出拉取请求时触发了多个管道,代码覆盖率就不会合并。 该功能目前仅适用于收集和发布拉取请求代码覆盖率的单个管道。 如果需要跨管道合并覆盖率数据,请在开发人员社区上提交功能请求。

帮助和支持