MSTest SDK 概述
MSTest.Sdk 是一个用于构建 MSTest 应用的 MSBuild 项目 SDK。 没有此 SDK 也可以构建 MSTest 应用,不过 MSTest SDK 应是:
- 旨在为使用 MSTest 进行测试提供一流的体验。
- 是大多数用户的理想之选。
- 易于为其他人配置。
MSTest SDK 使用 MSTest 运行程序发现和运行测试。
只需更新项目的 MSTest.Sdk
节点的 Sdk
属性,即可在项目中启用 Project
:
<Project Sdk="MSTest.Sdk/3.6.3">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<!-- references to the code to test -->
</Project>
注意
/3.6.3
作为示例提供,可以替换为任何较新版本。
为了简化版本的处理,我们建议使用 global.json 文件在解决方案级别设置 SDK 版本。 例如,项目文件将如下所示:
<Project Sdk="MSTest.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<!-- references to the code to test -->
</Project>
然后,在 MSTest.Sdk
文件中指定 版本,如下所示:
{
"msbuild-sdks": {
"MSTest.Sdk": "3.6.3"
}
}
有关详细信息,请参阅使用 MSBuild 项目 SDK。
执行 build
来构建项目时,会使用项目设置的标准 NuGet 工作流还原并安装所有必需的组件。
无需其他任何组件即可生成和运行测试,并且可使用dotnet test
所用的相同工具(例如 或 Visual Studio)。
重要
通过切换到 MSTest.Sdk
,可以选择使用 MSTest 运行程序,包括 dotnet 测试。 这需要修改 CI 和本地 CLI 调用,还会影响 .runsettings 的可用条目。 可以通过切换MSTest.Sdk
来使用 和保留旧的集成和工具。
选择运行器
默认情况下,MSTest SDK 依赖于 MSTest 运行程序,但您可以通过添加属性 来切换到 <UseVSTest>true</UseVSTest>
。
扩展 MSTest 运行器
可以通过一组 MSTest runner
自定义 体验。 为了简化和改进此体验,MSTest SDK 引入了两项功能:
MSTest 运行器配置文件
配置文件的概念支持你选择将应用于测试项目的默认配置和扩展集。
可以使用 TestingExtensionsProfile
属性设置配置文件,并使用下面 3 个配置文件之一:
None
- 未启用任何扩展。Default
- 启用此版本的 MSTest.SDK 建议的扩展。 如果未显式设置属性,则这是默认值。启用以下扩展:
AllMicrosoft
- 启用 Microsoft 提供的所有扩展(包括具有限制性许可证的扩展)。启用以下扩展:
下面是使用 None
配置文件的完整示例:
<Project Sdk="MSTest.Sdk/3.6.3">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TestingExtensionsProfile>None</TestingExtensionsProfile>
</PropertyGroup>
<!-- references to the code to test -->
</Project>
扩展/配置文件 | 没有 | 违约 | AllMicrosoft |
---|---|---|---|
代码覆盖率 | ✔️ | ✔️ | |
故障转储 | ✔️ | ||
Fakes | ✔️ (MSTest.Sdk 3.7.0+) | ||
挂起转储 | ✔️ | ||
热重载 | ✔️ | ||
重试 | ✔️ | ||
Trx | ✔️ | ✔️ |
启用或禁用扩展
可以使用模式 Enable[NugetPackageNameWithoutDots]
的 MSBuild 属性启用和禁用扩展。
例如,若要启用故障转储扩展(NuGet 包 Microsoft.Testing.Extensions.CrashDump),请使用以下 EnableMicrosoftTestingExtensionsCrashDump
属性,并将其设置为 true
:
<Project Sdk="MSTest.Sdk/3.6.3">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>
<!-- references to the code to test -->
</Project>
有关所有可用扩展的列表,请参阅 Microsoft.Testing.Platform 扩展。
警告
请务必查看每个扩展的许可条款,因为它们可能会有所不同。
启用和禁用的扩展与所选扩展配置文件提供的扩展合并在一起。
此属性模式可用于在隐式 Default
配置文件之上启用其他扩展(如前面的 CrashDumpExtension 示例所示)。
您还可以禁用所选配置文件的扩展。 例如,通过设置 MS Code Coverage
禁用 <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
扩展:
<Project Sdk="MSTest.Sdk/3.6.3">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
</PropertyGroup>
<!-- references to the code to test -->
</Project>
功能
除了选择运行程序和特定于运行程序的扩展之外,MSTest.Sdk
还提供其他功能来简化和增强测试体验。
使用 .NET Aspire 进行测试
.NET Aspire 是有主见的云就绪堆栈,用于生成可观察的、生产就绪的分散式应用程序。 .NET Aspire 通过处理特定云原生问题的 NuGet 包集合提供。 有关详细信息,请参阅 .NET Aspire 文档。
注意
此功能从 MSTest.Sdk 3.4.0 开始提供
通过将属性 EnableAspireTesting
设置为 true
,可以引入使用 using
和 Aspire
进行测试所需的所有依赖项和默认 MSTest
指令。
<Project Sdk="MSTest.Sdk/3.4.0">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableAspireTesting>true</EnableAspireTesting>
</PropertyGroup>
<!-- references to the code to test -->
</Project>
使用 Playwright 进行测试
Playwright 支持对新式 Web 应用进行可靠的端到端测试。 有关详细信息,请参阅官方 Playwright 家文档。
注意
此功能从 MSTest.Sdk 3.4.0 开始提供
通过将属性 EnablePlaywright
设置为 true
,可以引入使用 using
和 Playwright
进行测试所需的所有依赖项和默认 MSTest
指令。
<Project Sdk="MSTest.Sdk/3.4.0">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnablePlaywright>true</EnablePlaywright>
</PropertyGroup>
<!-- references to the code to test -->
</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": "3.6.3"
}
}
然后,就可以开始简化项目。
删除默认属性:
- <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
更新项目后,如果您正在使用 MSTest runner
(默认值)并且依赖 dotnet test
运行测试,则必须更新 CI 配置。 有关详细信息以及指导您了解所有必需的更改的信息,请参阅 dotnet 测试集成。
下面是在 Azure DevOps 中使用 DotNetCoreCLI
任务时的示例更新:
\- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: '**/**.sln'
- arguments: '--configuration Release'
+ arguments: '--configuration Release -p:TestingPlatformCommandLineArguments="--report-trx --results-directory $(Agent.TempDirectory) --coverage"'
已知限制
NuGet 提供的 MSBuild SDK(包括 MSTest.Sdk)在更新其版本方面具有有限的工具支持,这意味着用于管理 NuGet 包的常规 NuGet 更新和 Visual Studio UI 无法按预期工作。 如需更多详细信息,请参阅此问题:NuGet#13127。
注意
此限制不仅限于 MSTest SDK,而是适用于任何 NuGet 提供的 MSBuild SDK。
Dependabot 将在 global.json
文件中处理版本更新,但需要手动更新项目文件中的版本。