代码覆盖率

小窍门

使用 Microsoft.Testing.Platform.MSBuild (由 MSTest、NUnit 和 xUnit 运行程序以可传递方式包含)时,安装其 NuGet 包时,会自动注册代码覆盖率扩展 ,无需更改代码。

你可以使用 Microsoft.Testing.Platform (MTP) 的代码覆盖率功能,来确定正在由编码的测试(例如单元测试)进行测试的项目代码的比例。 若要有效防止 Bug,测试应作用于或覆盖你的大部分代码。

Microsoft 代码覆盖率

Microsoft 代码覆盖分析可用于托管代码(CLR)和非托管代码(原生)。 支持静态和动态仪器。 此扩展需要 Microsoft.Testing.Extensions.CodeCoverage NuGet 包。

注释

默认情况下,扩展中禁用非托管(本机)代码覆盖率。 根据需要使用标志 EnableStaticNativeInstrumentationEnableDynamicNativeInstrumentation 启用它。 有关非托管代码覆盖率的详细信息,请参阅静态和动态本机检测

重要

该包随附Microsoft.NET库闭源免费使用许可模型。

有关Microsoft代码覆盖率的详细信息,请参阅其 GitHub 页面

选项

Option Description
--coverage 使用 dotnet-coverage 工具收集代码覆盖率。
--coverage-output 生成的覆盖文件的名称或路径。 默认情况下,该文件名为TestResults/<guid>.coverage
--coverage-output-format 输出文件格式。 支持的值为:coveragexmlcobertura。 默认值为 coverage
--coverage-settings XML 代码覆盖率设置

有关可用选项的详细信息,请参阅 settingssamples

注释

Microsoft.Testing.Extensions.CodeCoverage 中的默认值为IncludeTestAssembly,而在 VSTest 中曾是false。 这意味着默认排除测试项目。 有关详细信息,请参阅 代码覆盖率配置

版本兼容性

下表显示了 Microsoft.Testing.Extensions.CodeCoverage 不同版本与 MTP 之间的兼容性。

Microsoft.Testing.Extensions.CodeCoverage 媒体传输协议 (MTP)
18.1.x 2.0.x
18.0.x 1.8.x
17.14.x 1.6.2

注释

为了获得最佳兼容性和最新功能,建议同时使用这两个包的最新版本。

Coverlet

Coverlet Microsoft 测试平台集成 (coverlet.MTP) 是 MTP 的本机扩展,可实现 coverlet.collector 功能。

coverlet.MTP NuGet 包添加到测试项目中:

dotnet add package coverlet.MTP

若要收集代码覆盖率,请使用 --coverlet 标志运行测试:

dotnet test --coverlet

或者使用--coverlet标志运行你的测试可执行文件:

dotnet exec <test-assembly.dll> --coverlet

测试运行后, coverage.json 会在当前目录中生成包含结果的文件。

选项

Option Description
--coverlet 启用代码覆盖率数据收集。
--coverlet-output-format <format> 覆盖报表的输出格式。 支持的格式:json、、lcovopencovercoberturateamcity。 多次指定可包含多种格式。
--coverlet-include <filter> 包括与筛选器匹配的程序集,例如 [Assembly]Type。 指定多次添加更多筛选器。
--coverlet-include-directory <path> 包含用于源文件的附加目录。 指定多次以添加更多目录。
--coverlet-exclude <filter> 排除与筛选器匹配的程序集,例如 [Assembly]Type。 指定多次添加更多筛选器。
--coverlet-exclude-by-file <pattern> 排除与 glob 模式匹配的源文件。 多次指定可添加更多模式。
--coverlet-exclude-by-attribute <attribute> 排除使用特定属性修饰的方法或类。 指定多次以添加更多属性。
--coverlet-include-test-assembly 在覆盖率报告中包括测试程序集。
--coverlet-single-hit 将代码中每个位置的命中次数限制为一个。
--coverlet-skip-auto-props 在覆盖率中跳过自动实现的属性。
--coverlet-does-not-return-attribute <attribute> 将方法标记为不返回的属性。 指定多次以添加更多属性。
--coverlet-exclude-assemblies-without-sources <value> 排除没有源代码的程序集。 值: MissingAllMissingAnyNone

有关详细信息,请参阅 coverlet。MTP 文档