使用 MSTest 和 Microsoft.Testing.Platform 測試 UWP 與 WinUI 3 應用程式

用 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) 封裝式應用程式容器 全信任側車會註冊套件,並依應用程式使用者模型識別碼(AUMID)啟動應用程式。 MSBuild搭配InvokeTestingPlatform目標
新式 UWP(.NET 10 搭配 UseUwp) 封裝式應用程式容器 一個完全信任的側車會註冊包裹,並由 AUMID 啟動應用程式。 MSBuild與InvokeTestingPlatform目標
封裝版 WinUI 3 封裝式全信任 具完整信任權限的 sidecar 會註冊套件,並透過 AUMID 啟動應用程式。 dotnet run 或 dotnet test --project
未封裝的 WinUI 3 沒有套件識別,完整信任 MTP 會直接啟動應用程式執行檔。 dotnet run 或 dotnet test --project
WinUI 3 packagedClassicApp 與 TrustLevel="appContainer" 封裝式應用程式容器 一個完全信任的副車會啟動應用程式,並在 MTP 通訊管道上授權其精確的套件安全識別碼(SID)。 dotnet msbuild使用 InvokeTestingPlatform 目標

包裝和沙盒是分開的選擇。 打包的 WinUI 3 桌面應用程式有套件身份,但預設以全信任程序執行。 UWP 應用程式總是在 AppContainer 中執行。 一個打包好的 WinUI 3 應用程式只有在其 manifest 設定 TrustLevel="appContainer"時才會在 AppContainer 中執行。

對於較舊的 MSTest 或 MTP 版本,保留現有的 VSTest 設定用於 UWP 專案。 UWP 與 AppContainer 主機的原生 MTP 執行需要 MSTest 4.5 與 MTP 2.5。

了解 MTP 應用程式模型 sidecar 元件

對於已打包的應用程式,初始測試工具的程序無法在套件內執行。 MSTest.Sdk 啟動一個全信任的側車控制器,該控制器:

  • 準備命令列參數,並負責取消、重試、回報及退出碼處理。
  • 註冊建置輸出套件,並透過 AUMID 啟用指定的資訊清單應用程式。
  • 當 AppContainer 主機連線到 MTP 命名管線時,僅授權所選的套件 SID。
  • 從套件專用儲存體中復原 TRX、傾印、診斷和重試成品。

測試應用程式仍以自己的程序承載 MTP 與 MSTest。 UWP 的執行不需要 Microsoft.NET.Test.Sdk、vstest.console、UwpTestHostRuntimeProvider 或 Visual Studio 部署執行階段。

對於 UWP 應用程式,Windows 會透過 LaunchActivatedEventArgs.ArgumentswindowsApp提供一個啟用字串,而不是一般的程序引數。 在建立 MTP 建置器之前,先呼叫 PackagedAppExtensions.GetTestApplicationArguments。 打包的應用程式擴充功能會還原原始的參數陣列和控制器連線的元資料。

對於 WinUI 3 packagedClassicApp,包括執行在 AppContainer 中的 WinUI 3,請使用一般的程序參數。

符合先決條件

請使用適用於您專案的先決條件:

  • 使用 .NET SDK 10 或更新版本來支援 MSTest 4.5 工具鏈。dotnet test --project
  • 對於 UWP,請使用 Visual Studio 的桌面版 MSBuild,搭配 通用 Windows 平台 工作負載及所需的 Windows SDK。 這些元件僅提供建置時支援。
  • 對於 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"

第二個指令會註冊套件,透過 AUMID 啟動應用程式,執行常規及 UI 執行緒測試,從套件儲存複製結果產物,並回傳測試執行的退出碼。

設定 WinUI 3 測試

使用 MSTest.Sdk 4.5 或更新版本,設定UseWinUI為 true,並鎖定 Windows 專用的目標框架。 若是打包啟用,請使用 Windows 平台版本10.0.19041.0或更新版本。

在 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

不要將 [assembly: WinUITestTarget(...)] 新增至自我裝載的 WinUI 測試應用程式。 該屬性會啟動供個別測試主機使用的 WinUI 應用程式,但自行裝載的應用程式已呼叫 Application.Start。

設定一個未封裝的應用程式

將 WindowsPackageType 設定為 None。 該應用程式沒有 MSIX 身份或 AppxManifest.xml,因此 MTP 會直接啟動其執行檔。 不要手動新增打包的應用程式擴充功能。

當專案符合以下條件時,Windows 應用程式 SDK 通常會注入其啟動初始化器:

  • WindowsPackageType 是 None。
  • OutputType 是 Exe 或 WinExe。
  • WindowsAppSDKSelfContained 不是 true。

如果載入測試程式庫的主機不是 Windows 應用程式 SDK 應用程式,請在程式庫中將 WindowsAppSdkBootstrapInitialize 設為 true。

VSTest 不支援未封裝的 WinUI 3 測試應用程式,因為它的 WinUI 供應商需要 AppX 清單。

完整專案請參閱 未封裝的 WinUI MTP 範例。

配置一個打包式的全信任應用程式

保留預設封裝的 WinUI 設定及其 Package.appxmanifest。 MSTest.Sdk 會自動參考並為已封裝的專案註冊 Microsoft.Testing.Extensions.PackagedApp。

也不要打給 AddPackagedAppDeployment。 MTP 執行只能註冊一個測試主機啟動器。 僅在自訂啟動器負責封裝啟用時,才將 EnableMicrosoftTestingExtensionsPackagedApp 設為 false。

完整專案請參閱 包裝的 WinUI MTP 範例。

配置 AppContainer 應用程式

在 WinUI 套件清單中,將應用程式配置為 , packagedClassicApp 並設定 TrustLevel="appContainer"。 MTP 2.5 授權在控制器和延伸管線上使用特定的套件 SID。 它不允許 ALL APPLICATION PACKAGES 或要求迴圈豁免。

側車用非高架。 使用 InvokeTestingPlatform 目標檔,讓側車能將結果和診斷資料從套件 LocalState 複製到請求的結果目錄。

完整專案請參閱 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 應用程式,請使用 sidecar 目標和絕對結果目錄:

dotnet msbuild .\WinUITests.csproj -t:InvokeTestingPlatform -p:Platform=x64 "-p:TestingPlatformCommandLineArguments=--report-trx --results-directory C:\TestResults"

不要用 dotnet exec 來做 WinUI 應用程式。 WinUI 會根據程序路徑來解析 PRI 資源。

排除設定問題

癥狀 檢查
應用程式會回報多通電話給 Application.Start。 從自架的 WinUI 測試應用程式中移除該 WinUITestTarget 屬性。
測試運行結束了,但流程仍然開放。 關閉測試視窗,並在 MTP 執行完成後再撥打 Exit 。
測試失敗 返回流程退出代碼 0。 將 MTP 執行結果指派為 Environment.ExitCode。
未封裝的 WinUI 執行作業會回報缺少 AppxManifest.xml。 確認專案使用 MTP 而非 VSTest。
包裝版的 run 無法註冊或啟用該應用程式。 確認 Windows 目標框架、開發者模式或側載政策、架構及 manifest 執行檔條目。
AppContainer 主機無法連接到控制器。 使用 MSTest 4.5 和 MTP 2.5 或更新版本,並以非提升權限執行控制器。
AppContainer 報告不會被複製到指定的目錄。 使用 InvokeTestingPlatform 並指定絕對結果目錄。

另請參閱