Microsoft.Testing.Platform 概述
Microsoft.Testing.Platform 是 VSTest 的轻型可移植替代项,用于在所有上下文(持续集成 (CI) 管道、CLI、Visual Studio 测试资源管理器和 VS Code 文本资源管理器等)中运行测试。 Microsoft.Testing.Platform 直接嵌入到 MSTest 测试项目中,并且不存在任何其他应用依赖项(例如运行测试所需的 vstest.console
或 dotnet 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 运行时功能来协调测试运行。
运行时透明度:测试运行时不会干扰测试框架代码,也不会创建独立
AppDomain
AssemblyLoadContext
上下文,也不会使用反射或自定义程序集解析程序。扩展的编译时注册:扩展(如测试框架和进程外扩展)在编译期间注册,以确保确定性并有助于检测不一致。
零依赖项:平台的核心是单个 .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 exec
或 dotnet
命令用于执行(或运行)已生成的测试项目,这是直接运行应用程序的替代方法。 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.exe
和 dotnet 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
开关时定义详细程度级别。 可用值包括 Trace
、Debug
、Information
、Warning
、Error
和 Critical
。
--help
打印出有关如何使用命令的说明。
-ignore-exit-code
允许忽略一些非零退出代码,并转而返回为 0
。 有关详细信息,请参阅忽略特定的退出代码。
--info
显示有关 .NET 测试应用程序的高级信息,例如:
- 平台。
- 环境。
- 每个已注册的命令行提供程序,例如其
name
、version
、description
和options
。 - 每个已注册的工具,例如其
command
、name
、version
和description
,以及所有命令行提供程序。
此功能用于了解将注册相同命令行选项的扩展,或扩展(或平台)的多个版本之间可用选项的更改。
--list-tests
列出可用的测试。 不会执行测试。
--minimum-expected-tests
指定预期要运行的最小测试数。 默认情况下,至少要运行一个测试。
--results-directory
用于放置测试结果的目录。 如果指定的目录不存在,则会创建该目录。 默认为 TestResults
,位于包含测试应用程序的目录中。
MSBuild 集成
NuGet 包 Microsoft.Testing.Platform.MSBuild 为 Microsoft.Testing.Platform
提供与 MSBuild 的各种集成:
- 支持
dotnet test
。 有关详细信息,请参阅 dotnet 测试集成。 Visual Studio
和Visual Studio Code
测试资源管理器需要支持ProjectCapability
。- 自动生成入口点(
Main
方法)。 - 自动生成配置文件。
注意
此集成以可传递的方式工作(引用其他引用此包的项目的项目的行为类似引用该包),并且可以通过 IsTestingPlatformApplication
MSBuild 属性禁用。