Testowanie aplikacji WinUI 3 za pomocą biblioteki MSTest i Microsoft. Testing.Platform

Użyj Microsoft. Testing.Platform (MTP) do uruchamiania testów MSTest wewnątrz aplikacji WinUI 3. Aplikacja WinUI działa jako host testowy. Jest właścicielem punktu wejścia aplikacji, wątku interfejsu użytkownika i okresu istnienia procesu.

Wybierz między dwoma modelami wdrażania WinUI 3:

  • Rozpakowana aplikacja jest uruchamiana jako zwykły plik wykonywalny Windows.
  • Spakowana aplikacja o pełnym zaufaniu utrzymuje tożsamość pakietu MSIX i używa rozszerzenia eksperymentalnego Microsoft.Testing.Extensions.PackagedApp do rejestrowania i aktywowania hosta testowego.

Ważna

Rozszerzenie packaged-app obsługuje spakowane aplikacje klasyczne z pełnym zaufaniem. Nie obsługuje platformy UWP ani innych hostów testów appContainer.

Aktywacja AUMID z pełnym zaufaniem jest implementowana w microsoft/testfx repozytorium, ale nie jest dostępna w publicznym pakiecie NuGet od 6 sierpnia 2026 r. Bieżące 1.0.0-alpha pakiety nie zawierają implementacji aktywacji specyficznej dla Windows. Konfiguracja spakowana jest używana dopiero po zidentyfikowaniu obsługi pełnej rejestracji MSIX i aktywacji AUMID.

Wybieranie modelu wdrażania

Wybierz model wdrażania przed skonfigurowaniem projektu testowego.

Wymóg Wybierz Uruchamianie hosta testowego
Testy nie wymagają tożsamości pakietu ani interfejsów API, które wymagają tożsamości pakietu. Nieopakowany MTP uruchamia plik wykonywalny aplikacji bezpośrednio.
Testy wymagają tożsamości pakietu MSIX lub zachowania spakowanej aplikacji. Spakowane pełne zaufanie po udostępnieniu wersji zapoznawczej MTP Rozszerzenie packaged-app rejestruje dane wyjściowe kompilacji i aktywuje aplikację według identyfikatora modelu użytkownika aplikacji (AUMID).
Testy muszą być uruchamiane na platformie UWP lub w innej aplikacjiContainer. VSTest Rozszerzenie MTP packaged-app nie obsługuje izolacji appContainer.

Jeśli testy nie wymagają tożsamości pakietu, użyj rozpakowanej aplikacji. Rozpakowany model nie wymaga rejestracji pakietu, trybu dewelopera ani eksperymentalnego rozszerzenia spakowanej aplikacji.

Dopóki publiczna wersja zapoznawcza MTP nie obejmuje pełnej zaufania rejestracji MSIX i aktywacji AUMID, użyj narzędzia VSTest do spakowanych testów WinUI 3 z pełnym zaufaniem.

Omówienie granicy platformy UWP

Nie traktuj platformy UWP jako innego spakowanego modelu WinUI 3. Zarówno klasyczne projekty platformy UWP przeznaczone dla protokołu UAP 10, jak i nowoczesne .NET projektów platformy UWP, które mają UseUwp być true uruchamiane w aplikacji AppContainer. Tworzenie pakietów aplikacji klasycznych WinUI 3 nie umieszcza jej w tym modelu aplikacji.

Użyj narzędzia VSTest dla klasycznej platformy UWP i nowoczesnych testów platformy uwP .NET. Moduł uruchamiania spakowanych aplikacji MTP jest przeznaczony dla hostów komputerów z pakietem o pełnym zaufaniu. Nie może dostarczyć argumentów aktywacji ani połączenia kontrolera z hostem AppContainer.

Aby zapoznać się z nowoczesną konfiguracją platformy UWP .NET, zobacz przykład MSTest .NET 9 platformy UWP.

Konfigurowanie hosta testowego winUI

Oba modele wdrażania korzystają z tej samej konfiguracji własnego protokołu MTP.

Ustawianie typowych właściwości projektu

Ustaw te właściwości w projekcie testowym WinUI:

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

Użyj .NET 8 lub nowszej obsługiwanej wersji .NET. Przykład dotyczy wersji platformy 10.0.19041.0Windows . Rozszerzenie spakowanej aplikacji wymaga tej wersji lub nowszej.

