Testen Sie UWP- und WinUI 3-Apps mit MSTest und Microsoft. Testing.Platform

Verwenden Sie Microsoft. Testing.Platform (MTP) zum Ausführen von MSTest-Tests in UWP- und WinUI 3-Anwendungen. Die Anwendung fungiert als Testhost und besitzt den UI-Thread und die Prozesslebensdauer.

Important

Die in diesem Artikel beschriebene vollständige Windows Anwendungsunterstützungsmatrix ist mit MSTest 4.5 und MTP 2.5 verfügbar. Verwenden Sie bis zur Veröffentlichung der stabilen Versionen übereinstimmende 4.5- und 2.5-Vorschaupakete. Wenn Sie MTP-Pakete direkt verwalten, achten Sie darauf, dass die Versionen der Plattform- und Erweiterungspakete aufeinander abgestimmt sind.

Auswählen eines Anwendungsmodells

MSTest.Sdk unterstützt die folgenden Windows Anwendungsmodelle über MTP:

Anwendungsmodell Verpacken und Vertrauen Start des Testhosts Führen Sie den Befehl aus
Klassische UWP (uap10.0) Verpackter AppContainer Ein voll vertrauenswürdiges Sidecar registriert das Paket und aktiviert die App anhand der Anwendungsbenutzermodell-ID (Application User Model ID, AUMID). MSBuild mit dem Ziel InvokeTestingPlatform
Moderne UWP (.NET 10 mit UseUwp) Verpackter AppContainer Ein Full-Trust-Sidecar registriert das Paket und aktiviert die App anhand der AUMID. MSBuild mit dem Ziel InvokeTestingPlatform
Verpacktes WinUI 3 Paketierte voll vertrauenswürdige Ein voll vertrauenswürdiges Sidecar registriert das Paket und aktiviert die App von AUMID. dotnet run oder dotnet test --project
Entpackt WinUI 3 Keine Paketidentität, voll vertrauenswürdig MTP startet die ausführbare App direkt. dotnet run oder dotnet test --project
WinUI 3 packagedClassicApp mit TrustLevel="appContainer" Verpackter AppContainer Ein Sidecar mit voller Vertrauensstufe aktiviert die App und autorisiert ihre exakte Paket-Sicherheitsbezeichnung (SID) auf MTP-Kommunikationspipes. dotnet msbuild mit dem Ziel InvokeTestingPlatform

Verpackung und Sandkasten sind separate Auswahlmöglichkeiten. Eine verpackte WinUI 3-Desktop-App verfügt über Paketidentität, wird jedoch standardmäßig als voll vertrauenswürdiger Prozess ausgeführt. Eine UWP-App wird immer in AppContainer ausgeführt. Eine verpackte WinUI 3-App wird nur dann in AppContainer ausgeführt, wenn in ihrem Manifest TrustLevel="appContainer" festgelegt ist.

Behalten Sie für ältere MSTest- oder MTP-Versionen Ihre vorhandene VSTest-Konfiguration für UWP-Projekte bei. Für die systemeigene MTP-Ausführung für UWP- und AppContainer-Hosts ist MSTest 4.5 und MTP 2.5 erforderlich.

Das Sidecar des MTP-App-Modells verstehen

Bei einer verpackten App kann der anfängliche Testtoolprozess nicht innerhalb des Pakets ausgeführt werden. MSTest.Sdk startet einen voll vertrauenswürdigen Sidecar-Controller, der:

  • Bereitet Befehlszeilenargumente vor und ist für Abbrüche, Wiederholungsversuche, die Berichterstellung sowie die Verarbeitung von Exit-Codes verantwortlich.
  • Registriert das Buildausgabepaket und aktiviert die genaue Manifestanwendung von AUMID.
  • Autorisiert nur die ausgewählte Paket-SID, wenn ein AppContainer-Host eine Verbindung mit MTP named pipes herstellt.
  • Stellt TRX-, Dump-, Diagnose- und Wiederholungsartefakte aus paketeigenem Speicher wieder her.

Die Testanwendung hostet weiterhin MTP und MSTest in einem eigenen Prozess. Die UWP-Ausführung erfordert weder Microsoft.NET.Test.Sdk, vstest.console, UwpTestHostRuntimeProvider noch die Visual Studio-Bereitstellungslaufzeit.

Für eine UWP windowsApp stellt Windows über LaunchActivatedEventArgs.Arguments anstelle der normalen Prozessargumente eine Aktivierungszeichenfolge bereit. Rufen Sie auf PackagedAppExtensions.GetTestApplicationArguments , bevor Sie den MTP-Generator erstellen. Die Erweiterung für paketierte Apps stellt das ursprüngliche Argument-Array und die Metadaten der Controllerverbindung wieder her.

