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

Använd Microsoft. Testing.Platform (MTP) för att köra MSTest-tester i UWP- och WinUI 3-program. Programmet fungerar som testvärd och äger dess användargränssnittstråd och processlivslängd.

Important

Den fullständiga Windows programstödmatrisen som beskrivs i den här artikeln är tillgänglig med MSTest 4.5 och MTP 2.5. Tills de stabila versionerna släpps använder du matchande 4.5- och 2.5-förhandsgranskningspaket. Om du hanterar MTP-paket direkt kan du hålla plattforms- och tilläggspaketversionerna justerade.

Välj en programmodell

MSTest.Sdk stöder följande Windows programmodeller via MTP:

Programmodell Paketering och förtroende Testa värdstart Kör kommando
Klassisk UWP (uap10.0) paketerad AppContainer En sidovagn med fullständigt förtroende registrerar paketet och aktiverar appen efter AUMID (Application User Model ID). MSBuild med InvokeTestingPlatformmålet
Modern UWP (.NET 10 med UseUwp) Paketerad AppContainer En sidovagn med fullständigt förtroende registrerar paketet och aktiverar appen av AUMID. MSBuild med InvokeTestingPlatformmålet
Paketerad WinUI 3 Fullständigt paketerat förtroende En sidovagn med fullständigt förtroende registrerar paketet och aktiverar appen av AUMID. dotnet run eller dotnet test --project
WinUI 3 i opaketerat läge Ingen paketidentitet, fullständigt förtroende MTP startar appens körbara fil direkt. dotnet run eller dotnet test --project
WinUI 3 packagedClassicApp med TrustLevel="appContainer" Paketerad AppContainer En sidovagn med fullständigt förtroende aktiverar appen och auktoriserar dess exakta paketsäkerhetsidentifierare (SID) på MTP-kommunikationspipor. dotnet msbuild med InvokeTestingPlatform målet

Paketering och sandboxning är separata val. En paketerad WinUI 3-skrivbordsapp har paketidentitet men körs som en fullständig förtroendeprocess som standard. En UWP-app körs alltid i AppContainer. En paketerad WinUI 3-app körs i AppContainer bara om dess manifest anger TrustLevel="appContainer".

För äldre MSTest- eller MTP-versioner behåller du din befintliga VSTest-konfiguration för UWP-projekt. Inbyggd MTP-körning för UWP- och AppContainer-värdar kräver MSTest 4.5 och MTP 2.5.

Förstå sidovagnen för MTP-appmodellen

För en paketerad app kan den första testverktygsprocessen inte köras i paketet. MSTest.Sdk startar en sidovagnsstyrenhet med fullständigt förtroende som:

  • Förbereder kommandoradsargument och ansvarar för avbrott, återförsök, rapportering och hantering av avslutningskoder.
  • Registrerar paketet med byggutdata och aktiverar exakt det program som anges i manifestet via AUMID.
  • Auktoriserar endast det valda paket-SID:et när en AppContainer-värd ansluter till MTP-namngivna pipes.
  • Återställer TRX-, dump-, diagnostik- och återförsöksartefakter från paketägd lagring.

Testprogrammet kör fortfarande MTP och MSTest i en egen process. Körning av UWP kräver inte Microsoft.NET.Test.Sdk, vstest.console, UwpTestHostRuntimeProvider eller Visual Studios distributionskörmiljö.

För en UWP windowsAppger Windows en aktiveringssträng i LaunchActivatedEventArgs.Arguments stället för normala processargument. Anropa PackagedAppExtensions.GetTestApplicationArguments innan du skapar MTP-byggaren. Tillägget packaged-app återställer den ursprungliga argumentmatrisen och metadata för kontrollantanslutningen.

För ett WinUI 3 packagedClassicApp, inklusive ett som körs i AppContainer, använder du de normala processargumenten.

Uppfylla kraven

Använd de förutsättningar som gäller för projektet:

  • Använd .NET SDK 10 eller senare för MSTest 4.5-verktygskedjan och dotnet test --project.
  • För UWP använder du MSBuild för skrivbord från Visual Studio med arbetsbelastningen Universell Windows-plattform och det Windows SDK som krävs. Dessa komponenter ger stöd endast vid bygge.
  • För WinUI 3 installerar du Windows programutvecklingsverktyg och refererar till en kompatibel Windows App SDK version.
  • För paketerade testappar aktiverar du utvecklarläge i Windows eller konfigurerar sidoinläsning så att Windows kan registrera en osignerad layout för byggresultatet.
  • För AppContainer-testappar kör du kontrollern som en användare utan förhöjda rättigheter.

Konfigurera UWP-tester

Konfigurera ett modernt UWP-projekt

Använd MSTest.Sdk 4.5 eller senare, rikta in dig på .NET 10 med en Windows-plattformsversion och ställ in UseUwp på true. Behåll dina befintliga UWP XAML-, MSIX-, arkitektur- och interna AOT-inställningar.

Visual Studio aktiverar UseUwpTools normalt under bygget. MSTest.Sdk väljer UWP-programmodellen när UseUwpTools är true, eller när UseUwp är true och UseUwpTools inte har angetts ännu.

Om du bara behöver UWP-referenser i ett MTP-testprogram som inte är UWP anger du UseUwpTools till false. SDK använder sedan den direkta MTP-löparen om inte en annan paketerad programmodell kräver sidovagnen.

