Testa WinUI 3-appar med MSTest och Microsoft. Testing.Platform

Använd Microsoft. Testing.Platform (MTP) för att köra MSTest-tester i en WinUI 3-app. WinUI-appen fungerar som testvärd. Den äger programmets startpunkt, användargränssnittstråd och processlivslängd.

Välj mellan två WinUI 3-distributionsmodeller:

  • En uppackad app körs som en vanlig Windows körbar fil.
  • En paketerad app med fullständigt förtroende behåller MSIX-paketidentiteten och använder det experimentella Microsoft.Testing.Extensions.PackagedApp tillägget för att registrera och aktivera testvärden.

Important

Tillägget packaged-app stöder paketerade skrivbordsappar med fullständigt förtroende. Den stöder inte UWP eller andra AppContainer-testvärdar.

Paketerad AUMID-aktivering med fullständigt förtroende implementeras på microsoft/testfx lagringsplatsen men är inte tillgängligt i ett offentligt NuGet-paket från och med den 6 augusti 2026. De aktuella 1.0.0-alpha paketen innehåller inte den Windows specifika aktiveringsimplementeringen. Använd den paketerade konfigurationen först efter att en paketversion identifierar stöd för MSIX-registrering med fullständigt förtroende och AUMID-aktivering.

Välj en distributionsmodell

Välj distributionsmodellen innan du konfigurerar testprojektet.

Krav Välj Testa värdstart
Dina tester behöver inte paketidentitet eller API:er som kräver paketidentitet. Unpackaged MTP startar appen körbar direkt.
Dina tester kräver MSIX-paketidentitet eller paketerat appbeteende. Paketerat fullständigt förtroende efter att MTP-förhandsversionen blir offentligt tillgänglig Tillägget packaged-app registrerar build-utdata och aktiverar appen efter AUMID (Application User Model ID).
Dina tester måste köras i UWP eller någon annan AppContainer. VSTest MTP-tillägget packaged-app stöder inte AppContainer-isolering.

Om inte dina tester kräver paketidentitet använder du en uppackad app. Den uppackade modellen kräver inte paketregistrering, utvecklarläge eller tillägg för experimentell paketerad app.

Tills en offentlig MTP-förhandsversion innehåller MSIX-registrering med fullständigt förtroende och AUMID-aktivering använder du VSTest för paketerade WinUI 3-tester med fullständigt förtroende.

Förstå UWP-gränsen

Behandla inte UWP som en annan paketerad WinUI 3-modell. Både klassiska UWP-projekt som riktar sig mot UAP 10 och moderna .NET UWP-projekt som ska UseUwptrue köras i en AppContainer. Paketering av en WinUI 3-skrivbordsapp placerar den inte i den appmodellen.

Använd VSTest för klassiska UWP- och moderna .NET UWP-tester. Startprogrammet MTP packaged-app riktar sig mot paketerade skrivbordsvärdar med fullständigt förtroende. Den kan inte leverera sina aktiveringsargument eller en kontrollantanslutning till en AppContainer-värd.

En modern .NET UWP-konfiguration finns i UWP-exemplet MSTest .NET 9.

Konfigurera WinUI-testvärden

Båda distributionsmodellerna använder samma lokalt installerade MTP-konfiguration.

Ange de vanliga projektegenskaperna

Ange dessa egenskaper i WinUI-testprojektet:

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

Använd .NET 8 eller senare .NET version som stöds. Exemplet är avsett för Windows plattformsversion 10.0.19041.0. Tillägget packaged-app kräver den här versionen eller senare.

Behåll WinUI-objektet ApplicationDefinition som pekar på testappens XAML-fil. WinUI genererar en startpunkt från objektet. Om du vill förhindra att MTP genererar en andra startpunkt anger du GenerateTestingPlatformEntryPoint till false.

Lägg till paketreferenser till de aktuella kompatibla versionerna av MSTest och Microsoft. WindowsAppSDK.

Värd-MTP från programmet

Åsidosätt OnLaunched i Klassen WinUI Application . Skapa och aktivera testfönstret och publicera sedan dess dispatcher-kö:

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

Lägg till using Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer; för UITestMethodAttribute.

Skapa MTP-programmet från kommandoradsargumenten. Registrera sedan de tillägg som MSBuild bidrar med:

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();

Lägg till using Microsoft.Testing.Platform.Builder; för MTP-buildertyperna. WinUI-versionen lägger EnableMSTestRunner till processargumenten. Eftersom det inte är ett MTP-kommandoradsalternativ tar du bort det innan du skapar testprogrammet.

Projektet inaktiverar den genererade MTP-startpunkten, så anropa AddSelfRegisteredExtensions. För en paketerad app registrerar Microsoft.Testing.Extensions.PackagedApp metoden även startprogrammet.

I OnLaunchedplacerar du testprogrammets skapande och körning i ett try block. Tilldela resultatet av await app.RunAsync() till Environment.ExitCode. I ett finally block stänger du fönstret och anropar programmets Exit metod.

Livscykelstegen ger två garantier:

  • Processen returnerar MTP-slutkoden, så ett misslyckat test genererar en slutkod för icke-zeroprocess.
  • WinUI-meddelandeloopen stoppas efter körningen i stället för att låta testprocessen vara aktiv.

Varning