Verwenden Sie für ein WinUI 3 packagedClassicApp, einschließlich eines, das in AppContainer ausgeführt wird, die normalen Prozessargumente.

Erfüllen der Voraussetzungen

Verwenden Sie die Voraussetzungen, die für Ihr Projekt gelten:

  • Verwenden Sie .NET SDK 10 oder höher für die MSTest 4.5-Toolkette und dotnet test --project.
  • Verwenden Sie für UWP desktop MSBuild aus Visual Studio mit der Universelle Windows-Plattform Workload und dem erforderlichen Windows SDK. Diese Komponenten bieten nur Buildzeitunterstützung.
  • Installieren Sie für WinUI 3 die Windows Anwendungsentwicklungstools, und verweisen Sie auf eine kompatible Windows App SDK Version.
  • Aktivieren Sie bei verpackten Test-Apps den Windows-Entwicklermodus, oder konfigurieren Sie das Seitenladen, damit Windows ein nicht signiertes Ausgabelayout des Builds registrieren kann.
  • Führen Sie bei AppContainer-Test-Apps den Controller als Benutzer ohne erhöhte Rechte aus.

Konfigurieren von UWP-Tests

Konfigurieren eines modernen UWP-Projekts

Verwenden Sie MSTest.Sdk 4.5 oder höher, legen Sie .NET 10 mit einer Windows-Plattformversion als Ziel fest, und setzen Sie UseUwp auf true. Behalten Sie Ihre vorhandenen UWP-XAML-, MSIX-, Architektur- und nativeN AOT-Einstellungen bei.

Visual Studio aktiviert normalerweise UseUwpTools während des Builds. MSTest.Sdk wählt das UWP-Anwendungsmodell aus, wenn UseUwpToolsUseUwp ist oder wenn truetrue ist und UseUwpTools noch nicht festgelegt ist.

Wenn Sie in einer MTP-Testanwendung ohne UWP nur UWP-Verweise benötigen, setzen Sie UseUwpTools auf false. Das SDK verwendet dann den direkten MTP-Runner, es sei denn, ein anderes gepacktes Anwendungsmodell erfordert den Sidecar.

Ein vollständiges Projekt finden Sie im modernen UWP-MTP-Beispiel.

Konfigurieren eines klassischen UWP-Projekts

Behalten Sie die vorhandene uap10.0 Projektstruktur, die MSBuild-Toolkette für Desktopanwendungen und das UWP-Erweiterungs-SDK bei. Importieren Sie MSTest.Sdk 4.5 oder höher, und aktivieren Sie msTest runner und MTP. MSTest.Sdk stellt UAP-kompatible Bootstrap-, Adapter- und Laufzeitressourcen bereit.

Ein vollständiges Projekt finden Sie im klassischen UWP-MTP-Beispiel.

Ausführen von UWP-Tests

Öffnen Sie eine Entwickler-PowerShell für Visual Studio. Erstellen Sie die Lösung für eine konkrete Architektur, und rufen Sie dann MTP auf:

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"

Der zweite Befehl registriert das Paket, aktiviert die App von AUMID, führt regelmäßige tests und UI-Threadtests aus, kopiert Ergebnisartefakte aus dem Paketspeicher und gibt den Testausführungs-Exitcode zurück.

Konfigurieren von WinUI 3-Tests

Verwenden Sie MSTest.Sdk 4.5 oder höher, setzen Sie true auf UseWinUI, und legen Sie ein Windows-spezifisches Zielframework als Ziel fest. Verwenden Sie für die paketierte Aktivierung Windows Plattformversion 10.0.19041.0 oder höher.

MTP aus der WinUI-Anwendung hosten

Erstellen und aktivieren Sie für eine selbst gehostete WinUI-Test-App das Testfenster in OnLaunched, und veröffentlichen Sie dann die Verteilerwarteschlange:

_window = new UnitTestAppWindow();
_window.Activate();
UITestMethodAttribute.DispatcherQueue = _window.DispatcherQueue;

Führen Sie das generierte MTP-Hilfsprogramm aus, weisen Sie das Ergebnis Environment.ExitCode zu, schließen Sie das Fenster und rufen Sie Exit auf:

Environment.ExitCode = await MicrosoftTestingPlatformApplication.RunAsync(
    Environment.GetCommandLineArgs()[1..]);

Verwenden Sie UITestMethod für Tests, die WinUI-Objekte erstellen oder auf WinUI-Objekte zugreifen. Verwenden Sie TestMethod für Tests, die keinen UI-Thread erfordern.

Warning

Fügen Sie [assembly: WinUITestTarget(...)] nicht zu einer selbstgehosteten WinUI-Test-App hinzu. Dieses Attribut startet eine WinUI-Anwendung für einen separaten Testhost, aber die selbst gehostete App hat bereits aufgerufen Application.Start.

