Taal

Desktop-apps Windows testen met MSTest UI Automation

Het preview-pakket MSTest.Windows.UIAutomation integreert het levenscyclusbeheer van MSTest met de ingebouwde Windows UI Automation-API. Gebruik dit om een niet-verpakte desktoptoepassing met volledig vertrouwen te starten, een van de vensters te vinden als een AutomationElement, en de toepassing na elke test te stoppen.

Het pakket ondersteunt Win32-, Windows Forms- en WPF-toepassingen in een interactieve Windows sessie. Het biedt geen MSIX-, UWP- of WinUI-activering, automatisering met verhoogde processen, een headless desktop, locators, automatische wachttijden, schermopnamen of een objectmodel met meerdere vensters.

Important

Voor deze functie zijn MSTest 4.5 preview-pakketten en een Windows-specifiek doelframework vereist.

Windows UI Automation inschakelen

Met MSTest.Sdk, stel EnableWindowsUIAutomation in op true:

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

MSTest.Sdk voegt het overeenkomende MSTest.Windows.UIAutomation pakket toe. Zonder MSTest.Sdk, verwijs naar MSTest.Windows.UIAutomation, MSTest.TestFramework en MSTest.TestAdapter met overeenkomende MSTest-versies. Verwijs afzonderlijk naar een compatibele Microsoft.NET.Test.Sdk versie omdat deze de VSTest-versieregel volgt.

Voor een op Windows gericht project dat op Linux of macOS wordt hersteld of gebouwd, stelt u EnableWindowsTargeting in op true.

Een basisklasse kiezen

Afgeleid van een van deze klassen:

  • ApplicationTest start de toepassing vóór elke test en stopt deze tijdens verwijdering. Overschrijf CreateProcessStartInfo om het uitvoerbare bestand te identificeren.
  • WindowTest wacht ook op een venster en maakt het zichtbaar via MainWindow.

Definieer STATestClass direct op elke concrete testklasse, omdat MSTest-testklasse-attributen niet worden overgenomen:

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

Gebruik MainWindow in uw testmethoden om Windows UI Automation patronen op te vragen of aan te roepen. Het pakket maakt gebruik van de UIA2-API System.Windows.Automation . U kunt een andere bibliotheek, zoals FlaUI, boven op de beschikbaar gestelde AutomationElement gebruiken wanneer u uitgebreidere interactie met elementen nodig hebt.

Opstart- en vensterdetectie aanpassen

Overschrijf deze leden wanneer de standaardinstellingen niet passen bij uw toepassing:

  • ApplicationShutdownTimeout bepaalt hoe lang de basisklasse wacht op een ordelijke afsluiting voordat geforceerde beëindiging plaatsvindt. De standaardwaarde is vijf seconden.
  • WindowDiscoveryTimeout bepaalt hoe lang moet worden gewacht WindowTest op een venster. De standaardwaarde is 10 seconden.
  • FindWindow selecteert een venster voor toepassingen die gebruikmaken van een startprogramma, een welkomstscherm weergeven of meerdere vensters op het hoogste niveau maken.
  • StopApplication sluit een toepassing af wanneer het geselecteerde venster deel uitmaakt van een ander proces dan het proces dat CreateProcessStartInfo is gestart.

De basisklassen monitoren TestContext.CancellationToken tijdens het opstarten en de vensterdetectie. WindowTest mislukt wanneer de toepassing wordt afgesloten voordat een venster wordt weergegeven of wanneer de detectie de time-out bereikt.

Het gedrag van de levenscyclus begrijpen

ApplicationTest start één toepassingsproces voor elke test aanroep. WindowTest detecteert het venster nadat het proces is gestart. Nadat de test en de opschoningsmethoden zijn voltooid, ruimt MSTest de basisklasse op, verzoekt het via het hoofdvenster om de toepassing netjes af te sluiten en beëindigt het de procesboom als de toepassing niet binnen de geconfigureerde time-out wordt afgesloten.

Voor geparameteriseerde tests en nieuwe pogingen ontvangt elke aanroep een eigen toepassingslevenscyclus.

Zie ook