Otestujte aplikace WinUI 3 pomocí MSTest a Microsoft. Testing.Platform

Použijte Microsoft. Test.Platform (MTP) pro spouštění testů MSTest v aplikaci WinUI 3 Aplikace WinUI funguje jako testovací hostitel. Vlastní vstupní bod aplikace, vlákno uživatelského rozhraní a životnost procesu.

Vyberte si mezi dvěma modely nasazení WinUI 3:

  • Rozbalená aplikace běží jako běžný spustitelný soubor Windows.
  • Zabalená plně důvěryhodná aplikace uchovává identitu balíčku MSIX a používá experimentální Microsoft.Testing.Extensions.PackagedApp rozšíření k registraci a aktivaci testovacího hostitele.

Important

Rozšíření zabalené aplikace podporuje plně důvěryhodné desktopové aplikace. Nepodporuje UPW ani jiné hostitele testů AppContainer.

Aktivace AUMID s úplným vztahem důvěryhodnosti se implementuje v microsoft/testfx úložišti, ale není k dispozici ve veřejném balíčku NuGet od 6. srpna 2026. Aktuální 1.0.0-alpha balíčky neobsahují implementaci aktivace specifické pro Windows. Zabalené nastavení použijte až po vydání balíčku identifikuje podporu úplné důvěryhodnosti registrace MSIX a aktivace AUMID.

Volba modelu nasazení

Před konfigurací testovacího projektu zvolte model nasazení.

Requirement Zvolit Testování spuštění hostitele
Vaše testy nepotřebují identitu balíčku ani rozhraní API, která vyžadují identitu balíčku. Unpackaged MTP spustí spustitelný soubor aplikace přímo.
Vaše testy vyžadují identitu balíčku MSIX nebo chování zabalené aplikace. Zabalený úplný vztah důvěryhodnosti po zpřístupnění verze MTP Preview Rozšíření zabalené aplikace zaregistruje výstup sestavení a aktivuje aplikaci podle ID modelu uživatele aplikace (AUMID).
Testy se musí spouštět v UPW nebo jiném AppContaineru. VSTest Rozšíření zabalené aplikace MTP nepodporuje izolaci AppContainer.

Pokud testy nevyžadují identitu balíčku, použijte rozbalenou aplikaci. Nevybalený model nevyžaduje registraci balíčku, vývojářský režim ani experimentální rozšíření zabalené aplikace.

Dokud veřejná verze MTP Preview neobsahuje registraci MSIX s úplným vztahem důvěryhodnosti a aktivaci AUMID, použijte VSTest k zabaleným testům WinUI 3 s plnou důvěryhodností.

Vysvětlení hranice UPW

Nezacházíme s UPW jako s jiným zabaleným modelem WinUI 3. Klasické projekty UPW, které cílí na UAP 10 i moderní .NET projekty UPW nastavené UseUwp tak, aby true běžely v AppContaineru. Zabalení desktopové aplikace WinUI 3 ho do modelu aplikace neumisťuje.

Použijte VSTest pro klasické testy UPW a moderní .NET UPW. Spouštěč zabalených aplikací MTP cílí na plně důvěryhodné hostitele sbalené plochy. Nemůže doručit své aktivační argumenty nebo připojení kontroleru k hostiteli AppContainer.

Moderní konfigurace .NET UPW najdete v ukázce MSTest .NET 9 UPW.

Konfigurace testovacího hostitele WinUI

Oba modely nasazení používají stejné nastavení MTP v místním prostředí.

Nastavení společných vlastností projektu

Nastavte tyto vlastnosti v testovacím projektu WinUI:

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

Použijte .NET 8 nebo novější podporovanou .NET verzi. Příklad cílí na verzi 10.0.19041.0platformy Windows . Toto rozšíření zabalené aplikace vyžaduje tuto verzi nebo novější.

