Test WinUI 3-apps met MSTest en Microsoft. Testing.Platform

Gebruik Microsoft. Testing.Platform (MTP) om MSTest-tests uit te voeren in een WinUI 3-app. De WinUI-app fungeert als de testhost. Het is eigenaar van het toegangspunt van de toepassing, de UI-thread en de levensduur van het proces.

Kies tussen twee WinUI 3-implementatiemodellen:

  • Een uitgepakte app wordt uitgevoerd als een normaal Windows uitvoerbaar bestand.
  • Een verpakte volledig vertrouwde app houdt MSIX-pakketidentiteit bij en gebruikt de experimentele Microsoft.Testing.Extensions.PackagedApp extensie om de testhost te registreren en te activeren.

Important

De extensie voor verpakte apps biedt ondersteuning voor volledig vertrouwde desktop-apps. Het biedt geen ondersteuning voor UWP- of andere AppContainer-testhosts.

Verpakte aumid-activering met volledige vertrouwen wordt geïmplementeerd in de microsoft/testfx opslagplaats, maar is vanaf 6 augustus 2026 niet beschikbaar in een openbaar NuGet-pakket. De huidige 1.0.0-alpha pakketten bevatten niet de Windows-specifieke activerings-implementatie. Gebruik de verpakte installatie pas nadat een pakketrelease ondersteuning identificeert voor msix-registratie met volledige vertrouwensrelatie en AUMID-activering.

Een implementatiemodel kiezen

Kies het implementatiemodel voordat u het testproject configureert.

Requirement Kiezen Host opstarten testen
Uw tests hebben geen pakketidentiteit of API's nodig waarvoor pakketidentiteit is vereist. Unpackaged MTP start het uitvoerbare bestand van de app rechtstreeks.
Voor uw tests is msiX-pakketidentiteit of gedrag van pakket-app vereist. Verpakt volledig vertrouwen nadat de MTP-preview openbaar beschikbaar is De app-extensie met verpakte apps registreert de build-uitvoer en activeert de app op auMID (Application User Model ID).
Uw tests moeten worden uitgevoerd in UWP of een andere AppContainer. VSTest De MTP-extensie voor verpakte apps biedt geen ondersteuning voor AppContainer-isolatie.

Gebruik een uitgepakte app, tenzij uw tests pakketidentiteit vereisen. Voor het uitgepakte model is geen pakketregistratie, ontwikkelaarsmodus of experimentele app-extensie vereist.

Gebruik VSTest voor verpakte WinUI 3-tests totdat een openbare MTP-preview MSIX-registratie en AUMID-activering bevat.

Inzicht in de UWP-grens

Behandel UWP niet als een ander verpakt WinUI 3-model. Beide klassieke UWP-projecten die gericht zijn op UAP 10 en moderne .NET UWP-projecten die zijn ingesteld UseUwp voor true uitvoering in een AppContainer. Als u een WinUI 3-desktop-app inpakt, wordt deze niet in dat app-model geplaatst.

Gebruik VSTest voor klassieke UWP- en moderne .NET UWP-tests. Het MTP-startprogramma voor verpakte apps is gericht op volledig vertrouwde desktophosts. De activeringsargumenten of controllerverbinding met een AppContainer-host kunnen niet worden geleverd.

Zie het VOORBEELD MSTest .NET 9 UWP voor een moderne .NET UWP-configuratie.

De WinUI-testhost configureren

Beide implementatiemodellen maken gebruik van dezelfde zelf-hostende MTP-installatie.

De algemene projecteigenschappen instellen

Stel deze eigenschappen in het WinUI-testproject in:

<OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<UseWinUI>true</UseWinUI>
<EnableMSTestRunner>true</EnableMSTestRunner>
<GenerateTestingPlatformEntryPoint>false</GenerateTestingPlatformEntryPoint>

Gebruik .NET 8 of een latere ondersteunde .NET versie. Het voorbeeld is gericht op Windows platformversie10.0.19041.0. Voor de extensie voor verpakte apps is deze versie of hoger vereist.

Bewaar het WinUI-item ApplicationDefinition dat verwijst naar het XAML-bestand van uw test-app. WinUI genereert een toegangspunt van dat item. Als u wilt voorkomen dat MTP een tweede toegangspunt genereert, stelt u deze in GenerateTestingPlatformEntryPoint op false.

