Lingua

Testare le app desktop Windows con MSTest Automazione interfaccia utente

Il pacchetto di anteprima MSTest.Windows.UIAutomation integra la gestione del ciclo di vita di MSTest con l'API di Windows Automazione interfaccia utente predefinita. Usalo per avviare un'applicazione desktop non pacchettizzata a attendibilità totale, trovare una delle sue finestre come AutomationElement e arrestare l'applicazione dopo ogni test.

Il pacchetto supporta le applicazioni Win32, Windows Forms e macchine virtuali Windows in una sessione interattiva di Windows. Non fornisce l'attivazione MSIX, UWP o WinUI, l'automazione con privilegi elevati dei processi, un desktop headless, localizzatori, attese automatiche, screenshot o un modello a oggetti a più finestre.

Importante

Questa funzionalità richiede pacchetti di anteprima MSTest 4.5 e un framework di destinazione specifico di Windows.

Abilitare Windows Automazione interfaccia utente

Con MSTest.Sdk, impostare EnableWindowsUIAutomation su true:

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

MSTest.Sdk aggiunge il pacchetto corrispondente MSTest.Windows.UIAutomation . Senza MSTest.Sdk, fare riferimento a MSTest.Windows.UIAutomation, MSTest.TestFramework e MSTest.TestAdapter nelle versioni MSTest corrispondenti. Indicare separatamente una versione compatibile Microsoft.NET.Test.Sdk, perché segue la linea di versione di VSTest.

Per un progetto destinato a Windows che viene ripristinato o compilato in Linux o macOS, impostare EnableWindowsTargeting su true.

Scegliere una classe base

Derivare da una di queste classi:

  • ApplicationTest avvia l'applicazione prima di ogni test e la arresta durante l'eliminazione. Sostituire CreateProcessStartInfo per identificare l'eseguibile.
  • WindowTest attende anche una finestra e la espone tramite MainWindow.

Dichiarare STATestClass direttamente in ogni classe di test concreto perché gli attributi della classe di test MSTest non vengono ereditati:

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

Usare MainWindow nei metodi di test per eseguire query o richiamare modelli di Windows Automazione interfaccia utente. Il pacchetto usa l'API UIA2 System.Windows.Automation . Puoi aggiungere un'altra libreria, ad esempio FlaUI, sull'elemento esposto AutomationElement quando servono interazioni più avanzate con gli elementi.

Personalizzare l'avvio e il rilevamento delle finestre

Eseguire l'override di questi membri quando le impostazioni predefinite non rientrano nell'applicazione:

  • ApplicationShutdownTimeout determina per quanto tempo la classe base attende l'arresto graduale e la terminazione forzata. Il valore predefinito è cinque secondi.
  • WindowDiscoveryTimeout controlla il tempo WindowTest di attesa di una finestra. Il valore predefinito è 10 secondi.
  • FindWindow seleziona una finestra per le applicazioni che usano un processo di avvio, visualizza una schermata iniziale o crea più finestre di primo livello.
  • StopApplication arresta un'applicazione quando la finestra selezionata appartiene a un processo diverso dal processo avviato CreateProcessStartInfo .

Le classi di base monitorano TestContext.CancellationToken durante l'avvio e l'individuazione della finestra. WindowTest non riesce quando l'applicazione si chiude prima che venga visualizzata una finestra o quando il rilevamento raggiunge il timeout previsto.

Comprendere il comportamento del ciclo di vita

ApplicationTest avvia un processo di applicazione per ogni invocazione di test. WindowTest individua la finestra dopo l'avvio del processo. Al termine del test e dei relativi metodi di pulizia, MSTest elimina la classe base, richiede una chiusura normale nella finestra principale e termina l'albero dei processi se l'applicazione non viene chiusa entro il timeout configurato.

Per i test parametrizzati e i nuovi tentativi, ogni chiamata dispone del proprio ciclo di vita dell'applicazione.

Vedere anche