Lägg inte till [assembly: WinUITestTarget(...)] i en WinUI-testapp med egen värd. Attributet startar ett WinUI-program för en separat testvärd. En app med egen värd anropar Application.Start först. Attributet försöker sedan starta ett andra program i samma process.

En fullständig implementering finns i det uppackade WinUI-exemplet och det paketerade WinUI-exemplet.

Köra tester på användargränssnittstråden

Använd UITestMethod för ett test som skapar eller använder WinUI-objekt. MSTest schemalägger testet på den dispatcher-kö som du tilldelade under OnLaunched.

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

En stam TestMethod körs inte i WinUI-dispatcher-kön. Använd den för tester som inte kräver användargränssnittstråden.

Konfigurera en uppackad testapp

Lägg till följande egenskaper för en uppackad app:

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

Referera inte till Microsoft.Testing.Extensions.PackagedApp. Den uppackade appen har ingen MSIX-identitet eller AppxManifest.xml i utdata, så MTP kan starta sin körbara fil direkt.

Som standard matar Windows App SDK in bootstrap-initieraren när projektet uppfyller följande villkor:

  • WindowsPackageType är None.
  • OutputType är Exe eller WinExe.
  • WindowsAppSDKSelfContained är inte true.

Om en värd som inte är en Windows App SDK app läser in testbiblioteket anger du WindowsAppSdkBootstrapInitialize till true i biblioteket.

Note

VSTest stöder inte den här uppackade WinUI-konfigurationen. Kör projektet med MTP.

Konfigurera en paketerad testapp med fullständigt förtroende

Behåll den standardpaketerade WinUI-konfigurationen:

  • Ställ inte in WindowsPackageType till None.
  • Behåll Package.appxmanifest och pakettillgångarna i projektet.
  • Ange EnableMsixTooling till true om projektet använder MSIX-paketeringsverktygen för ett projekt.

När en förhandsversion som innehåller MSIX-registrering med fullständigt förtroende och AUMID-aktivering blir tillgänglig lägger du till den specifika versionen av Microsoft. Testing.Extensions.PackagedApp-paketet. Använd inte ett tidigare 1.0.0-alpha paket för den här installationen.

Paketets MSBuild-rekvisita registrerar startprogrammet via AddSelfRegisteredExtensions. Anropa AddPackagedAppDeploymentinte heller . En MTP-körning kan bara registrera en testvärdstartare.

Startprogrammet utför följande åtgärder:

  1. Den söker efter en AppxManifest.xml som beskriver det körbara testet.
  2. Den registrerar layouten för byggutdata med Windows.
  3. Den löser appens AUMID från det registrerade paket- och manifestprogram-ID:t.
  4. Den aktiverar appen av AUMID och ansluter den aktiverade processen till MTP-styrenheten.

Startprogrammet ignorerar ett orelaterat manifest i en överordnad katalog om inte en Application inmatning pekar på det körbara testet. En uppackad app som refererar till paketet finns indirekt kvar på direktstartssökvägen.

Uppfylla dessa krav innan du kör en paketerad testapp:

  • Använd ett Windows specifikt målramverk med plattformsversion 10.0.19041.0 eller senare.
  • Om du vill registrera den osignerade layouten för byggutdata aktiverar du utvecklarläge eller konfigurerar separat inläsning.
  • Använd en paketerad skrivbordsapp med fullständigt förtroende. Tillägget stöder inte UWP eller andra AppContainer-värdar.

Caution

Microsoft.Testing.Extensions.PackagedApp och tilläggspunkten ITestHostLauncher är experimentell. En framtida version kan ändra eller ta bort deras API:er och beteende. Utvärdera riskerna innan du använder den paketerade modellen i produktionstestinfrastrukturen.

Kör testerna

Från katalogen som innehåller WinUI-testprojektet kör du:

dotnet run

Om du vill ange projektet använder du dotnet run --project .\WinUITests.csproj.

För en uppackad app startar MTP den körbara filen direkt. För en paketerad app registrerar den paketerade appstartaren layouten och aktiverar appen av AUMID.

I båda modellerna öppnas testfönstret, MTP kör testerna och fönstret stängs. Terminalen rapporterar sedan testsammanfattningen. En lyckad körning avslutas med kod 0. När ett test misslyckas OnLaunched tilldelar det icke-nollresultatet RunAsync till Environment.ExitCode.

Använd dotnet run för någon av modellerna. Om du vill köra en uppackad app direkt använder du den genererade körbara appen. Använd dotnet exec inte eftersom WinUI löser PRI-resurser i förhållande till processsökvägen.

Felsöka konfigurationen

Använd dessa kontroller för de vanligaste installationsfelen:

Symptom Kontrollera
Appen rapporterar flera anrop till Application.Start. WinUITestTarget Ta bort attributet från den lokalt installerade testappen.
Testkörningen är klar men processen förblir öppen. Stäng testfönstret och anropa Exit i ett finally block efter RunAsync.
Misslyckade tester returnerar fortfarande processens slutkod 0. Tilldela resultatet av RunAsync till Environment.ExitCode.
En uppackad körning misslyckas eftersom AppxManifest.xml den saknas. Bekräfta att projektet aktiverar MTP och att körningen inte använder VSTest.
En paketerad körning kan inte registrera eller aktivera appen. Bekräfta det Windows specifika målramverket, utvecklarläge eller separat inläsning av konfiguration, appmodell med fullständigt förtroende och körbar manifestpost.

Se även