Voeg pakketverwijzingen toe aan de huidige compatibele versies van MSTest en Microsoft. WindowsAppSDK.

MTP hosten vanuit de toepassing

Overschrijven OnLaunched in de WinUI-klasse Application . Maak en activeer het testvenster en publiceer vervolgens de dispatcherwachtrij:

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

Toevoegen using Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer; voor UITestMethodAttribute.

Maak de MTP-toepassing op basis van de opdrachtregelargumenten. Registreer vervolgens de extensies die MSBuild bijdraagt:

string[] cliArgs = Environment.GetCommandLineArgs().Skip(1)
    .Where(arg => !arg.Contains("EnableMSTestRunner")).ToArray();
ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(cliArgs);
builder.AddSelfRegisteredExtensions(cliArgs);
using ITestApplication app = await builder.BuildAsync();

Toevoegen using Microsoft.Testing.Platform.Builder; voor de MTP builder-typen. De WinUI-build voegt toe EnableMSTestRunner aan de procesargumenten. Omdat het geen MTP-opdrachtregeloptie is, verwijdert u deze voordat u de testtoepassing maakt.

Het gegenereerde MTP-toegangspunt wordt door het project uitgeschakeld.AddSelfRegisteredExtensions Voor een verpakte app registreert de methode ook het Microsoft.Testing.Extensions.PackagedApp startprogramma.

Plaats OnLaunchedhet maken en uitvoeren van een testtoepassing in een try blok. Wijs het resultaat van await app.RunAsync() toe aan Environment.ExitCode. Sluit het venster in een finally blok en roep de methode van Exit de toepassing aan.

De levenscyclusstappen bieden twee garanties:

  • Het proces retourneert de MTP-afsluitcode, dus een mislukte test produceert een niet-nulprocesafsluitcode.
  • De WinUI-berichtlus stopt na de uitvoering in plaats van het testproces actief te laten.

Warning

Voeg niet toe aan [assembly: WinUITestTarget(...)] een zelf-hostende WinUI-test-app. Het kenmerk start een WinUI-toepassing voor een afzonderlijke testhost. Een zelf-hostende app roept Application.Start eerst aan. Het kenmerk probeert vervolgens een tweede toepassing in hetzelfde proces te starten.

Zie het uitgepakte WinUI-voorbeeld en het verpakte WinUI-voorbeeld voor een volledige implementatie.

Tests uitvoeren op de UI-thread

Gebruiken UITestMethod voor een test waarmee WinUI-objecten worden gemaakt of geopend. MSTest plant de test op de wachtrij van de dispatcher die u hebt toegewezen tijdens OnLaunched.

[UITestMethod]
public void CreatesControlOnUiThread()
{
    var grid = new Grid();
    Assert.IsTrue(grid.DispatcherQueue.HasThreadAccess);
}

Een normale TestMethod uitvoering wordt niet uitgevoerd in de WinUI-dispatcherwachtrij. Gebruik deze voor tests waarvoor de UI-thread niet is vereist.

Een uitgepakte test-app configureren

Voor een uitgepakte app voegt u deze eigenschappen toe:

<WindowsPackageType>None</WindowsPackageType>
<EnableMsixTooling>false</EnableMsixTooling>

Niet verwijzen.Microsoft.Testing.Extensions.PackagedApp De uitgepakte app heeft geen MSIX-identiteit of AppxManifest.xml in de uitvoer, zodat MTP het uitvoerbare bestand rechtstreeks kan starten.

Standaard injecteert de Windows App SDK de bootstrap-initialisatiefunctie wanneer het project aan deze voorwaarden voldoet:

  • WindowsPackageType is None.
  • OutputType is Exe of WinExe.
  • WindowsAppSDKSelfContained is niet true.

Als een host die geen Windows App SDK app is, uw testbibliotheek laadt, ingesteld WindowsAppSdkBootstrapInitializetrue op in de bibliotheek.

Note

VSTest biedt geen ondersteuning voor deze uitgepakte WinUI-configuratie. Voer het project uit met MTP.

Een verpakte test-app voor volledig vertrouwen configureren

