Microsoft.Testing.Platform (MTP) を使用して、UWP および WinUI 3 アプリケーション内で MSTest テストを実行します。 アプリケーションはテスト ホストとして機能し、UI スレッドとプロセスの有効期間を所有します。
Important
この記事で説明する完全なWindows アプリケーション サポート マトリックスは、MSTest 4.5 および MTP 2.5 で入手できます。 安定バージョンがリリースされるまでは、一致する 4.5 および 2.5 プレビュー パッケージを使用します。 MTP パッケージを直接管理する場合は、プラットフォームと拡張機能パッケージのバージョンを揃えておきます。
アプリケーション モデルを選択する
MSTest.Sdk では、MTP を介して次のWindowsアプリケーション モデルがサポートされています。
| アプリケーション モデル | パッケージ化と信頼 | ホストの起動をテストする | コマンドを実行 |
|---|---|---|---|
従来の UWP (uap10.0) |
パッケージ化された AppContainer | 完全信頼サイドカーによってパッケージが登録され、アプリケーション ユーザー モデル ID (AUMID) によってアプリがアクティブ化されます。 |
MSBuild
InvokeTestingPlatform ターゲットを使用する |
モダン UWP (.NET 10 と UseUwp) |
パッケージ化された AppContainer | 完全信頼サイドカーによってパッケージが登録され、AUMID によってアプリがアクティブ化されます。 |
MSBuild
InvokeTestingPlatform ターゲットを使用する |
| パッケージ化された WinUI 3 | パッケージ化された完全信頼 | 完全信頼サイドカーによってパッケージが登録され、AUMID によってアプリがアクティブ化されます。 |
dotnet run または dotnet test --project |
| パッケージ化されていない WinUI 3 | パッケージ ID なし、完全信頼 | MTP は、アプリの実行可能ファイルを直接起動します。 |
dotnet run または dotnet test --project |
WinUI 3 packagedClassicApp と TrustLevel="appContainer" |
パッケージ化された AppContainer | フル トラストのサイドカーは、アプリをアクティブ化し、MTP 通信パイプ上でその正確なパッケージ セキュリティ識別子 (SID) を許可します。 |
dotnet msbuild
InvokeTestingPlatform ターゲットを使用する |
パッケージ化とサンドボックス化は別々の選択肢です。 パッケージ化された WinUI 3 デスクトップ アプリにはパッケージ ID がありますが、既定では完全信頼プロセスとして実行されます。 UWP アプリは常に AppContainer で実行されます。 パッケージ化された WinUI 3 アプリは、マニフェストが TrustLevel="appContainer"設定されている場合にのみ AppContainer で実行されます。
以前のバージョンの MSTest または MTP の場合は、UWP プロジェクトの既存の VSTest 構成をそのまま使用してください。 UWP ホストと AppContainer ホストのネイティブ MTP 実行には、MSTest 4.5 と MTP 2.5 が必要です。
MTP アプリ モデル サイドカーを理解する
パッケージ 化されたアプリの場合、最初のテスト ツール プロセスをパッケージ内で実行することはできません。 MSTest.Sdk は、次の機能を備える完全信頼サイドカー コントローラーを起動します。
- コマンド ライン引数を準備し、キャンセル、再試行、レポート、終了コード処理を所有します。
- ビルド出力パッケージを登録し、AUMID によって正確なマニフェスト アプリケーションをアクティブにします。
- AppContainer ホストが MTP 名前付きパイプに接続するときに、選択したパッケージ SID のみを承認します。
- パッケージ所有のストレージから、TRX、ダンプ、診断、および再試行のアーティファクトを復元します。
テスト アプリケーションは、独自のプロセスで MTP と MSTest を引き続きホストします。 UWP の実行には、Microsoft.NET.Test.Sdk、vstest.console、UwpTestHostRuntimeProvider、またはVisual Studio展開ランタイムは必要ありません。
UWP windowsAppの場合、Windowsは通常のプロセス引数ではなく、LaunchActivatedEventArgs.Argumentsを介して 1 つのアクティブ化文字列を提供します。 MTP ビルダーを作成する前に、 PackagedAppExtensions.GetTestApplicationArguments を呼び出します。 packaged-app 拡張機能は、元の引数配列とコントローラー接続メタデータを復元します。
WinUI 3 packagedClassicApp (AppContainer で実行するものも含む) の場合は、通常のプロセス引数を使用します。
前提条件を満たす
プロジェクトに適用される前提条件を使用します。
- MSTest 4.5 ツールチェーンと
dotnet test --projectには、.NET SDK 10 以降を使用します。 - UWP の場合は、ユニバーサル Windows プラットフォーム ワークロードと必要な Windows SDK でVisual Studioからデスクトップ MSBuild を使用します。 これらのコンポーネントは、ビルド時のサポートのみを提供します。
- WinUI 3 の場合は、Windows アプリケーション開発ツールをインストールし、互換性のあるWindows アプリ SDKバージョンを参照します。
- パッケージ化されたテスト アプリの場合は、Windows が署名されていないビルド出力レイアウトを登録できるように、Windows の開発者モードを有効にするか、サイドローディングを構成します。
- AppContainer テスト アプリの場合は、管理者特権以外のユーザーとしてコントローラーを実行します。
UWP テストを構成する
モダン UWP プロジェクトを構成する
MSTest.Sdk 4.5 以降を使用し、Windows プラットフォーム バージョン.NET 10 をターゲットにして、UseUwpを true に設定します。 既存の UWP XAML、MSIX、アーキテクチャ、ネイティブ AOT の設定を維持します。
Visual Studio通常、ビルド中にUseUwpToolsを有効にします。 MSTest.Sdk は、 UseUwpTools が trueされている場合、または UseUwp が true され、 UseUwpTools がまだ設定されていない場合に、UWP アプリケーション モデルを選択します。
UWP 以外の MTP テスト アプリケーションで UWP 参照のみが必要な場合は、 UseUwpTools を false に設定します。 その後、別のパッケージ化されたアプリケーション モデルでサイドカーが必要な場合を除き、SDK は直接 MTP ランナーを使用します。
完全なプロジェクトについては、最新の UWP MTP サンプルを参照してください。
クラシック UWP プロジェクトを構成する
既存の uap10.0 プロジェクト図形、デスクトップ MSBuild ツールチェーン、UWP 拡張機能 SDK を保持します。 MSTest.Sdk 4.5 以降をインポートし、MSTest ランナーと MTP を有効にします。 MSTest.Sdk には、UAP 互換のブートストラップ、アダプター、ランタイムアセットが用意されています。
完全なプロジェクトについては、従来の UWP MTP サンプルを参照してください。
UWP テストを実行する
Visual Studio用の開発者用 PowerShell を開きます。 具体的なアーキテクチャ用のソリューションを構築し、MTP を呼び出します。
msbuild UwpTests.sln /restore /p:Configuration=Release /p:Platform=x64
msbuild UwpTests.csproj /t:InvokeTestingPlatform /p:Configuration=Release /p:Platform=x64 /p:TestingPlatformCommandLineArguments="--report-trx"
2 番目のコマンドは、パッケージを登録し、AUMID によってアプリをアクティブ化し、通常のテストと UI スレッド テストを実行し、パッケージ ストレージから結果成果物をコピーして、テスト実行終了コードを返します。
WinUI 3 テストを構成する
MSTest.Sdk 4.5 以降を使用し、UseWinUIをtrueに設定し、Windows固有のターゲット フレームワークをターゲットにします。 パッケージ化されたライセンス認証の場合は、プラットフォーム バージョン 10.0.19041.0 以降Windows使用します。
WinUI アプリケーションから MTP をホストする
セルフホステッド WinUI テスト アプリの場合は、 OnLaunchedでテスト ウィンドウを作成してアクティブ化し、そのディスパッチャー キューを発行します。
_window = new UnitTestAppWindow();
_window.Activate();
UITestMethodAttribute.DispatcherQueue = _window.DispatcherQueue;
生成された MTP ヘルパーを実行し、その結果を Environment.ExitCodeに割り当て、ウィンドウを閉じて、 Exitを呼び出します。
Environment.ExitCode = await MicrosoftTestingPlatformApplication.RunAsync(
Environment.GetCommandLineArgs()[1..]);
WinUI オブジェクトを作成またはアクセスするテストには、 UITestMethod を使用します。 UI スレッドを必要としないテストには、 TestMethod を使用します。
Warning
セルフホステッド WinUI テスト アプリに [assembly: WinUITestTarget(...)] を追加しないでください。 この属性は、別のテスト ホストの WinUI アプリケーションを起動しますが、セルフホステッド アプリは既に Application.Start を呼び出しています。
パッケージ化されていないアプリを構成する
WindowsPackageType を None に設定します。 アプリには MSIX ID または AppxManifest.xmlがないため、MTP は実行可能ファイルを直接起動します。 packaged-app 拡張機能を手動で追加しないでください。
Windows アプリ SDKは、通常、プロジェクトが次の条件を満たすときにブートストラップ初期化子を挿入します。
-
WindowsPackageTypeはNoneです。 -
OutputTypeがExeまたはWinExe。 -
WindowsAppSDKSelfContainedはtrueではありません。
Windows アプリ SDK アプリではないホストがテスト ライブラリを読み込む場合は、ライブラリで WindowsAppSdkBootstrapInitialize を true に設定します。
VSTest では、WinUI プロバイダーに AppX マニフェストが必要なため、パッケージ化されていない WinUI 3 テスト アプリはサポートされていません。
完全なプロジェクトについては、 パッケージ化されていない WinUI MTP サンプルを参照してください。
パッケージ化された完全信頼アプリを構成する
既定のパッケージ化された WinUI 構成とその Package.appxmanifestのままにします。 MSTest.Sdk は、パッケージ化されたプロジェクトの Microsoft.Testing.Extensions.PackagedApp を自動的に参照して登録します。
AddPackagedAppDeploymentも呼び出さないでください。 MTP 実行で登録できるテスト ホストランチャーは 1 つだけです。 カスタム ランチャーがパッケージ化されたアクティブ化を所有している場合にのみ、 EnableMicrosoftTestingExtensionsPackagedApp を false に設定します。
完全なプロジェクトについては、 パッケージ化された WinUI MTP サンプルを参照してください。
AppContainer アプリを構成する
WinUI パッケージ マニフェストで、アプリケーションを packagedClassicApp として構成し、 TrustLevel="appContainer"設定します。 MTP 2.5 は、コントローラーと拡張パイプの正確なパッケージ SID を承認します。
ALL APPLICATION PACKAGESを付与したり、ループバックの除外を必要としたりすることはありません。
サイドカーを管理者権限なしで実行します。 サイドカーがパッケージ LocalStateから要求された結果ディレクトリに結果と診断をコピーできるように、InvokeTestingPlatform ターゲットを使用します。
完全なプロジェクトについては、 AppContainer WinUI MTP サンプルを参照してください。
WinUI 3 テストを実行する
具体的なアーキテクチャを構築します。 パッケージ化されたフル トラスト アプリ、またはパッケージ化されていないアプリの場合は、次を実行します。
dotnet build -p:Platform=x64
dotnet test --project . --no-build -p:Platform=x64
dotnet run --no-build -p:Platform=x64 を使用することもできます。
AppContainer WinUI アプリの場合は、サイドカー ターゲットと絶対結果ディレクトリを使用します。
dotnet msbuild .\WinUITests.csproj -t:InvokeTestingPlatform -p:Platform=x64 "-p:TestingPlatformCommandLineArguments=--report-trx --results-directory C:\TestResults"
WinUI アプリには dotnet exec を使用しないでください。 WinUI は、プロセス パスに対する PRI リソースを解決します。
設定のトラブルシューティング
| 症状: | 確認 |
|---|---|
アプリは、 Application.Startへの複数の呼び出しを報告します。 |
セルフホステッド WinUI テスト アプリから WinUITestTarget 属性を削除します。 |
| テストの実行は完了しますが、プロセスは開いたままです。 | MTP の実行が完了したら、テスト ウィンドウを閉じて Exit を呼び出します。 |
失敗したテストでは、プロセス終了コード 0が返されます。 |
MTP 実行結果を Environment.ExitCodeに割り当てます。 |
パッケージ化されていない WinUI 実行では、不足している AppxManifest.xmlが報告されます。 |
プロジェクトで VSTest の代わりに MTP が使用されていることを確認します。 |
| パッケージ化された実行では、アプリを登録またはアクティブ化できません。 | Windows のターゲット フレームワーク、開発者モードまたはサイドローディング ポリシー、アーキテクチャ、およびマニフェスト内の実行可能ファイル エントリを確認してください。 |
| AppContainer ホストはコントローラーに接続できません。 | MSTest 4.5 および MTP 2.5 以降を使用し、管理者特権以外でコントローラーを実行します。 |
| AppContainer レポートは、要求されたディレクトリにコピーされません。 |
InvokeTestingPlatformを使用し、絶対結果ディレクトリを指定します。 |
こちらも参照ください
.NET