Zachowaj element WinUI ApplicationDefinition wskazujący plik XAML aplikacji testowej. WinUI generuje punkt wejścia z tego elementu. Aby zapobiec generowaniu drugiego punktu wejścia przez MTP, ustaw wartość GenerateTestingPlatformEntryPointfalse.

Dodaj odwołania do pakietów do bieżących zgodnych wersji bibliotek MSTest i Microsoft. WindowsAppSDK.

Hostowanie protokołu MTP z aplikacji

Zastąpuj OnLaunched w klasie WinUI Application . Utwórz i aktywuj okno testu, a następnie opublikuj kolejkę dyspozytora:

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

Dodaj using Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer; dla elementu UITestMethodAttribute.

Utwórz aplikację MTP na podstawie argumentów wiersza polecenia. Następnie zarejestruj rozszerzenia współtworzenia programu MSBuild:

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

Dodaj using Microsoft.Testing.Platform.Builder; dla typów konstruktora MTP. Kompilacja WinUI dodaje EnableMSTestRunner argumenty procesu. Ponieważ nie jest to opcja wiersza polecenia MTP, usuń ją przed utworzeniem aplikacji testowej.

Projekt wyłącza wygenerowany punkt wejścia MTP, więc wywołaj metodę AddSelfRegisteredExtensions. W przypadku spakowanej aplikacji metoda rejestruje również moduł uruchamiania Microsoft.Testing.Extensions.PackagedApp .

W OnLaunchedpliku umieść testowe tworzenie i wykonywanie aplikacji w try bloku. Przypisz wynik await app.RunAsync() do Environment.ExitCode. finally W bloku zamknij okno i wywołaj metodę aplikacjiExit.

Kroki cyklu życia zapewniają dwie gwarancje:

  • Proces zwraca kod zakończenia MTP, więc test, który zakończył się niepowodzeniem, generuje kod zakończenia procesu niezerowego.
  • Pętla komunikatów WinUI zatrzymuje się po uruchomieniu zamiast opuszczać aktywny proces testowy.

Warning

Nie należy dodawać [assembly: WinUITestTarget(...)] do własnej aplikacji testowej WinUI. Atrybut uruchamia aplikację WinUI dla oddzielnego hosta testowego. Aplikacja hostowana samodzielnie wywołuje Application.Start najpierw. Następnie atrybut próbuje uruchomić drugą aplikację w tym samym procesie.

Aby uzyskać pełną implementację, zobacz rozpakowany przykład WinUI i spakowany przykład WinUI.

Uruchamianie testów w wątku interfejsu użytkownika

Służy UITestMethod do testowania, który tworzy lub uzyskuje dostęp do obiektów WinUI. Narzędzie MSTest planuje test w kolejce dyspozytora, która została przypisana podczas OnLaunched.

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

Zwykły TestMethod element nie jest uruchamiany w kolejce dyspozytora WinUI. Użyj go do testów, które nie wymagają wątku interfejsu użytkownika.

Konfigurowanie rozpakowanej aplikacji testowej

W przypadku aplikacji rozpakowanej dodaj następujące właściwości:

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

Nie odwołuje się do Microsoft.Testing.Extensions.PackagedApp. Rozpakowana aplikacja nie ma tożsamości MSIX ani AppxManifest.xml w danych wyjściowych, więc MTP może bezpośrednio uruchomić plik wykonywalny.

Domyślnie Zestaw SDK do aplikacji systemu Windows inicjuje inicjator bootstrap, gdy projekt spełnia następujące warunki:

  • Parametr WindowsPackageType ma wartość None.
  • OutputType jest Exe lub WinExe.
  • WindowsAppSDKSelfContained nie jest true.

Jeśli host, który nie jest aplikacją Zestaw SDK do aplikacji systemu Windows ładuje bibliotekę testową, ustaw ją WindowsAppSdkBootstrapInitialize na true wartość w bibliotece.

Note

Program VSTest nie obsługuje tej niepakowanej konfiguracji winUI. Uruchom projekt przy użyciu protokołu MTP.

Konfigurowanie spakowanej aplikacji testowej o pełnym zaufaniu

Zachowaj domyślną konfigurację pakietu WinUI:

  • Nie ustawiaj WindowsPackageType na None.
  • Zachowaj Package.appxmanifest i zasoby pakietu w projekcie.
  • Ustaw EnableMsixTooling wartość na true , jeśli projekt używa narzędzi do tworzenia pakietów MSIX z jednym projektem.

