サーバー モード

MTP サーバー モードを使用すると、エディター、IDE、またはその他のテスト ツールがテスト アプリケーションを起動し、JSON-RPC を介して検出と実行を実行できます。 MTP を中心にツールを構築する場合は、サーバー モードを使用します。 通常のコマンド ラインと CI の実行では、テスト アプリケーションを直接実行するか、 dotnet testを使用します。

--serverまたは--server jsonrpcでパブリック JSON-RPC サーバーを起動します。

Important

.NET SDK は、--server dotnettestcliを介して個別の内部バイナリ プロトコルを使用します。 その値を自分で渡さないでください。 dotnet test は、トランスポートとプロトコルの引数を構成します。

ソースのみのクライアントを使用する

MTP 2.4 は、正規の JSON-RPC クライアントを提供します。 Microsoft.Testing.Platform.ServerMode.Client.Sources パッケージを追加します。 パッケージは、ランタイム アセンブリを追加する代わりに、C# ソースをプロジェクトに挿入します。

ソースのみの設計では、次の機能が提供されます。

  • ランタイム DLL または追加のデプロイ依存関係はありません。
  • Native AOT 対応の、リフレクションを使用しないシリアル化。
  • MTP サーバーと同じリポジトリからのプロトコルの種類とシリアル化コード。

挿入された MtpServerClient、 IMtpServerClient、プロトコルの種類は、接続の初期化、テストの検出、テストの実行、サーバーの終了の要求、テスト ノードの更新の報告を行うことができます。 挿入されたすべての型は、それを使用するアセンブリに対しては internal のままです。

クライアント要件を満たす

C# 12 以降を使用します。 パッケージは、プロジェクトで言語バージョンが指定されていない場合に12.0にLangVersionを設定します。 また、.NET Framework 4.6.2 および netstandard2.0 の内部互換性の種類も提供します。

内部型が重複しないようにパッケージを追加する前に、MTP クライアントの手書きコピーを削除します。

起動モデルを選択する

外部プロセスとしてテスト アプリケーションを開始するには、 MtpServerClient.LaunchAsyncを使用します。 クライアントはその子プロセスを管理し、必要に応じてteardown時にそのプロセスを終了します。

Process.Startを使用できない埋め込みホストまたは UI スレッド環境の場合は、MtpServerClient.LaunchInProcessAsyncを使用します。 このメソッドは、現在のプロセスの非同期コールバックを介してテスト アプリケーションを実行します。 コールバックとクライアントがプロセスを共有するため、起動スレッドをブロックしないでください。

どちらの起動モデルもループバック TCP トランスポートを使用します。 Browser WebAssembly は必要なリスナーを作成できないため、インプロセス起動では PlatformNotSupportedExceptionがスローされます。 インプロセス起動では、代替の WebAssembly トランスポートは提供されません。

クライアントをシャットダウンする

呼び出し元のスレッドをブロックせずにクライアントと起動されたアプリケーションを破棄するには、 IMtpServerClient.ShutdownAsync()を呼び出します。 非同期メソッドは、埋め込みホストでの UI スレッドの応答性とデッドロックの問題を回避します。

インプロセス ホストの場合、MtpServerClientOptions.ServerShutdownTimeout は、クライアントがトランスポートを閉じた後、終了処理が待機する時間を制御します。 既定値は 30 秒です。 シャットダウン後に ServerExitCode を読み取り、コールバックの終了コードを取得します。 値は、アプリケーションの実行中、または終了コードを返す代わりにアプリケーションが失敗した場合に null のままです。

接続の動作を選択する

MtpServerClientOptions.IsStatefulを設定して、クライアントが要求間で状態を保持するかどうかをサーバーに通知します。

  • 単一の検出または実行要求の後に終了するには、値を false のままにします。
  • 同じ接続を介して複数の要求を送信するエディターまたは IDE セッションの値を true に設定します。

クライアントは、試験的な capabilities.testing.isStateful プロトコル機能を介してこの設定を送信します。

プロトコルの互換性をネゴシエートする

MTP 2.4 以降では、サーバー モード プロトコル ネゴシエーションは MTP NuGet パッケージ バージョンから独立しています。 クライアントは、サポートされているプロトコル バージョンを宣言し、サーバーは共通のバージョンを選択します。 サポートされているバージョンが重複していない場合、テスト アプリケーションは互換性のないワイヤ コントラクトを続行するのではなく、 ProtocolError 終了コード (12) で終了します。

メッセージを検証するには、バージョン管理された サーバー モード 1.0 JSON スキーマ を使用します。 System.Text.Json シリアライザーと Jsonite シリアライザーは、同じスキーマとエラー エンベロープに従います。

こちらも参照ください