Langue

Tester Windows applications de bureau avec MSTest UI Automation

Le package en préversion MSTest.Windows.UIAutomation intègre la gestion du cycle de vie MSTest avec l’API intégrée Windows UI Automation. Utilisez-la pour lancer une application de bureau de confiance totale non empaquetée, recherchez l’une de ses fenêtres en tant que AutomationElement, puis arrêtez l’application après chaque test.

Le package prend en charge les applications Win32, Windows Forms et WPF dans une session de Windows interactive. Il ne fournit pas d’activation MSIX, UWP ou WinUI, d’automatisation avec élévation de processus, d’un bureau sans tête, de localisateurs, d’attentes automatiques, de captures d’écran ou d’un modèle objet multi-fenêtre.

Important

Cette fonctionnalité nécessite des packages d’évaluation MSTest 4.5 et une infrastructure cible spécifique à Windows.

Activer Windows UI Automation

Avec MSTest.Sdk, définissez EnableWindowsUIAutomation sur true:

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

MSTest.Sdk ajoute le package correspondant MSTest.Windows.UIAutomation . En l’absence de MSTest.Sdk, référencez MSTest.Windows.UIAutomation, MSTest.TestAdapter et MSTest.TestFramework dans des versions MSTest correspondantes. Référencez une version compatible Microsoft.NET.Test.Sdk séparément, car elle suit la ligne de version VSTest.

Pour un projet ciblant Windows dont la restauration ou la génération est effectuée sur Linux ou macOS, définissez EnableWindowsTargeting sur true.

Choisir une classe de base

Dérivez de l’une de ces classes :

  • ApplicationTest démarre l’application avant chaque test et l’arrête pendant l’élimination. Remplacez CreateProcessStartInfo pour identifier l’exécutable.
  • WindowTest attend aussi une fenêtre et l’expose via MainWindow.

Déclarez STATestClass directement sur chaque classe de test concrète, car les attributs de classe de test MSTest ne sont pas hérités :

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

Utilisez MainWindow dans vos méthodes de test pour interroger ou invoquer les modèles de contrôle de Windows UI Automation. Le package utilise l’API UIA2 System.Windows.Automation . Vous pouvez ajouter une autre bibliothèque, comme FlaUI, par-dessus ce qui est exposé via AutomationElement lorsque vous avez besoin d’interactions plus riches avec les éléments.

Personnaliser la détection du démarrage et des fenêtres

Remplacez ces membres lorsque les valeurs par défaut ne correspondent pas à votre application :

  • ApplicationShutdownTimeout contrôle la durée pendant laquelle la classe de base attend l’arrêt approprié et l’arrêt forcé. La valeur par défaut est de cinq secondes.
  • WindowDiscoveryTimeout contrôle la durée WindowTest d’attente d’une fenêtre. La valeur par défaut est de 10 secondes.
  • FindWindow sélectionne une fenêtre pour les applications qui utilisent un processus de lanceur, affichent un écran de démarrage ou créent plusieurs fenêtres de niveau supérieur.
  • StopApplication arrête une application lorsque la fenêtre sélectionnée appartient à un processus autre que le processus lancé CreateProcessStartInfo .

Les classes de base observent TestContext.CancellationToken pendant le démarrage et la découverte de fenêtres. WindowTest échoue lorsque l’application se ferme avant qu’une fenêtre s’affiche ou lorsque la découverte atteint son délai d’expiration.

Comprendre le comportement du cycle de vie

ApplicationTest démarre un processus d’application pour chaque appel de test. WindowTest découvre la fenêtre après le démarrage du processus. Une fois le test et ses méthodes de nettoyage terminés, MSTest supprime la classe de base, demande une fermeture normale dans la fenêtre principale et met fin à l’arborescence de processus si l’application ne quitte pas dans le délai d’expiration configuré.

Pour les tests paramétrables et les nouvelles tentatives, chaque appel reçoit son propre cycle de vie d’application.

Voir aussi