Po udostępnieniu wersji zapoznawczej obejmującej rejestrację MSIX z pełnym zaufaniem i aktywację AUMID dodaj określoną wersję Microsoft. Testing.Extensions.PackagedApp packaged. Nie używaj wcześniejszego 1.0.0-alpha pakietu dla tej konfiguracji.

Rekwizyty MSBuild pakietu rejestrują moduł uruchamiania za pomocą polecenia AddSelfRegisteredExtensions. Nie należy również wywoływać metody AddPackagedAppDeployment. Przebieg MTP może zarejestrować tylko jeden testowy moduł uruchamiania hosta.

Uruchamianie wykonuje następujące akcje:

  1. Sprawdza plik AppxManifest.xml wykonywalny testowy.
  2. Rejestruje układ danych wyjściowych kompilacji za pomocą Windows.
  3. Rozpoznaje identyfikator AUMID aplikacji z zarejestrowanego pakietu i identyfikatora aplikacji manifestu.
  4. Aktywuje aplikację za pomocą identyfikatora AUMID i łączy aktywowany proces z kontrolerem MTP.

Uruchamianie ignoruje niepowiązany manifest w katalogu nadrzędnym, chyba że Application punkt wejścia wskazuje testowy plik wykonywalny. Rozpakowana aplikacja, która odwołuje się do pakietu pośrednio, pozostaje na ścieżce bezpośredniego uruchamiania.

Przed uruchomieniem spakowanej aplikacji testowej spełnij następujące wymagania:

  • Użyj platformy docelowej specyficznej dla Windows z wersją 10.0.19041.0 platformy lub nowszą.
  • Aby zarejestrować niepodpisany układ danych wyjściowych kompilacji, włącz tryb dewelopera lub skonfiguruj ładowanie bezpośrednie.
  • Użyj spakowanej aplikacji klasycznej o pełnym zaufaniu. Rozszerzenie nie obsługuje platformy UWP ani innych hostów AppContainer.

Caution

Microsoft.Testing.Extensions.PackagedApp ITestHostLauncher i punkt rozszerzenia są eksperymentalne. Przyszłe wydanie może ulec zmianie lub usunąć swoje interfejsy API i zachowanie. Oceń czynniki ryzyka przed użyciem spakowanego modelu w produkcyjnej infrastrukturze testowej.

Uruchamianie testów

W katalogu zawierającym projekt testowy WinUI uruchom polecenie:

dotnet run

Aby określić projekt, użyj polecenia dotnet run --project .\WinUITests.csproj.

W przypadku aplikacji rozpakowanej MTP uruchamia plik wykonywalny bezpośrednio. W przypadku spakowanej aplikacji spakowane uruchamianie aplikacji rejestruje układ i aktywuje aplikację według identyfikatora AUMID.

W obu modelach zostanie otwarte okno testowe, narzędzie MTP uruchamia testy, a okno zostanie zamknięte. Następnie terminal raportuje podsumowanie testu. Pomyślne zakończenie przebiegu z kodem 0. Gdy test zakończy się niepowodzeniem, OnLaunched przypisuje wynik niezerowy RunAsync do Environment.ExitCodeelementu .

Użyj dla dotnet run dowolnego modelu. Aby bezpośrednio uruchomić rozpakowaną aplikację, użyj wygenerowanego pliku wykonywalnego aplikacji. Nie używaj dotnet exec , ponieważ usługa WinUI rozpoznaje zasoby PRI względem ścieżki procesu.

Rozwiązywanie problemów z konfiguracją

Użyj tych testów, aby uzyskać najbardziej typowe błędy instalacji:

Objaw Sprawdź
Aplikacja zgłasza wiele wywołań do Application.Start. WinUITestTarget Usuń atrybut z aplikacji testowej hostowanej samodzielnie.
Przebieg testu kończy się, ale proces pozostaje otwarty. Zamknij okno testu i wywołaj finally polecenie Exit w bloku po RunAsync.
Testy, które zakończyły się niepowodzeniem, nadal zwracają kod 0zakończenia procesu . Przypisz wynik RunAsync do Environment.ExitCode.
Rozpakowany przebieg kończy się niepowodzeniem, ponieważ AppxManifest.xml brakuje go. Upewnij się, że projekt włącza MTP i że przebieg nie używa narzędzia VSTest.
Spakowany przebieg nie może zarejestrować ani aktywować aplikacji. Potwierdź platformę docelową specyficzną dla Windows, tryb dewelopera lub konfigurację ładowania bezpośredniego, model aplikacji o pełnym zaufaniu i wpis wykonywalny manifestu.

Zobacz także