Microsoft.Testing.Platform 概述

Microsoft.Testing.Platform 是 VSTest 的轻型可移植替代项,用于在所有上下文(持续集成 (CI) 管道、CLI、Visual Studio 测试资源管理器和 VS Code 文本资源管理器等)中运行测试。 Microsoft.Testing.Platform 直接嵌入到 MSTest 测试项目中,并且不存在任何其他应用依赖项(例如运行测试所需的 vstest.consoledotnet test)。

Microsoft.Testing.Platform 为开源项目。 可以在 microsoft/testfx GitHub 存储库中找到 Microsoft.Testing.Platform 代码。

Microsoft.Testing.Platform 支柱

这个新的测试平台基于 .NET 开发人员体验测试团队的经验构建,旨在解决自 2016 年 .NET Core 发布以来遇到的挑战。 虽然 .NET Framework 与 .NET Core/.NET 之间具有很高的兼容性,但插件系统等一些关键功能以及 .NET 编译的新可能外形规格使得开发或完全支持具有当前 VSTest 平台 体系结构的新运行时功能变得复杂。

新测试平台演变的主要驱动因素如下所述:

  • 确定性:确保在不同的上下文(本地,CI)中运行相同的测试将产生相同的结果。 新运行时不依赖于反射或任何其他动态 .NET 运行时功能来协调测试运行。

  • 运行时透明度:测试运行时不会干扰测试框架代码,也不会创建独立AppDomainAssemblyLoadContext上下文,也不会使用反射或自定义程序集解析程序。

  • 扩展的编译时注册:扩展(如测试框架和进程外扩展)在编译期间注册,以确保确定性并有助于检测不一致。

  • 零依赖项:平台的核心是单个 .NET 程序集, Microsoft.Testing.Platform.dll该程序集没有受支持的运行时以外的依赖项。

  • 承载:测试运行时可以托管在任何 .NET 应用程序中。 虽然控制台应用程序通常用于运行测试,但可以在任何类型的 .NET 应用程序中创建测试应用程序。 这样,就可以在特殊上下文(例如设备或浏览器)中运行测试,在这些上下文中可能存在限制。

  • 支持所有 .NET 外形规格:支持当前和将来的 .NET 外形规格,包括本机 AOT。

  • 性能:查找功能与扩展点之间的正确平衡,以避免使用非基本代码膨胀运行时。 新的测试平台旨在“协调”测试运行,而不是提供有关如何执行此操作的实现详细信息。

  • 可扩展:新平台基于扩展点构建,允许对运行时执行进行最大自定义。 它允许你配置测试进程主机、观察测试过程,并使用测试主机进程中测试框架中的信息。

  • 单模块部署:可承载性功能支持单个模块部署模型,其中单个编译结果可用于支持进程外和进程内的所有扩展点,而无需交付不同的可执行模块。

受支持的测试框架

  • 项目。 在 MSTest 中,Microsoft.Testing.Platform 支持是通过 MSTest 运行程序实现的。
  • NUnit。 在 NUnit 中,Microsoft.Testing.Platform 支持是通过 NUnit 运行程序实现的。
  • xUnit.net:在 xUnit.net 中,Microsoft.Testing.Platform 支持是通过 xUnit.net 运行器实现的。
  • TUnit:完全构建在 Microsoft.Testing.Platform 顶部,有关详细信息,请参阅 TUnit 文档

运行和调试测试

系统会以可直接运行(或调试)的可执行文件的形式生成 Microsoft.Testing.Platform 测试项目。 没有额外的测试运行控制台或命令。 如果出现错误,应用会退出并显示非零退出代码,这与大多数可执行文件的典型情况相同。 有关已知退出代码的详细信息,请参阅 Microsoft.Testing.Platform 退出代码

重要

默认情况下,Microsoft.Testing.Platform 会收集遥测数据。 有关选择退出的详细信息和选项,请参阅 Microsoft.Testing.Platform 遥测

使用 dotnet publish 发布测试项目并直接运行应用是运行测试的另一种方法。 例如,执行 ./Contoso.MyTests.exe。 在某些情况下,也可以使用 dotnet build 生成可执行文件,但可能需要考虑极端情况,例如本机 AOT

