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 序列化器遵循相同的結構與錯誤包絡。