MTP 服务器模式允许编辑器、IDE 或其他测试工具启动测试应用程序,并通过 JSON-RPC 推动发现和执行。 在围绕 MTP 生成工具时使用服务器模式。 对于正常的命令行和 CI 运行,请直接运行测试应用程序或使用 dotnet test。
使用 --server jsonrpc 或 --server 启动公共 JSON-RPC 服务器。
Important
.NET SDK 通过 --server dotnettestcli 使用单独的内部二进制协议。 不要自行传递该值。
dotnet test 配置传输和协议参数。
使用仅限源的客户端
MTP 2.4 提供规范 JSON-RPC 客户端。 添加Microsoft。Testing.Platform.ServerMode.Client.Sources 包。 包将 C# 源注入项目,而不是添加运行时程序集。
仅源端设计提供:
- 没有运行时 DLL 或其他部署依赖项。
- 兼容原生 AOT、无需反射的序列化。
- 与 MTP 服务器相同的存储库中的协议类型和序列化代码。
注入的 MtpServerClient、IMtpServerClient 和协议类型可以初始化连接、执行测试发现、运行测试、请求服务器退出,并报告测试节点的更新。 对于使用方程序集,所有注入的类型仍保持 internal。
满足客户端要求
使用 C# 12 或更高版本。 该包遵循项目的语言版本设置。 如果目标框架默认为较早的 C# 版本,则将LangVersion设置为12.0或更高版本。 该包还提供 .NET Framework 4.6.2 和netstandard2.0的内部兼容性类型。
在添加包之前删除 MTP 客户端的任何手动写入副本,以避免重复的内部类型。
选择启动模型
若要将测试应用程序作为外部进程启动,请使用 MtpServerClient.LaunchAsync。 客户端负责管理该子进程,并在需要时于清理阶段将其终止。
对于无法使用 Process.Start的嵌入式主机或 UI 线程环境,请使用 MtpServerClient.LaunchInProcessAsync。 该方法通过当前进程中的异步回调运行测试应用程序。 不要阻止启动线程,因为回调和客户端共享进程。
两个启动模型都使用环回 TCP 传输。 浏览器中的 WebAssembly 无法创建所需的监听器,因此进程内启动会引发 PlatformNotSupportedException。 进程内启动不提供替代性的 WebAssembly 传输方式。
关闭客户端
若要拆解客户端并启动应用程序而不阻止调用线程,请调用 IMtpServerClient.ShutdownAsync()。 异步方法可避免嵌入式主机中的 UI 线程响应性和死锁问题。
对于进程内主机,MtpServerClientOptions.ServerShutdownTimeout 控制在客户端关闭传输后,拆除操作等待多长时间。 默认为 30 秒。 在关闭后读取 ServerExitCode 以获取回调的退出代码。 当应用程序运行时或应用程序失败而不是返回退出代码时,该值保持不变 null 。
声明客户端有状态
从 MTP 2.4.1 开始,设置可为 null 的 MtpServerClientOptions.IsStateful 选项以描述客户端如何使用测试节点更新:
| Value | 声明 |
|---|---|
true |
客户端保留会话的可寻址测试节点集,并保持每个节点的最后已知状态,直到后续更新将其更改,就像 IDE 测试资源管理器可能做的那样。 |
false |
客户端使用更新而不保留该测试节点状态。 |
null(默认值) |
客户端不声明该能力。 初始化握手省略字段。 |
客户端通过实验 capabilities.testing.isStateful 协议功能发送显式布尔值。 有状态性独立于连接生命周期以及服务器的 MultiRequestSupport 功能。 客户端不会仅仅因为通过同一连接发送多个请求而变得有状态。
MTP 2.4.0 使用默认值为 false 的非 null 布尔选项。 若要保留未声明的功能,请使用 MTP 2.4.1 或更高版本。
在框架或扩展内,使用实验性的 IClientInfo 服务 来检查声明。 读取 clientInfo.Capabilities.IsStateful 以获取保守的布尔结果,即当功能未声明时为 false。 在 MTP 2.4.1 或更高版本中, ClientCapabilitiesExtensions.GetIsStateful() 保留未声明、显式无状态和有状态客户端之间的区别。
协商协议兼容性
从 MTP 2.4 开始,服务器模式协议协商独立于 MTP NuGet 包版本。 客户端声明它支持的协议版本,服务器选择一个通用版本。 当没有共同支持的版本时,测试应用程序会以 ProtocolError 退出代码 (12) 退出,而不是继续使用不兼容的通信协议约定。
使用带版本号的 server-mode 1.0 JSON 架构 来验证消息。 System.Text.Json 和 Jsonite 序列化程序遵循相同的架构和错误信封。