Die Kladde läuft auf Ihrem Rechner. Zwischen diesem Zustand und einem Programm in fremder Hand liegen zwei Dinge: Belege, dass es tut, was es soll, und ein Paket, das jemand installieren kann. Die Lektion behandelt beides in dieser Reihenfolge und endet mit einem signierten MSIX-Paket, das Sie installiert und wieder entfernt haben, und mit einer Liste der Daten, die die App verarbeitet. In einen Store laden Sie in diesem Kurs nichts hoch. Wer ein vorhandenes WPF- oder Windows-Forms-Programm verpacken oder per ClickOnce verteilen will, findet das im Kurs Modernisierung.
Wie bisher: src/Kladde.Desktop (die App), src/Kladde.Desktop.Logic (die Bibliothek), tests/Kladde.Desktop.Logic.Tests. Passen Sie die Namen an Ihre Projekte an.
Stand der Prüfung. Die Befehle zum Bauen, Signieren, Installieren und Veröffentlichen und alle Projekteigenschaften stammen aus Microsoft Learn und wurden nicht ausgeführt; beim Schreiben stand kein Windows-Rechner mit WinUI-Werkzeugen und kein
signtoolzur Verfügung. Eine Ausgabe wird deshalb beschrieben, nie gezeigt. Dateinamen von Paketen und Ordner im Build-Ergebnis hängen von Ihrem Projekt ab und werden hier nicht erfunden. Ausgeführt wurden nur die reinen Klassen der Bibliothek aus Lektion 0301 mit ihren xUnit-Tests (.NET 10, Exit-Code 0). Wo Learn sich an zwei Stellen unterscheidet, steht offen. Spielen Sie die Übungen auf einem Windows-Rechner durch und vergleichen Sie jede Stelle mit der verlinkten Seite.
Was welcher Test prüft
Eine Windows-App hat mehr Orte für Fehler als eine Webseite: Fenster, Paket, Berechtigungen, Skalierung, Tastatur. Kein Test deckt alles ab.
| Test | Läuft | Prüft | Prüft nicht |
|---|---|---|---|
xUnit-Test der ViewModels und Regeln (Lektion 0201) in Kladde.Desktop.Logic.Tests |
auf Ihrem Rechner, ohne Fenster | Regeln, Befehle, Zustand, Fehlerfälle | wie etwas aussieht, ob eine XAML-Bindung greift |
Test mit [UITestMethod] in einer WinUI-Test-App |
in einer App mit UI-Thread | Code, der Microsoft.UI.Xaml-Typen braucht |
das Zusammenspiel der ganzen Oberfläche |
| UI-Test mit Appium und Windows-Treiber | gegen die laufende, fertige App | Bedienung: klicken, eingeben, Seiten wechseln | einzelne Regeln; dafür gibt es die Unit-Tests |
| Accessibility Insights for Windows | gegen die laufende App | den Baum der UI-Automatisierung | ob die App richtig rechnet |
| Playwright | gegen WebView2-Teile | die Webinhalte in der App | die nativen Steuerelemente |
| Handprobe | auf einem echten Rechner, am besten einem frischen | was ein Mensch merkt, auch das Paket selbst | Wiederholbarkeit |
Warum Code in eine Bibliothek gehört
Die meisten Typen aus Microsoft.UI.Xaml lassen sich nur auf dem UI-Thread einer XAML-Anwendung benutzen. Learn empfiehlt deshalb, zu testenden Code aus dem App-Projekt in ein Bibliotheksprojekt zu ziehen, das App und
Testprojekt beide referenzieren. Genau das hat die Kladde seit Lektion 0201: ViewModels, Regeln, der Planer der Erinnerungen und die Platzierungsregel aus 0301 liegen in Kladde.Desktop.Logic und laufen mit xUnit,
ohne Fenster. Dass dotnet test den Exit-Code 0 liefert, ist der schnellste Beleg, den Sie haben, und er gehört in jede Änderung. Lesen Sie den Code, nicht die Meldung „Bestanden“: Prüfen Sie $LASTEXITCODE.
Ein xUnit-, NUnit- oder MSTest-Projekt, das ein WinUI-Projekt referenziert, braucht nach Learn drei Anpassungen: Das TargetFramework muss zu dem des WinUI-Projekts passen (etwa net10.0-windows10.0.19041.0, nicht
net10.0), die RuntimeIdentifiers müssen stimmen (win-x86;win-x64;win-arm64), und <WindowsAppSdkBootstrapInitialize>true</WindowsAppSdkBootstrapInitialize> sorgt dafür, dass der Test die Laufzeit des Windows App SDK lädt.
Außerdem muss die Laufzeit auf dem Rechner installiert sein. Ihre Bibliothek referenziert kein WinUI und braucht nichts davon.
Tests mit UITestMethod
Braucht ein Test eine echte Oberfläche (ein UserControl, ein Steuerelement), läuft er in einer WinUI-Test-App. In Visual Studio heißt die Vorlage „WinUI Unit Test App“; sie legt eine App an, die einen
UI-Thread erzeugt und die Tests darauf ausführt. Tests, die diesen Thread brauchen, tragen [UITestMethod] statt [TestMethod]:
[UITestMethod]
public void TestUserControl1()
{
var control = new WinUIClassLibrary1.UserControl1();
Assert.AreEqual(7, control.GetSeven());
}
Learns Anleitung legt dazu eine WinUI-Klassenbibliothek mit dem UserControl an und referenziert sie vom Test aus: derselbe Gedanke, dass der Code in einer Bibliothek liegt und nicht in der App.
MSTest mit Microsoft.Testing.Platform
Für WinUI-3-Projekte nennt Learn zusätzlich den Weg über MSTest und die Microsoft.Testing.Platform (MTP). Die Aussagen im Überblick: Gepackte WinUI-3-Apps mit voller Vertrauensstufe, ungepackte und solche im
AppContainer werden unterstützt. Das Projekt nutzt MSTest.Sdk ab 4.5, setzt UseWinUI auf true und zielt auf ein Windows-Zielframework. Bei einer ungepackten App steht WindowsPackageType auf None, und MTP startet die
.exe direkt; bei einer gepackten registriert ein Hilfsprozess das Paket und startet die App. VSTest unterstützt ungepackte WinUI-3-Apps nicht. Gebaut und gestartet wird für eine feste Architektur:
dotnet build -p:Platform=x64
dotnet test --project . --no-build -p:Platform=x64
Learn nennt drei Stolperstellen: Fehlgeschlagene Tests liefern den Exit-Code 0, wenn das Ergebnis des MTP-Laufs nicht in Environment.ExitCode gelandet ist. Der Prozess bleibt offen, wenn das Testfenster nicht
geschlossen und Exit nicht gerufen wird. Und dotnet exec geht nicht, weil WinUI seine Ressourcen relativ zum Prozesspfad sucht. Die vollständige Unterstützung nennt Learn ab MSTest 4.5 und MTP 2.5; bis die stabilen
Fassungen erscheinen, brauchen Sie passende Vorschau-Pakete. Prüfen Sie den Stand, bevor Sie sich darauf stützen. Der Kurs bleibt bei xUnit für die Bibliothek (Lektion 0201) und nennt MSTest für die Tests, die XAML-Typen brauchen.
UI-Tests mit Appium
WinAppDriver war Microsofts Werkzeug für UI-Tests unter Windows und wird nach Learn nicht mehr weiterentwickelt. Der empfohlene Nachfolger ist Appium mit dem Windows-Treiber (appium-windows-driver); beide sprechen
das WebDriver-Protokoll und bedienen Windows-Programme über die UI-Automatisierung. Die Vorbereitung nach Learn, mit Node.js:
npm install -g appium
appium driver install windows
appium driver list
appium
Die dritte Zeile soll windows als installiert zeigen, die vierte startet den Server. Geschrieben wird der Test mit einer WebDriver-Bibliothek (es gibt C#); die Fähigkeit app nennt für eine gepackte App die
AUMID, für eine ungepackte den Pfad der .exe. Welche Eigenschaft eines WinUI-Elements Appium als Kennung nimmt (üblich ist AutomationProperties.AutomationId), haben wir für WinUI nicht gelesen: offen;
bei MAUI (Kurs W2) lautet die Kennung AutomationId, aber das ist eine andere Oberfläche.
Accessibility Insights for Windows prüft denselben Baum der UI-Automatisierung, den auch Testwerkzeuge benutzen: Ist er gut aufgebaut, nützt das Testbarkeit und Barrierefreiheit. Playwright kann sich mit WebView2-Instanzen verbinden, falls die Kladde Webinhalte zeigt; die nativen Steuerelemente sieht es nicht.