使用 dotnet run

dotnet run 命令可用于生成和运行测试项目。 这是运行测试的最简单方法,尽管有时速度最慢。 在本地编辑和运行测试时,使用 dotnet run 是可行的,因为它可确保在需要时重新生成测试项目。 dotnet run 还将在当前文件夹中自动查找项目。

dotnet run --project Contoso.MyTests

有关 dotnet run 的详细信息,请参阅 dotnet run

使用 dotnet exec

dotnet execdotnet 命令用于执行(或运行)已生成的测试项目,这是直接运行应用程序的替代方法。 dotnet exec 需要已生成的测试项目 dll 的路径。

dotnet exec Contoso.MyTests.dll

dotnet Contoso.MyTests.dll

注意

提供测试项目可执行文件(*.exe)的路径导致错误:

Error:
  An assembly specified in the application dependencies manifest
  (Contoso.MyTests.deps.json) has already been found but with a different
  file extension:
    package: 'Contoso.MyTests', version: '1.0.0'
    path: 'Contoso.MyTests.dll'
    previously found assembly: 'S:\t\Contoso.MyTests\bin\Debug\net8.0\Contoso.MyTests.exe'

有关 dotnet exec 的详细信息,请参阅 dotnet exec

使用 dotnet test

Microsoft.Testing.Platform 提供包含 vstest.console.exedotnet test 的兼容性层,以确保可以在启用新执行方案时像以前一样运行测试。

dotnet test Contoso.MyTests.dll

选项

下面的列表仅描述了平台选项。 若要查看每个扩展提供的特定选项,请参阅扩展文档页或使用 --help 选项。

  • --diagnostic

启用诊断日志记录。 默认日志级别为 Trace。 该文件以名称格式 log_[MMddHHssfff].diag 写入到输出目录中。

  • --diagnostic-filelogger-synchronouswrite

强制内置的文件记录器以同步方式写入日志。 对于在进程崩溃时不想丢失任何日志条目的场景非常有用。 这会降低测试执行速度。

  • --diagnostic-output-directory

诊断日志记录的输出目录,如果未指定,则会在默认的 TestResults 目录中生成该文件。

  • --diagnostic-output-fileprefix

日志文件名的前缀。 默认为 "log_"

  • --diagnostic-verbosity

当使用 --diagnostic 开关时定义详细程度级别。 可用值包括 TraceDebugInformationWarningErrorCritical

  • --help

打印出有关如何使用命令的说明。

  • -ignore-exit-code

允许忽略一些非零退出代码,并转而返回为 0。 有关详细信息,请参阅忽略特定的退出代码

  • --info

显示有关 .NET 测试应用程序的高级信息,例如:

  • 平台。
  • 环境。
  • 每个已注册的命令行提供程序,例如其 nameversiondescriptionoptions
  • 每个已注册的工具,例如其 commandnameversiondescription,以及所有命令行提供程序。

此功能用于了解将注册相同命令行选项的扩展,或扩展(或平台)的多个版本之间可用选项的更改。

  • --list-tests

列出可用的测试。 不会执行测试。

  • --minimum-expected-tests

指定预期要运行的最小测试数。 默认情况下,至少要运行一个测试。

  • --results-directory

用于放置测试结果的目录。 如果指定的目录不存在,则会创建该目录。 默认为 TestResults,位于包含测试应用程序的目录中。

MSBuild 集成

NuGet 包 Microsoft.Testing.Platform.MSBuildMicrosoft.Testing.Platform 提供与 MSBuild 的各种集成:

  • 支持 dotnet test。 有关详细信息,请参阅 dotnet 测试集成
  • Visual StudioVisual Studio Code 测试资源管理器需要支持 ProjectCapability
  • 自动生成入口点(Main 方法)。
  • 自动生成配置文件。

注意

此集成以可传递的方式工作(引用其他引用此包的项目的项目的行为类似引用该包),并且可以通过 IsTestingPlatformApplication MSBuild 属性禁用。

另请参阅