Behoud de standaard geconfigureerde WinUI-configuratie:

  • Stel WindowsPackageType niet in op None.
  • Houd Package.appxmanifest en de pakketassets in het project.
  • Stel deze true optie EnableMsixTooling in als uw project gebruikmaakt van de MSIX-pakkethulpprogramma's voor één project.

Voeg na een preview met volledig vertrouwde MSIX-registratie en AUMID-activering de specifieke versie van de Microsoft toe. Testing.Extensions.PackagedApp-pakket. Gebruik geen eerder 1.0.0-alpha pakket voor deze installatie.

De MSBuild props van het pakket registreren het startprogramma via AddSelfRegisteredExtensions. Bel niet ook AddPackagedAppDeployment. Een MTP-uitvoering kan slechts één startprogramma voor testhosts registreren.

Het startprogramma voert deze acties uit:

  1. Er wordt gecontroleerd op een AppxManifest.xml bestand dat het uitvoerbare testbestand beschrijft.
  2. De indeling voor build-uitvoer wordt geregistreerd bij Windows.
  3. Hiermee wordt de AUMID van de app omgezet vanuit het geregistreerde pakket en de manifesttoepassings-id.
  4. Het activeert de app door AUMID en verbindt het geactiveerde proces met de MTP-controller.

Het startprogramma negeert een niet-gerelateerd manifest in een bovenliggende map, tenzij een Application ingangspunt naar het uitvoerbare testbestand. Een uitgepakte app die indirect verwijst naar het pakket, blijft op het pad direct starten.

Voldoen aan deze vereisten voordat u een verpakte test-app uitvoert:

  • Gebruik een Windows-specifiek doelframework met een platformversie 10.0.19041.0 of hoger.
  • Als u de niet-ondertekende indeling voor build-uitvoer wilt registreren, schakelt u de ontwikkelaarsmodus in of configureert u sideloading.
  • Gebruik een volledig vertrouwde desktop-app. De extensie biedt geen ondersteuning voor UWP- of andere AppContainer-hosts.

Caution

Microsoft.Testing.Extensions.PackagedApp en het ITestHostLauncher extensiepunt zijn experimenteel. Een toekomstige release kan hun API's en gedrag wijzigen of verwijderen. Evalueer de risico's voordat u het verpakte model in de productietestinfrastructuur gebruikt.

De tests uitvoeren

Voer vanuit de map met het WinUI-testproject het volgende uit:

dotnet run

Als u het project wilt opgeven, gebruikt u dotnet run --project .\WinUITests.csproj.

Voor een uitgepakte app start MTP het uitvoerbare bestand rechtstreeks. Voor een verpakte app registreert het startprogramma voor verpakte apps de indeling en activeert de app door AUMID.

In beide modellen wordt het testvenster geopend, MTP voert de tests uit en wordt het venster gesloten. De terminal rapporteert vervolgens de testsamenvatting. Een geslaagde uitvoering wordt afgesloten met code 0. Wanneer een test mislukt, OnLaunched wijst u het niet-nulresultaat RunAsync toe aan Environment.ExitCode.

Gebruiken dotnet run voor beide modellen. Als u een uitgepakte app rechtstreeks wilt uitvoeren, gebruikt u het gegenereerde uitvoerbare app-bestand. Gebruik dit niet dotnet exec omdat WinUI PRI-resources oplost ten opzichte van het procespad.

Problemen met de installatie oplossen

Gebruik deze controles voor de meest voorkomende installatiefouten:

Symptoom Controle
De app rapporteert meerdere aanroepen naar Application.Start. Verwijder het WinUITestTarget kenmerk uit de zelf-hostende test-app.
De testuitvoering is voltooid, maar het proces blijft geopend. Sluit het testvenster en roep Exit na een blok RunAsyncaanfinally.
Mislukte tests retourneren nog steeds afsluitcode 0voor proces. Wijs het resultaat van RunAsync toe aan Environment.ExitCode.
Een uitgepakte uitvoering mislukt omdat AppxManifest.xml deze ontbreekt. Controleer of het project MTP inschakelt en of de uitvoering geen gebruik maakt van VSTest.
Een verpakte uitvoering kan de app niet registreren of activeren. Bevestig het Windows-specifieke doelframework, de ontwikkelaarsmodus of sideloadingconfiguratie, het volledig vertrouwde app-model en de uitvoerbare vermelding van het manifest.

Zie ook