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 配置文件的完整示例:

<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,可以引入使用 usingAspire 进行测试所需的所有依赖项和默认 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,可以引入使用 usingPlaywright 进行测试所需的所有依赖项和默认 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 文件中处理版本更新,但需要手动更新项目文件中的版本

另请参阅