Konfigurieren einer entpackten App

Setze WindowsPackageType auf None. Die App hat keine MSIX-Identität oder AppxManifest.xml, sodass MTP die ausführbare Datei direkt startet. Fügen Sie die Paket-App-Erweiterung nicht manuell hinzu.

Die Windows App SDK fügt ihren Bootstrap-Initialisierer normalerweise ein, wenn das Projekt diese Bedingungen erfüllt:

  • WindowsPackageType ist None.
  • OutputType ist Exe oder WinExe.
  • WindowsAppSDKSelfContained ist nicht true.

Wenn ein Host, der keine Windows App SDK App ist, Ihre Testbibliothek lädt, setzen Sie in der Bibliothek WindowsAppSdkBootstrapInitialize auf true.

VSTest unterstützt keine entpackten WinUI 3-Test-Apps, da der WinUI-Anbieter ein AppX-Manifest erfordert.

Ein vollständiges Projekt finden Sie im entpackten WinUI MTP-Beispiel.

Konfigurieren Sie eine paketierte App mit voller Vertrauensstufe

Behalten Sie die standardmäßig bereitgestellte WinUI-Konfiguration und das zugehörige Package.appxmanifest bei. MSTest.Sdk referenziert und registriert Microsoft.Testing.Extensions.PackagedApp automatisch für das gepackte Projekt.

Rufen Sie AddPackagedAppDeployment auch nicht auf. Eine MTP-Ausführung kann nur einen Testhost-Launcher registrieren. Legen Sie EnableMicrosoftTestingExtensionsPackagedApp nur dann auf false fest, wenn ein benutzerdefinierter Launcher die paketierte Aktivierung verwaltet.

Ein vollständiges Projekt finden Sie im gepackten WinUI MTP-Beispiel.

Konfigurieren einer AppContainer-App

Konfigurieren Sie im WinUI-Paketmanifest die Anwendung als packagedClassicApp und setzen Sie TrustLevel="appContainer". MTP 2.5 autorisiert die exakte Paket-SID auf dem Controller und den Erweiterungsleitungen. Es erteilt ALL APPLICATION PACKAGES nicht und erfordert keine Loopbackausnahme.

Führen Sie das Sidecar ohne Erhöhte aus. Verwenden Sie das Ziel InvokeTestingPlatform, damit das Sidecar Ergebnisse und Diagnoseinformationen aus dem Paket LocalState in das angeforderte Ergebnisverzeichnis kopieren kann.

Ein vollständiges Projekt finden Sie im AppContainer WinUI MTP-Beispiel.

Ausführen von WinUI 3-Tests

Bauen Sie für eine konkrete Architektur. Führen Sie für eine verpackte Full-Trust-App oder eine nicht paketierte App Folgendes aus:

dotnet build -p:Platform=x64
dotnet test --project . --no-build -p:Platform=x64

Sie können auch dotnet run --no-build -p:Platform=x64 verwenden.

Verwenden Sie für eine AppContainer WinUI-App das Sidecar-Ziel und ein absolutes Ergebnisverzeichnis:

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

Verwenden Sie nicht dotnet exec für eine WinUI-App. WinUI löst PRI-Ressourcen relativ zum Prozesspfad auf.

Probleme bei der Einrichtung beheben

Symptom Prüfen
Die App meldet mehrere Aufrufe an Application.Start. Entfernen Sie das WinUITestTarget Attribut aus einer selbst gehosteten WinUI-Test-App.
Die Testausführung wird beendet, der Prozess bleibt jedoch offen. Schließen Sie das Testfenster und rufen Sie Exit nach Abschluss des MTP-Durchlaufs auf.
Fehlgeschlagene Tests geben den Beendigungscode 0des Prozesses zurück. Weisen Sie das MTP-Ausführungsergebnis zu Environment.ExitCode.
Eine nicht paketierte WinUI-Ausführung meldet ein fehlendes AppxManifest.xml. Vergewissern Sie sich, dass das Projekt MTP anstelle von VSTest verwendet.
Eine verpackte Ausführung kann die App nicht registrieren oder aktivieren. Bestätigen Sie das Windows-Ziel-Framework, den Entwicklermodus oder die Sideloading-Richtlinie, die Architektur und den ausführbaren Eintrag im Manifest.
Ein AppContainer-Host kann keine Verbindung mit dem Controller herstellen. Verwenden Sie MSTest 4.5 und MTP 2.5 oder höherer Version, und führen Sie den Controller ohne erhöhte Rechte aus.
Ein AppContainer-Bericht wird nicht in das angeforderte Verzeichnis kopiert. Verwenden Sie InvokeTestingPlatform und geben Sie ein absolutes Ergebnisverzeichnis an.

Siehe auch