Ponechte položku WinUI ApplicationDefinition , která odkazuje na soubor XAML testovací aplikace. WinUI vygeneruje z této položky vstupní bod. Pokud chcete zabránit generování druhého vstupního bodu MTP, nastavte GenerateTestingPlatformEntryPoint hodnotu false.

Přidejte odkazy na balíčky do aktuálních kompatibilních verzí MSTest a Microsoft. WindowsAppSDK.

Hostování MTP z aplikace

Přepsání OnLaunched ve třídě WinUI Application . Vytvořte a aktivujte testovací okno a pak publikujte frontu dispečera:

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

Přidat using Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer; pro UITestMethodAttribute.

Vytvořte aplikaci MTP z argumentů příkazového řádku. Pak zaregistrujte rozšíření, která MSBuild přispívá:

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

Přidejte using Microsoft.Testing.Platform.Builder; pro typy tvůrce MTP. Sestavení WinUI přidá EnableMSTestRunner do argumentů procesu. Vzhledem k tomu, že se nejedná o možnost příkazového řádku MTP, před vytvořením testovací aplikace ji odeberte.

Projekt zakáže vygenerovaný vstupní bod MTP, takže volání AddSelfRegisteredExtensions. U zabalené aplikace metoda také zaregistruje Microsoft.Testing.Extensions.PackagedApp spouštěč.

Do OnLaunchedbloku vložte vytvoření a spuštění try testovací aplikace. Přiřaďte výsledek await app.RunAsync() funkce Environment.ExitCode. finally V bloku zavřete okno a zavolejte metodu Exit aplikace.

Kroky životního cyklu poskytují dvě záruky:

  • Proces vrátí ukončovací kód MTP, takže neúspěšný test vytvoří nenulový ukončovací kód procesu.
  • Smyčka zpráv WinUI se zastaví po spuštění namísto aktivního testovacího procesu.

Warning

Nepřidávejte [assembly: WinUITestTarget(...)] do testovací aplikace WinUI v místním prostředí. Atribut spustí aplikaci WinUI pro samostatného testovacího hostitele. Nejdřív se volá Application.Start aplikace v místním prostředí. Atribut se pak pokusí spustit druhou aplikaci ve stejném procesu.

Úplnou implementaci najdete v rozbalené ukázce WinUI a zabalené ukázce WinUI.

Spouštění testů ve vlákně uživatelského rozhraní

Slouží UITestMethod k testování, který vytváří nebo přistupuje k objektům WinUI. MSTest naplánuje test ve frontě dispečera, který jste přiřadili během OnLaunched.

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

V frontě dispečera WinUI se nespustí pravidelná TestMethod . Použijte ho pro testy, které nevyžadují vlákno uživatelského rozhraní.

Konfigurace rozbalené testovací aplikace

Pro rozbalenou aplikaci přidejte tyto vlastnosti:

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

Neodkazujte na to Microsoft.Testing.Extensions.PackagedApp. Nevybalené aplikace nemá žádnou identitu MSIX ani AppxManifest.xml ve výstupu, takže MTP může spustitelný soubor spustitelný soubor přímo.

Ve výchozím nastavení Windows App SDK inicializátor bootstrap vloží, když projekt splňuje tyto podmínky:

  • WindowsPackageType je None.
  • OutputType je Exe nebo WinExe.
  • WindowsAppSDKSelfContained není true.

Pokud hostitel, který není Windows App SDK aplikace, načte testovací knihovnu, nastavte WindowsAppSdkBootstrapInitialize ji true v knihovně.

Note

VSTest nepodporuje tuto rozbalenou konfiguraci WinUI. Spusťte projekt pomocí MTP.

Konfigurace zabalené testovací aplikace s úplným vztahem důvěryhodnosti

Ponechte výchozí zabalenou konfiguraci WinUI:

  • Nenastavujte WindowsPackageType na None.
  • Uchovávejte a zachovejte Package.appxmanifest prostředky balíčku v projektu.
  • Nastavte EnableMsixTooling , true jestli váš projekt používá nástroje pro balení MSIX s jedním projektem.

