服务器模式

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 或更高版本。 当你的项目未指定语言版本时,该包会将 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 。

选择连接行为

设置 MtpServerClientOptions.IsStateful,以告知服务器客户端是否在请求之间保持状态:

  • 将该值保留为 false,用于单次发现或执行请求,然后退出。
  • 将值设置为 true 用于通过同一连接发送多个请求的编辑器或 IDE 会话。

客户端通过实验 capabilities.testing.isStateful 协议功能发送此设置。

协商协议兼容性

从 MTP 2.4 开始,服务器模式协议协商独立于 MTP NuGet 包版本。 客户端声明它支持的协议版本,服务器选择一个通用版本。 当没有共同支持的版本时,测试应用程序会以 ProtocolError 退出代码 (12) 退出,而不是继续使用不兼容的通信协议约定。

使用带版本号的 server-mode 1.0 JSON 架构 来验证消息。 System.Text.Json 和 Jsonite 序列化程序遵循相同的架构和错误信封。

另见