本文介绍 MSTest.Sdk 的高级配置选项。 有关基本设置和入门,请参阅使用 MSTest 入门。
重要
默认情况下,MSTest.Sdk 将 MSTest 运行程序与 MTP 配合使用,包括 dotnet 测试。 这需要修改 CI 和本地 CLI 调用,还会影响 .runsettings 的可用条目。 可以通过 切换到 VSTest 来保留旧的集成和工具。
MSTest.Sdk 默认将 EnableMSTestRunner 和 TestingPlatformDotnetTestSupport 设置为 true。 有关 dotnet 测试及其不同模式的详细信息,请参阅 使用 dotnet 测试进行测试。
测试实用工具帮助程序库
如果使用 MSTest.Sdk 的项目是一个用于测试的工具库,并且本身不包含任何可运行的测试,则该项目应具有 <IsTestApplication>false</IsTestApplication>。
选择跑步者
默认情况下,MSTest SDK 依赖于 MTP,但可以通过添加属性切换到 <UseVSTest>true</UseVSTest>。
扩展 MTP
可以通过一组 NuGet 包扩展自定义 MTP 体验。 为了简化和改进此体验,MSTest SDK 引入了两项功能:
Microsoft.Testing.Platform 配置文件
profiles的概念允许选择将默认配置和扩展集应用于您的测试项目。
可以使用 TestingExtensionsProfile 属性设置配置文件,并使用下面 3 个配置文件之一:
None- 未启用任何扩展。Default- 启用此版本的 MSTest.SDK 建议的扩展。 如果未显式设置属性,则这是默认值。启用以下扩展:
- 代码覆盖率
- Trx 报表
- Azure DevOps报告 (MSTest.Sdk 4.3.0+)
- GitHub Actions 报告(实验性和预发布版本,MSTest.Sdk 4.3.0+)
AllMicrosoft- 启用为广泛开箱即用而选择的 Microsoft 扩展,包括采用限制性许可证的扩展。 实验性扩展和仅限 API 的扩展仍可能需要显式启用。启用
Default配置文件中的所有扩展,以及以下扩展:在 MSTest.Sdk 版本 3.11.0 到 4.2.x 中,Azure DevOps报表扩展仅包含在其中
AllMicrosoft。
注意
配置文件引用了 Azure DevOps 报告包和 GitHub Actions 报告包,但在运行时,报告功能仍处于禁用状态。 传递--report-azdo以启用Azure DevOps报告。 若要启用 GitHub Actions 报告功能,请在 GitHub Actions 上运行测试并传递 --report-gh。
下面是使用 None 配置文件的完整示例:
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<TestingExtensionsProfile>None</TestingExtensionsProfile>
</PropertyGroup>
</Project>
| 扩展/配置文件 | 没有 | 违约 | AllMicrosoft |
|---|---|---|---|
| 代码覆盖率 | ✔️ | ✔️ | |
| 故障转储 | ✔️ | ||
| 仿品 | ✔️¹ | ||
| 挂起转储 | ✔️ | ||
| 热重载 | ✔️ | ||
| HTML 报表 | ✔️ | ||
| GitHub Actions 报告 | ✔️³ | ✔️³ | |
| 重试 | ✔️ | ||
| Trx | ✔️ | ✔️ | |
| Azure DevOps报表 | ✔️³ | ✔️² |
¹ MSTest.Sdk 3.7.0+ ¹ MSTest.Sdk 3.11.0+ ¹ MSTest.Sdk 4.3.0+
启用或禁用扩展
可以使用模式 Enable[NugetPackageNameWithoutDots] 的 MSBuild 属性启用和禁用扩展。
例如,若要启用故障转储扩展(NuGet 包Microsoft.Testing.Extensions.CrashDump),可以将以下属性EnableMicrosoftTestingExtensionsCrashDump设置为true。
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>
</Project>
有关所有可用扩展的列表,请参阅 MTP 功能。
某些 MTP 扩展仍需手动启用,且未包含在 AllMicrosoft 或 Default 配置文件中:
- 从 MSTest.Sdk 4.3 开始,设置
<EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>,然后传入--report-junit。 - 从 MSTest.Sdk 4.4 预览版开始,设置
<EnableMicrosoftTestingExtensionsCtrfReport>true</EnableMicrosoftTestingExtensionsCtrfReport>,然后传递--report-ctrf。 - 若要引用 OpenTelemetry 扩展,请设置
<EnableMicrosoftTestingExtensionsOpenTelemetry>true</EnableMicrosoftTestingExtensionsOpenTelemetry>。 由于扩展需要 API 配置,因此请根据 OpenTelemetry 中所述在自定义入口点中注册它。
这些扩展仅适用于 MTP。
警告
请务必查看每个扩展的许可条款,因为它们可能会有所不同。
启用和禁用的扩展与所选扩展配置文件提供的扩展合并在一起。
此属性模式可用于在隐式 Default 配置文件之上启用其他扩展(如前面的 CrashDumpExtension 示例所示)。
您还可以禁用所选配置文件的扩展。 例如,通过设置 MS Code Coverage 禁用 <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage> 扩展:
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
</PropertyGroup>
</Project>
在 MSTest.Sdk 4.3.0 及更高版本中,Default配置文件引用Azure DevOps报表和GitHub Actions报表包。 若要删除包引用,请设置 <EnableMicrosoftTestingExtensionsAzureDevOpsReport>false</EnableMicrosoftTestingExtensionsAzureDevOpsReport> 或 <EnableMicrosoftTestingExtensionsGitHubActionsReport>false</EnableMicrosoftTestingExtensionsGitHubActionsReport>。 如果保留了包引用,Azure DevOps 报告功能只有在传入 --report-azdo 时才会启动。 仅当您在 GitHub Actions 上运行测试并传递 --report-gh 时,GitHub Actions 报告功能才会开始生成。
功能
除了选择运行器和特定于运行器的扩展之外,MSTest.Sdk 还提供其他功能来简化和增强您的测试体验。
使用 Aspire 测试
Aspire 是一个规范明确的、云原生的技术栈,用于构建可观察的、生产就绪的分布式应用程序。 Aspire 是通过处理特定云原生问题的 NuGet 包集合传递的。 有关详细信息,请参阅 Aspire 文档。
注意
此功能可从 MSTest.Sdk 3.4.0 获取。
通过将属性 EnableAspireTesting 设置为 true,可以引入使用 using 和 Aspire 进行测试所需的所有依赖项和默认 MSTest 指令。
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnableAspireTesting>true</EnableAspireTesting>
</PropertyGroup>
</Project>
使用 Playwright 进行测试
Playwright 为现代网页应用提供可靠的端到端测试。 有关详细信息,请参阅官方 Playwright 文档。
注意
此功能可从 MSTest.Sdk 3.4.0 获取。
通过将属性 EnablePlaywright 设置为 true,可以引入使用 using 和 Playwright 进行测试所需的所有依赖项和默认 MSTest 指令。
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnablePlaywright>true</EnablePlaywright>
</PropertyGroup>
</Project>
迁移到 MSTest SDK
请考虑迁移到 MSTest SDK 所需的以下步骤。
更新您的项目
将现有 MSTest 测试项目迁移到 MSTest SDK 时,首先将测试项目顶部的 Sdk="Microsoft.NET.Sdk" 条目替换为 Sdk="MSTest.Sdk"
- Sdk="Microsoft.NET.Sdk"
+ Sdk="MSTest.Sdk"
将该版本添加到 global.json:
{
"msbuild-sdks": {
"MSTest.Sdk": "4.1.0"
}
}
然后,您可以开始简化您的项目。
删除默认属性:
- <EnableMSTestRunner>true</EnableMSTestRunner>
- <OutputType>Exe</OutputType>
- <IsPackable>false</IsPackable>
- <IsTestProject>true</IsTestProject>
删除默认包引用:
- <PackageReference Include="MSTest"
- <PackageReference Include="MSTest.TestFramework"
- <PackageReference Include="MSTest.TestAdapter"
- <PackageReference Include="MSTest.Analyzers"
- <PackageReference Include="Microsoft.NET.Test.Sdk"
最后,根据正在使用的扩展配置文件,还可以删除某些 Microsoft.Testing.Extensions.* 包。
更新 CI
更新项目后,如果使用 MTP(默认值),并且依赖于 dotnet test 运行测试,则必须更新 CI 配置。 有关详细信息以及指导您了解所有必需的更改的信息,请参阅 dotnet 测试集成。
如果您正在使用 dotnet test 的 VSTest 模式,以下是在 Azure DevOps 中使用 DotNetCoreCLI 任务时的更新示例:
默认的 MSTest.Sdk 扩展配置提供了新增选项所需的 Microsoft.Testing.Extensions.TrxReport 和 Microsoft.Testing.Extensions.CodeCoverage 包。 如果选择 None 配置文件,请先启用或引用这两个扩展,然后再使用这些选项。
\- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: '**/**.sln'
- arguments: '--configuration Release'
+ arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'
反射源生成器
重要
以下 MSTest 4.4 行为仅在预览版本中可用,直到 MSTest 4.4.0 发布。
MSTest 4.3 在独立版本的实验 MSTest.SourceGeneration 包中引入了反射源生成器。 从 MSTest 4.4 开始,包从实验状态毕业,并使用 MSTest 版本。
原生 AOT 项目会自动包含源生成器。 对于使用 MSTest.Sdk 的非 NativeAOT 项目,请通过 <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration> 启用。 MSTest.Sdk 通过 MSTestVersion 对齐 MSTest.SourceGeneration、MSTest.TestFramework 和 MSTest.TestAdapter 的版本。
SDK 还支持使用中央包管理的可重用测试库和项目中的源生成。 它提供与 MSTest.TestAdapter 匹配的运行时钩子,并生成所需的 PackageVersion 项。
.NET Standard 不支持这些运行时挂钩。 为.NET标准目标启用源生成时,SDK 将报告此错误:
.NET标准目标框架不支持 MSTest 源生成,因为所需的 MSTest.TestAdapter 运行时挂钩不可用。
源生成器会在编译时发现测试用例。 当生成器处于活动状态时,测试类必须直接声明 [TestClass] 而不是继承它。
MSTEST0069 分析器会标记那些依赖继承而来的 [TestClass] 的类。
从 MSTest 4.3.2 开始,对于已剪裁项目和原生 AOT 项目,MSTestSourceGenMode默认为ReflectionFree。 此模式在支持该测试形式时,会使用生成的元数据和调用程序。 在支持反射的运行时上,如果生成的条目不受支持或缺失,MSTest 将回退到反射。
从 MSTest 4.4 开始,无反射代码生成会生成完整的继承特性元数据,其中包括 AttributeUsage 和 AllowMultiple。 在 MTP 上,它可以绕过对纯同步 [TestMethod] 和 [DataRow] 方法的运行时发现和验证。 异步测试、自定义测试方法属性、DynamicData、自定义 ITestDataSource 实现以及存在歧义的测试形式都使用回退路径。 VSTest 还会保留其现有路径。
无反射模式报告以下诊断:
| ID | 不支持的测试图形 |
|---|---|
AOTSG0001 |
静态测试类 |
AOTSG0002 |
开放泛型测试类,包括嵌套在泛型类型中的类 |
AOTSG0003 |
生成的代码无法访问的类,包括文件局部类,或采用私有或私有受保护嵌套的类 |
AOTSG0004 |
泛型测试方法 |
AOTSG0005 |
使用 ref、 in或 out 参数进行测试方法 |
实验性功能
以下 MSTest 4.3 功能是 实验性的。 其公共 API 可能发生变化,并通过实验性诊断进行标示。 若要启用,请确认对应的诊断 ID。
使用 ITestFilter 以编程方式进行测试筛选
注意
MSTest 4.3.0(实验性)中引入。
通过 ITestFilter 注册的实验性 [TestFilterProviderAttribute] 扩展点允许您以编程方式在加载任何测试类之前决定是否运行每项测试。 这对于不能用命令行筛选器表示的自定义选择逻辑非常有用。
实现 ITestFilter.Filter(TestFilterContext) 在不加载测试类的情况下检查元数据:
public sealed class MyFilter : ITestFilter
{
public TestFilterResult Filter(TestFilterContext context) =>
context.DisplayName.Contains("Nightly", StringComparison.Ordinal)
? TestFilterResult.Run : TestFilterResult.Drop;
}
返回 TestFilterResult.Run 运行测试, Drop 省略它而不返回结果,或 Skip(reason) 报告跳过的结果。 MSTest 可以同时调用一个筛选器实例,因此实现必须线程安全。 命令行和测试资源管理器筛选器在 ITestFilter 之前运行,而 [Ignore] 则在之后进行求值。
从 MSTest 4.4 开始,.NET项目可以使用泛型类型安全注册表单[assembly: TestFilterProvider<MyFilter>]。 然后,编译器会确保 MyFilter 实现 ITestFilter,并且具有公共的无参数构造函数。 泛型属性不适用于 .NET Framework。 对于面向多个目标框架的项目,请使用目标框架预处理器符号选择泛型或非泛型形式。
#if NET
[assembly: TestFilterProvider<MyFilter>]
#else
[assembly: TestFilterProvider(typeof(MyFilter))]
#endif
从 MSTest 4.4 开始, MSTEST0081 分析器将完全验证非泛型注册表单。 对于泛型形式,它仍会报告泛型筛选器类型以及注册了多个提供程序的程序集。
TestRun.Current 和计划进行的测试
注意
MSTest 4.3.0(实验性)中引入。
实验性 TestRun.Current API(来自 RFC 014)公开有关当前运行的信息,包括计划运行的测试集合,因此扩展和测试环境可以检查计划执行的内容。
已知限制
NuGet 提供的 MSBuild SDK(包括 MSTest.Sdk)在更新其版本时具有限制工具支持,这意味着用于管理 NuGet 包的常规 NuGet 更新和Visual Studio UI 无法按预期工作。 需要在 global.json 文件和project文件中手动更新版本。 即使您使用 Dependabot 也会受到影响,因为存在问题dependabot-core#12824和dependabot-core#8615。