这些扩展将 Microsoft.Testing.Platform (MTP) 与你的应用程序已在使用的 Microsoft.Extensions.* 库衔接起来,因此平台和扩展组件会通过与其余代码相同的基础结构进行传递。 每个扩展都需要额外的 NuGet 包,如每个部分所述。
小窍门
使用 Microsoft.Testing.Platform.MSBuild 时,日志记录包会通过生成的入口点自动注册。 配置包需要实例 IConfiguration ,并且托管包需要 TestingPlatformHostFactory 或自定义入口点,因此请遵循其注册部分。
日志记录桥接
日志桥接器会将 Microsoft.Testing.Platform 诊断日志转发到 ILogger,这样平台和扩展日志都会通过你的应用程序已在使用的同一 Microsoft.Extensions.Logging 管道流转。 无需编写自定义 MTP 记录器提供程序,即可重复使用现有的日志记录堆栈(控制台、调试、Serilog、Application Insights、OpenTelemetry 或自定义 ILoggerProvider )。 此扩展需要Microsoft。Testing.Extensions.Logging NuGet 包。
注释
从版本 2.3.0 开始,MTP 中可用。 此扩展是实验性的,其选项和输出格式可能会在将来的版本中更改。
仅在启用了平台的诊断日志记录功能时,桥接器才会转发每条消息。 当平台的有效日志级别为 None 时(默认情况下都是如此,除非传递 --diagnostic),配置委托不会被调用,也不会创建日志记录器工厂。 你在 ILoggingBuilder 中设置的分类筛选器可以缩小平台的有效诊断级别,但不能提高该级别。
手动注册
var builder = await TestApplication.CreateBuilderAsync(args);
builder.AddMicrosoftExtensionsLogging(logging => logging.AddConsole());
配置快照
实验性的 Microsoft.Testing.Extensions.Configuration 包会向 MTP 的配置管道中添加一个应用程序拥有的 IConfiguration 的只读快照。
在生成测试应用程序之前注册配置:
var builder = await TestApplication.CreateBuilderAsync(args);
builder.AddMicrosoftExtensionsConfigurationSnapshot(configuration);
默认情况下,快照使用顺序 2。 MTP 命令行值(顺序)和环境变量(顺序01)优先,而快照优先于 testconfig.json (顺序3)。 当应用程序需要另一个优先级时传递不同的顺序。
当 BuildAsync 构建配置管道时,MTP 会读取快照。 以后的更改和重新加载通知不会传播。 调用方保留配置的所有权,分层键保留标准 : 分隔符,注册仅适用于当前进程。 实时配置对象不会跨入单独启动的控制器或测试主机进程。
主机集成
实验性 Microsoft.Testing.Extensions.Hosting 软件包在应用程序拥有的 IHost 中运行 MTP。 主机仍然是组合根,并负责管理其服务提供程序、配置、日志记录、OpenTelemetry 提供程序、生命周期和释放。
对于生成的入口点,将 TestingPlatformHostFactory 设置为一个完全限定的静态方法,该方法返回一个全新且尚未启动的 Task<IHost>:
<TestingPlatformHostFactory>Contoso.Tests.TestHost.CreateHost</TestingPlatformHostFactory>
当主机拥有 OpenTelemetry 提供程序且测试项目引用了 Microsoft.Testing.Extensions.OpenTelemetry 时,将 TestingPlatformOpenTelemetryMode 设置为 HostOwned。 生成的入口点会创建并释放主机,保留自行注册的扩展,并对命令行 --help 和 --info 绕过工厂。
如果使用自定义入口点,请在主机上调用 RunTestingPlatformAsync,并通过其回调来注册测试框架。 该方法导入配置快照,将 MTP 诊断信息转发到主机的 ILoggerFactory,在 MTP 之前启动主机,将主机和调用方的取消操作关联到 MTP,返回 MTP 的退出代码,并在 finally 块中停止主机。 调用方仍会释放主机。
使标准输出不受主机启动、关闭、日志记录和导出程序消息的影响,因为 MTP 将其用于计算机可读模式,例如 --list-tests json,JSON-RPC 服务器模式和 dotnet test 协议。 此外,应避免在主机工厂中使用与进程重启扩展一起使用的独占性全局资源,因为在重试、故障转储或挂起转储等场景中,控制器进程和子进程都可能调用该工厂。
Important
配置和托管 API 使用 TPEXP 诊断 ID,在将来的版本中可能会更改。 它们可在 MTP 2.5 预览版包中使用。