Ett komplett projekt finns i det moderna UWP MTP-exemplet.

Konfigurera ett klassiskt UWP-projekt

Behåll den befintliga uap10.0 projektformen, skrivbords-MSBuild-verktygskedjan och UWP-tilläggs-SDK. Importera MSTest.Sdk 4.5 eller senare och aktivera MSTest-löparen och MTP. MSTest.Sdk tillhandahåller UAP-kompatibla bootstrap-, adapter- och körningsresurser.

Ett fullständigt projekt finns i det klassiska UWP MTP-exemplet.

Kör UWP-tester

Öppna en Developer PowerShell för Visual Studio. Skapa lösningen för en konkret arkitektur och anropa sedan 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"

Det andra kommandot registrerar paketet, aktiverar appen av AUMID, kör vanliga tester och UI-trådtester, kopierar resultatartefakter från paketlagring och returnerar slutkoden för testkörningen.

Konfigurera WinUI 3-tester

Använd MSTest.Sdk 4.5 eller senare, ange UseWinUI som true och använd ett Windows-specifikt målramverk. För paketerad aktivering använder du Windows plattformsversion 10.0.19041.0 eller senare.

Hysa MTP i WinUI-programmet

För en WinUI-testapp med egen värd skapar och aktiverar du testfönstret i OnLaunchedoch publicerar sedan dess dispatcher-kö:

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

Kör den genererade MTP-hjälpen, tilldela resultatet till Environment.ExitCode, stäng fönstret och anropa Exit:

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

Används UITestMethod för tester som skapar eller kommer åt WinUI-objekt. Används TestMethod för tester som inte kräver användargränssnittstråden.

Varning

Lägg inte till [assembly: WinUITestTarget(...)] i en WinUI-testapp med egen värd. Det attributet startar ett WinUI-program för en separat testvärd, men den lokalt installerade appen har redan anropat Application.Start.

Konfigurera en opaketerad app

Ställ in WindowsPackageType på None. Appen har ingen MSIX-identitet eller AppxManifest.xml, så MTP startar sin körbara fil direkt. Lägg inte till packaged app-tillägget manuellt.

Windows App SDK injicerar normalt bootstrap-initieraren när projektet uppfyller dessa villkor:

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

Om ett värdprogram som inte är en app med Windows App SDK läser in ditt testbibliotek, ställer du in WindowsAppSdkBootstrapInitialize på true i biblioteket.

VSTest stöder inte uppackade WinUI 3-testappar eftersom WinUI-providern kräver ett AppX-manifest.

Ett komplett projekt finns i det opaketerade WinUI MTP-exemplet.

Konfigurera en paketerad app med fullständigt förtroende

Behåll den standardpaketerade WinUI-konfigurationen och dess Package.appxmanifest. MSTest.Sdk refererar till och registrerar Microsoft.Testing.Extensions.PackagedApp automatiskt för det paketerade projektet.

Anropa inte heller AddPackagedAppDeployment. En MTP-körning kan bara registrera en testvärdstartare. Ange EnableMicrosoftTestingExtensionsPackagedApp till false endast när en anpassad launcher äger paketerad aktivering.

Ett fullständigt projekt finns i det paketerade WinUI MTP-exemplet.

Konfigurera en AppContainer-app

I WinUI-paketmanifestet konfigurerar du programmet som packagedClassicApp och anger TrustLevel="appContainer". MTP 2.5 auktoriserar det exakta paket-SID:et på styrenheten och tilläggsrören. Det ger inte ALL APPLICATION PACKAGES och kräver inte ett loopback-undantag.

Kör sidovagnen som inte är upphöjd. Använd målet InvokeTestingPlatform så att sidecar-komponenten kan kopiera resultat och diagnostikdata från paketet LocalState till den begärda resultatkatalogen.

Ett fullständigt projekt finns i AppContainer WinUI MTP-exemplet.

Kör tester för WinUI 3

Bygg för en konkret arkitektur. Kör för en paketerad app med fullständig behörighet eller en opackad app:

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

Du kan också använda dotnet run --no-build -p:Platform=x64.

För en AppContainer WinUI-app använder du sidecar-målet och en absolut resultatkatalog:

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

Använd inte dotnet exec för en WinUI-app. WinUI matchar PRI-resurser utifrån processens sökväg.

Felsök installationen

Symptom Kontrollera
Appen rapporterar flera anrop till Application.Start. WinUITestTarget Ta bort attributet från en WinUI-testapp med egen värd.
Testkörningen är klar men processen förblir öppen. Stäng testfönstret och anropa Exit när MTP-körningen har slutförts.
Misslyckade tester returnerar processens slutkod 0. Tilldela MTP-körningsresultatet till Environment.ExitCode.
En opaketerad WinUI-app rapporterar att AppxManifest.xml saknas. Bekräfta att projektet använder MTP i stället för VSTest.
En paketerad appkörning kan inte registrera eller aktivera appen. Kontrollera Windows-målramverket, utvecklarläget eller sideladdningspolicyn, arkitekturen och den körbara posten i manifestet.
En AppContainer-värd kan inte ansluta till kontrollanten. Använd MSTest 4.5 och MTP 2.5 eller senare och kör kontrollanten utan förhöjd behörighet.
En AppContainer-rapport kopieras inte till den begärda katalogen. Använd InvokeTestingPlatform och ange en absolut resultatkatalog.

Se även