Sprache

Testen Windows Desktop-Apps mit MSTest-Benutzeroberflächenautomatisierung

Das Vorschaupaket MSTest.Windows.UIAutomation integriert die MSTest-Lebenszyklusverwaltung in die integrierte Windows Benutzeroberflächenautomatisierung-API. Verwenden Sie sie, um eine nicht paketierte Full-Trust-Desktopanwendung zu starten, eines ihrer Fenster als AutomationElement zu finden und die Anwendung nach jedem Test zu beenden.

Das Paket unterstützt Win32-, Windows Forms- und WPF-Anwendungen in einer interaktiven Windows Sitzung. Es bietet keine MSIX-, UWP- oder WinUI-Aktivierung, Automatisierung mit erhöhten Prozessen, einen kopflosen Desktop, Locators, automatische Wartezeiten, Screenshots oder ein Objektmodell mit mehreren Fenstern.

Important

Für dieses Feature sind MSTest 4.5-Vorschaupakete und ein Windows spezifisches Zielframework erforderlich.

Aktivieren von Windows Benutzeroberflächenautomatisierung

Legen Sie mit MSTest.Sdk EnableWindowsUIAutomation auf true fest:

<Project Sdk="MSTest.Sdk/4.5.0">
  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <EnableWindowsUIAutomation>true</EnableWindowsUIAutomation>
  </PropertyGroup>
</Project>

MSTest.Sdk fügt das entsprechende MSTest.Windows.UIAutomation Paket hinzu. Ohne MSTest.Sdk verweisen Sie auf MSTest.Windows.UIAutomation, MSTest.TestFramework und MSTest.TestAdapter in passenden MSTest-Versionen. Verweisen Sie separat auf eine kompatible Microsoft.NET.Test.Sdk Version, da sie der VsTest-Versionszeile folgt.

Legen Sie bei einem Projekt mit Windows als Zielplattform, das unter Linux oder macOS wiederhergestellt oder erstellt wird, EnableWindowsTargeting auf true fest.

Auswählen einer Basisklasse

Abgeleitet von einer der folgenden Klassen:

  • ApplicationTest startet die Anwendung vor jedem Test und beendet sie während der Entsorgung. Überschreibt CreateProcessStartInfo, um die ausführbare Datei zu bestimmen.
  • WindowTest wartet auch auf ein Fenster und stellt es über MainWindow bereit.

Deklarieren Sie STATestClass direkt für jede konkrete Testklasse, da MSTest-Testklassenattribute nicht geerbt werden:

using System.Diagnostics;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Windows.UIAutomation;

[STATestClass]
public sealed class MyAppTests : WindowTest
{
    protected override ProcessStartInfo CreateProcessStartInfo()
        => new(@"C:\MyApp\MyApp.exe");
}
Imports System.Diagnostics
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports Microsoft.VisualStudio.TestTools.UnitTesting.Windows.UIAutomation

<STATestClass>
Public NotInheritable Class MyAppTests
    Inherits WindowTest

    Protected Overrides Function CreateProcessStartInfo() As ProcessStartInfo
        Return New ProcessStartInfo("C:\MyApp\MyApp.exe")
    End Function
End Class

Verwenden Sie in Ihren Testmethoden MainWindow, um Windows Benutzeroberflächenautomatisierung-Muster abzufragen oder aufzurufen. Das Paket verwendet die UIA2-API System.Windows.Automation . Sie können eine weitere Bibliothek, beispielsweise FlaUI, auf die bereitgestellten AutomationElement aufsetzen, wenn Sie eine weitergehende Interaktion mit Elementen benötigen.

Anpassen von Startvorgang und Fenstererkennung

Überschreiben Sie diese Elemente, wenn die Standardimplementierungen nicht zu Ihrer Anwendung passen:

  • ApplicationShutdownTimeout steuert, wie lange die Basisklasse auf das ordnungsgemäße Herunterfahren und die erzwungene Beendigung wartet. Der Standardwert ist fünf Sekunden.
  • WindowDiscoveryTimeout steuert, wie lange WindowTest auf ein Fenster gewartet wird. Der Standardwert ist 10 Sekunden.
  • FindWindow wählt ein Fenster für Anwendungen aus, die einen Startprogrammprozess verwenden, einen Begrüßungsbildschirm anzeigen oder mehrere Fenster der obersten Ebene erstellen.
  • StopApplication beendet eine Anwendung, wenn das ausgewählte Fenster zu einem anderen Prozess als dem gestarteten Prozess CreateProcessStartInfo gehört.

Die Basisklassen überwachen TestContext.CancellationToken während des Startvorgangs und der Fenstererkennung. WindowTest schlägt fehl, wenn die Anwendung beendet wird, bevor ein Fenster erscheint, oder wenn die Suche ihr Zeitlimit erreicht.

Grundlegendes zum Lebenszyklusverhalten

ApplicationTest startet einen Anwendungsprozess für jeden Testaufruf. WindowTest ermittelt das Fenster, nachdem der Prozess gestartet wurde. Nach Abschluss des Tests und der zugehörigen Bereinigungsmethoden entfernt MSTest die Basisklasse, fordert eine ordnungsgemäße Schließung über das Hauptfenster an und beendet die Prozessstruktur, wenn die Anwendung nicht innerhalb des konfigurierten Timeouts beendet wird.

Bei parametrisierten Tests und Wiederholungen erhält jeder Aufruf einen eigenen Anwendungslebenszyklus.

Siehe auch