Språk

Testa Windows skrivbordsappar med MSTest UI Automation

Förhandsversionspaketet MSTest.Windows.UIAutomation integrerar MSTest-livscykelhantering med det inbyggda Windows UI Automation-API:et. Använd den för att starta en opaketerad skrivbordsapp med fullständig behörighet, hitta något av dess fönster som ett AutomationElement och stoppa appen efter varje test.

Paketet stöder Win32-, Windows Forms- och WPF-program i en interaktiv Windows session. Den tillhandahåller inte MSIX-, UWP- eller WinUI-aktivering, förhöjd processautomatisering, ett huvudlöst skrivbord, positionerare, automatiska väntetider, skärmbilder eller en objektmodell med flera fönster.

Important

Den här funktionen kräver MSTest 4.5-förhandsversionspaket och ett Windows specifikt målramverk.

Aktivera Windows UI Automation

Med MSTest.Sdk anger du EnableWindowsUIAutomation till true:

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

MSTest.Sdk lägger till matchande MSTest.Windows.UIAutomation paket. Utan MSTest.Sdk refererar du till MSTest.Windows.UIAutomation, MSTest.TestFrameworkoch MSTest.TestAdapter vid matchande MSTest-versioner. Referera till en kompatibel Microsoft.NET.Test.Sdk version separat eftersom den följer vsTest-versionsraden.

För ett Windows målprojekt som återställer eller bygger på Linux eller macOS anger du EnableWindowsTargeting till true.

Välj en basklass

Härled från någon av dessa klasser:

  • ApplicationTest startar programmet före varje test och stoppar det under bortskaffandet. Åsidosätt CreateProcessStartInfo för att identifiera den körbara filen.
  • WindowTest väntar också på ett fönster och exponerar det via MainWindow.

Deklarera STATestClass direkt i varje konkret testklass eftersom MSTest-testklassattribut inte ärvs:

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

Använd MainWindow i testmetoderna för att fråga efter eller anropa Windows UI Automation mönster. Paketet använder UIA2-API System.Windows.Automation :et. Du kan lägga ett annat bibliotek, till exempel FlaUI, över det exponerade AutomationElement när du behöver mer omfattande elementinteraktion.

Anpassa start och identifiering av fönster

Åsidosätt dessa medlemmar när standardinställningarna inte passar ditt program:

  • ApplicationShutdownTimeout styr hur länge basklassen väntar på mjuk avstängning och tvångsavslutning. Standardvärdet är fem sekunder.
  • WindowDiscoveryTimeout styr hur länge WindowTest väntar på ett fönster. Standardvärdet är 10 sekunder.
  • FindWindow väljer ett fönster för program som använder en startprocess, visar en välkomstskärm eller skapar flera fönster på den översta nivån.
  • StopApplication stänger av ett program när det valda fönstret tillhör en annan process än den process som CreateProcessStartInfo startades.

Basklasserna observerar TestContext.CancellationToken under start- och fönsteridentifiering. WindowTest misslyckas när applikationen avslutas innan ett fönster visas eller när upptäckten når sin tidsgräns.

Förstå livscykelbeteende

ApplicationTest startar en programprocess för varje testanrop. WindowTest identifierar fönstret när processen har startats. När testet och dess rensningsmetoder har slutförts tar MSTest bort basklassen, begär en graciös stängning genom huvudfönstret och avslutar processträdet om programmet inte avslutas inom den konfigurerade tidsgränsen.

För parametriserade tester och återförsök får varje anrop sin egen programlivscykel.

Se även