MSTest.Sdk 是用于生成 MSTest 应用的 MSBuild 项目 SDK 。 没有此 SDK 也可以构建 MSTest 应用,不过 MSTest SDK 应是:
- 旨在为使用 MSTest 进行测试提供一流的体验。
- 大多数用户的推荐目标。
- 易于为其他人配置。
默认情况下,MSTest SDK 使用 适用于 Microsoft.Testing.Platform 的 MSTest 运行程序发现并运行测试。 可以通过指定 <UseVSTest>true</UseVSTest> 切换到使用 VSTest
只需更新项目的 MSTest.Sdk 节点的 Sdk 属性,即可在项目中启用 Project:
<Project Sdk="MSTest.Sdk/3.10.2">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
</Project>
注意
/3.10.2 作为示例提供,可以替换为任何较新版本。
为了简化版本的处理,我们建议使用 global.json 文件在解决方案级别设置 SDK 版本。 例如,项目文件将如下所示:
<Project Sdk="MSTest.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
</Project>
然后,在 MSTest.Sdk 文件中指定 版本,如下所示:
{
"msbuild-sdks": {
"MSTest.Sdk": "3.10.2"
}
}
有关详细信息,请参阅使用 MSBuild 项目 SDK。
执行 build 来构建项目时,会使用项目设置的标准 NuGet 工作流还原并安装所有必需的组件。
无需其他任何组件即可生成和运行测试,并且可以使用与“经典”MSTest项目相同的工具(例如 dotnet test 或 Visual Studio)。
重要
通过切换到 MSTest.Sdk,您选择使用 MSTest 运行程序(启用适用于 MSTest 的 Microsoft.Testing.Platform),包括与 dotnet test 一起使用。 这需要修改 CI 和本地 CLI 调用,还会影响 .runsettings 的可用条目。 可以通过切换MSTest.Sdk来使用 和保留旧的集成和工具。
默认情况下,MSTest.Sdk 设置 EnableMSTestRunner 并 TestingPlatformDotnetTestSupport 设置为 true。 有关 dotnet 测试及其运行 Microsoft.Testing.Platform 的不同模式的详细信息,请参阅 使用 dotnet 测试进行测试。
测试实用工具帮助程序库
如果使用 MSTest.Sdk 的项目旨在成为测试实用工具帮助程序库,并且本身不包含任何可运行的测试,则项目应具有 <IsTestApplication>false</IsTestApplication>。
选择跑步者
默认情况下,MSTest SDK 依赖于 Microsoft.Testing.Platform,但可以通过添加属性 切换到 <UseVSTest>true</UseVSTest>。
扩展 Microsoft.Testing.Platform
可以通过一组 Microsoft.Testing.Platform自定义 体验。 为了简化和改进此体验,MSTest SDK 引入了两项功能:
Microsoft.Testing.Platform 配置文件
配置模板的概念允许你选择将应用于你的测试项目的默认配置和扩展集。
可以使用 TestingExtensionsProfile 属性设置配置文件,并使用下面 3 个配置文件之一:
None- 未启用任何扩展。Default- 启用此版本的 MSTest.SDK 建议的扩展。 如果未显式设置属性,则这是默认值。启用以下扩展:
AllMicrosoft- 启用 Microsoft 提供的所有扩展(包括具有限制性许可证的扩展)。启用以下扩展:
下面是使用 None 配置文件的完整示例:
<Project Sdk="MSTest.Sdk/3.10.2">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TestingExtensionsProfile>None</TestingExtensionsProfile>
</PropertyGroup>
</Project>
| 扩展/配置文件 | 没有 | 违约 | AllMicrosoft |
|---|---|---|---|
| 代码覆盖率 | ✔️ | ✔️ | |
| 故障转储 | ✔️ | ||
| 假货 | ✔️ (MSTest.Sdk 3.7.0+) | ||
| 挂起转储 | ✔️ | ||
| 热重载 | ✔️ | ||
| 重试 | ✔️ | ||
| Trx | ✔️ | ✔️ |
启用或禁用扩展
可以使用模式 Enable[NugetPackageNameWithoutDots] 的 MSBuild 属性启用和禁用扩展。
例如,若要启用故障转储扩展(NuGet 包 Microsoft.Testing.Extensions.CrashDump),请使用以下 EnableMicrosoftTestingExtensionsCrashDump 属性,并将其设置为 true:
<Project Sdk="MSTest.Sdk/3.10.2">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>
</Project>
有关所有可用扩展的列表,请参阅 Microsoft.Testing.Platform 扩展。
警告
请务必查看每个扩展的许可条款,因为它们可能会有所不同。
启用和禁用的扩展与所选扩展配置文件提供的扩展合并在一起。
此属性模式可用于在隐式 Default 配置文件之上启用其他扩展(如前面的 CrashDumpExtension 示例所示)。
您还可以禁用所选配置文件的扩展。 例如,通过设置 MS Code Coverage 禁用 <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage> 扩展:
<Project Sdk="MSTest.Sdk/3.10.2">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
</PropertyGroup>
</Project>
功能
除了选择运行器和特定于运行器的扩展之外,MSTest.Sdk 还提供其他功能来简化和增强您的测试体验。
使用 Aspire 进行测试
Aspire 是一个有明确意见的、云端友好的堆栈,用于构建可观察的、已准备生产的分布式应用程序。 Aspire 通过处理特定云原生问题的 NuGet 包集合提供。 有关详细信息,请参阅 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>
</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>
</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.10.2"
}
}
然后,就可以开始简化项目。
删除默认属性:
- <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
更新项目后,如果您正在使用 Microsoft.Testing.Platform(默认值)并且依赖 dotnet test 运行测试,则必须更新 CI 配置。 有关详细信息以及指导您了解所有必需的更改的信息,请参阅 dotnet 测试集成。
如果正在使用 dotnet test 的 VSTest 模式,以下是在 Azure DevOps 中使用 DotNetCoreCLI 任务时的示例更新:
\- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: '**/**.sln'
- arguments: '--configuration Release'
+ arguments: '--configuration Release -- --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 文件中处理版本更新,但需要手动更新项目文件中的版本。