Microsoft.Testing.Platform 和 VSTest 比较

Microsoft.Testing.Platform 是运行测试的轻量且可移植的替代方案,可用于命令行、持续集成(CI)管道、Visual Studio 测试资源管理器和 Visual Studio Code 中,以替代 VSTest。 在本文中,你将了解 MSTest 运行程序与 VSTest 之间的主要区别。

测试执行的差异

根据运行器的不同,测试以不同的方式执行。

执行 VSTest 测试

VSTest 附带 Visual Studio、.NET SDK,并作为 Microsoft.TestPlatform NuGet 包中的独立工具提供。 VSTest 使用一个名为 vstest.console.exe的测试运行程序来运行测试,该程序可以直接使用或通过 dotnet test使用。

执行 Microsoft.Testing.Platform 测试

Microsoft.Testing.Platform 直接嵌入到测试项目中,不会提供任何额外的可执行文件。 运行你的项目可执行文件时,你的测试将运行。 有关运行 Microsoft.Testing.Platform 测试的详细信息,请参阅 Microsoft.Testing.Platform 概述:运行和调试测试

命名空间和 NuGet 包

为了熟悉 Microsoft.Testing.Platform 和 VSTest,了解这两个工具使用的命名空间和 NuGet 包非常有帮助。

VSTest 命名空间

VSTest 是一组测试工具,也称为 测试平台。 VSTest 源代码是开源的,可在 microsoft/vstest GitHub 存储库中使用。 该代码使用 Microsoft.TestPlatform.* 命名空间。

VSTest 可扩展,常见类型放置在 Microsoft.TestPlatform.ObjectModel NuGet 包中。

Microsoft.Testing.Platform 命名空间

Microsoft.Testing.Platform 基于 Microsoft.Testing.* 命名空间中的 Microsoft.Testing.Platform NuGet 包和其他库。 与 VSTest 一样,Microsoft.Testing.Platform 是开源的,并且具有 microsoft/testfx GitHub 存储库。

通信协议

注意

Visual Studio 测试资源管理器支持自 17.12 起的 Microsoft.Testing.Platform 协议。 如果使用早期版本的 Visual Studio 运行/调试测试,测试资源管理器将使用 vstest.console.exe 和旧协议来运行这些测试。

Microsoft.Testing.Platform 使用基于 JSON-RPC 的协议在 Visual Studio 与测试运行程序进程之间进行通信。 协议记录在 MSTest GitHub 存储库

VSTest 还使用基于 JSON 的通信协议,但不是基于 JSON-RPC 的。

禁用新协议

若要在测试资源管理器中禁用新协议的使用,可以编辑项目以添加以下属性:<DisableTestingPlatformServerCapability>true</DisableTestingPlatformServerCapability>

还可以转到 Visual Studio 中的“预览功能”选项,然后取消选择“使用测试平台服务器模式”选项。

可执行文件

VSTest 提供多个可执行文件,尤其是 vstest.console.exetesthost.exedatacollector.exe。 但是,MSTest 直接嵌入到测试项目中,不会交付任何其他可执行文件。 测试项目编译到的可执行文件用于托管所有测试工具并执行运行测试所需的所有任务。

从 VSTest 迁移

除了特定于测试框架的步骤外,还需要更新测试基础结构以适应 Microsoft.Testing.Platform

dotnet test

dotnet test 的命令行选项分为 2 个类别:生成相关参数并测试相关参数。

生成相关参数将传递给 dotnet build 命令,因此无需为新平台更新这些参数。 下面列出了与构建相关的参数:

  • -a|--arch <ARCHITECTURE>
  • --artifacts-path <ARTIFACTS_DIR>
  • -c|--configuration <CONFIGURATION>
  • -f|--framework <FRAMEWORK>
  • -e|--environment <NAME="VALUE">
  • --interactive
  • --no-build
  • --nologo
  • --no-restore
  • -o|--output <OUTPUT_DIRECTORY>
  • --os <OS>
  • -r|--runtime <RUNTIME_IDENTIFIER>
  • -v|--verbosity <LEVEL>

测试相关参数特定于 VSTest,因此需要转换以匹配新平台。 下表显示了 VSTest 参数与新平台之间的映射:

VSTest 参数 新平台参数
--test-adapter-path <ADAPTER_PATH> 不支持
--blame 不支持
--blame-crash --crashdump 需要故障转储扩展
--blame-crash-dump-type <DUMP_TYPE> --crashdump-type 需要故障转储扩展
--blame-crash-collect-always 不支持
--blame-hang --hangdump 需要挂起转储扩展
--blame-hang-dump-type <DUMP_TYPE> --hangdump-type 需要挂起转储扩展
--blame-hang-timeout <TIMESPAN> --hangdump-timeout 需要挂起转储扩展
--collect <DATA_COLLECTOR_NAME> 取决于数据收集器
-d\|--diag <LOG_FILE> --diagnostic
--filter <EXPRESSION> 取决于所选的测试框架
-l\|--logger <LOGGER> 取决于记录器
--results-directory <RESULTS_DIR> --results-directory <RESULTS_DIR>
-s\|--settings <SETTINGS_FILE> 取决于所选的测试框架
-t\|--list-tests --list-tests
-- <RunSettings arguments> 不支持

重要

在指定任何 Microsoft.Testing.Platform 参数之前,需要添加 -- 以将 dotnet test 参数与新的平台参数分开。 例如,dotnet test --no-build -- --list-tests

vstest.console.exe

如果直接使用 vstest.console.exe,建议将其替换为 dotnet test 命令。

测试资源管理器

使用 Visual Studio 或 Visual Studio Code 测试资源管理器时,可能需要启用对新测试平台的支持。

Visual Studio

Visual Studio 测试资源管理器支持从版本 17.14 开始的新测试平台。 如果使用早期版本,可能需要将 Visual Studio 更新到最新版本。

Visual Studio Code

Visual Studio Code 测试资源管理器支持从版本 X 开始的新测试平台。

Azure DevOps

使用 Azure DevOps 任务时,可能需要更新管道以使用新的测试平台。

VSTest 任务

如果在 Azure DevOps 中使用 VSTest 任务,则可以将其替换为 .NET Core 任务

.NET Core 任务

如果使用 .NET Core 任务,则无需更改。