サーバー モード

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 サーバーと同じリポジトリからのプロトコルの種類とシリアル化コード。

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

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

C# 12 以降を使用します。 パッケージは、プロジェクトで言語バージョンが指定されていない場合に12.0LangVersionを設定します。 また、.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 プロトコル機能を介してこの設定を送信します。

こちらも参照ください