Jakmile bude k dispozici verze Preview, která zahrnuje registraci MSIX s plnou důvěryhodností a aktivaci AUMID, přidejte danou konkrétní verzi Microsoft. Testing.Extensions.PackagedApp packagedApp. Pro toto nastavení nepoužívejte starší 1.0.0-alpha balíček.

Balíčky MSBuild props zaregistrují spouštěč prostřednictvím AddSelfRegisteredExtensions. Nevolejte AddPackagedAppDeploymentani . Spuštění MTP může zaregistrovat pouze jeden spouštěč testovacích hostitelů.

Spouštěč provádí tyto akce:

  1. AppxManifest.xml Vyhledá testovací spustitelný soubor.
  2. Zaregistruje rozložení výstupu sestavení v Windows.
  3. Řeší AUMID aplikace z registrovaného balíčku a ID aplikace manifestu.
  4. Aktivuje aplikaci službou AUMID a připojí aktivovaný proces k kontroleru MTP.

Spouštěč ignoruje nesouvisející manifest v nadřazeném adresáři, pokud Application položka odkazuje na testovací spustitelný soubor. Rozbalené aplikace, která odkazuje na balíček nepřímo, zůstává na cestě direct-start.

Před spuštěním zabalené testovací aplikace splníte tyto požadavky:

  • Použijte cílovou architekturu specifickou pro Windows s verzí 10.0.19041.0 platformy nebo novější.
  • Pokud chcete zaregistrovat nepodepsané rozložení výstupu sestavení, povolte vývojářský režim nebo nakonfigurujte zkušební načtení.
  • Použijte plně důvěryhodnou desktopovou aplikaci. Rozšíření nepodporuje UPW ani jiné hostitele AppContainer.

Caution

Microsoft.Testing.Extensions.PackagedApp ITestHostLauncher a bod rozšíření jsou experimentální. Budoucí verze se může změnit nebo odebrat jejich rozhraní API a chování. Před použitím zabaleného modelu v produkční testovací infrastruktuře vyhodnoťte rizika.

Spuštění testů

Z adresáře, který obsahuje testovací projekt WinUI, spusťte:

dotnet run

Chcete-li zadat projekt, použijte dotnet run --project .\WinUITests.csproj.

Pro rozbalenou aplikaci spustí MTP spustitelný soubor přímo. U zabalené aplikace zaregistruje spouštěč zabalených aplikací rozložení a aktivuje aplikaci pomocí AUMID.

V obou modelech se otevře testovací okno, MTP spustí testy a okno se zavře. Terminál pak nahlásí souhrn testu. Úspěšné spuštění skončí s kódem 0. Pokud test selže, OnLaunched přiřadí nenulový RunAsync výsledek Environment.ExitCode.

Používá se dotnet run pro některý z modelů. Pokud chcete spustit nebalenou aplikaci přímo, použijte vygenerovaný spustitelný soubor aplikace. Nepoužívejte, dotnet exec protože WinUI překládá prostředky PRI vzhledem k cestě procesu.

Řešení potíží s nastavením

Použijte tyto kontroly nejběžnějších chyb nastavení:

Symptom Zkontrolovat
Aplikace hlásí více volání Application.Start. WinUITestTarget Odeberte atribut z testovací aplikace v místním prostředí.
Testovací běh se dokončí, ale proces zůstane otevřený. Zavřete testovací okno a zavolat Exit do finally bloku za RunAsync.
Neúspěšné testy stále vrací ukončovací kód 0procesu . Přiřaďte výsledek RunAsync funkce Environment.ExitCode.
Nevybalené spuštění selže, protože AppxManifest.xml chybí. Ověřte, že projekt povolí MTP a že spuštění nepoužívá VSTest.
Zabalené spuštění nemůže zaregistrovat nebo aktivovat aplikaci. Potvrďte konfiguraci konfigurace Windows konkrétní cílové architektury, vývojářského režimu nebo zkušebního načtení, modelu plně důvěryhodné aplikace a spustitelné položky manifestu.

Viz také