伺服器模式

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 開始,設定 nullable MtpServerClientOptions.IsStateful 選項以描述用戶端如何處理測試節點更新:

Value 聲明
true 用戶端會保留工作階段的一組可尋址測試節點,並保留每個節點最後已知的狀態,直到另一個更新改變該狀態為止,就像 IDE 測試總管一樣。
false 用戶端在不保留測試節點狀態的情況下接收更新。
null (預設值) 客戶端未宣告這項能力。 初始化握手(initialize handshake)省略了欄位。

客戶端透過實驗 capabilities.testing.isStateful 協定功能傳送明確的布林值。 狀態性與連線壽命及伺服器 MultiRequestSupport 能力無關。 客戶端不會因為在同一連線上發送多個請求而變得有狀態。

MTP 2.4.0 使用一個不可空的布林值選項,預設值為 false。 若要保留未申報的能力,請使用 MTP 2.4.1 或更新版本。

在框架或擴充功能中,使用實驗 IClientInfo 服務 檢查宣告。 請閱讀 clientInfo.Capabilities.IsStateful 以取得保守的布林結果,當該能力尚未宣告時,結果為 false。 在 MTP 2.4.1 或更新版本中,ClientCapabilitiesExtensions.GetIsStateful() 保留了未宣告、明確無狀態及有狀態客戶端之間的區別。

協商協定相容性

從 MTP 2.4 起,伺服器模式協定協商獨立於 MTP NuGet 套件版本。 用戶端宣告其支援的協定版本,伺服器則選擇一個共用版本。 當沒有支援的版本重疊時,測試應用程式會以 ProtocolError 退出碼12()退出,而非繼續使用不相容的有線合約。

使用版本化 伺服器模式 1.0 JSON 架構 來驗證訊息。 System.Text.Json 與 Jsonite 序列化器遵循相同的結構與錯誤包絡。

參見