Idioma

Testar aplicativos da área de trabalho Windows com o MSTest Automação da Interface do Usuário

O pacote de pré-visualização MSTest.Windows.UIAutomation integra o gerenciamento do ciclo de vida do MSTest à API interna do Windows Automação da Interface do Usuário. Use para iniciar um aplicativo de área de trabalho de confiança total não empacotado, encontrar uma das janelas como um AutomationElemente parar o aplicativo após cada teste.

O pacote dá suporte a aplicativos Win32, Windows Forms e WPF em uma sessão de Windows interativa. Ele não fornece ativação MSIX, UWP ou WinUI, automação de processo elevado, uma área de trabalho sem cabeça, localizadores, esperas automáticas, capturas de tela ou um modelo de objeto de várias janelas.

Importante

Esse recurso requer pacotes de versão prévia do MSTest 4.5 e uma estrutura de destino específica Windows.

Habilitar Windows Automação da Interface do Usuário

Com MSTest.Sdk, defina EnableWindowsUIAutomation como true:

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

MSTest.Sdk adiciona o pacote correspondente MSTest.Windows.UIAutomation . Sem MSTest.Sdk, faça referência a MSTest.Windows.UIAutomation, MSTest.TestFramework e MSTest.TestAdapter nas versões correspondentes do MSTest. Faça referência a uma versão compatível Microsoft.NET.Test.Sdk separadamente porque ela segue a linha de versão do VSTest.

Para um projeto destinado ao Windows que é restaurado ou compilado no Linux ou no macOS, defina EnableWindowsTargeting como true.

Escolher uma classe base

Derivar de uma destas classes:

  • ApplicationTest inicia o aplicativo antes de cada teste e o interrompe durante o descarte. Sobrescreva CreateProcessStartInfo para identificar o executável.
  • WindowTest também aguarda uma janela e a disponibiliza por meio de MainWindow.

Declare STATestClass diretamente em cada classe de teste concreta porque os atributos da classe de teste MSTest não são herdados:

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

Use MainWindow em seus métodos de teste para consultar ou invocar padrões de Windows Automação da Interface do Usuário. O pacote usa a API UIA2 System.Windows.Automation . Você pode colocar outra biblioteca em camadas, como FlaUI, sobre a AutomationElement exposta quando precisar de interação de elementos mais avançada.

Personalizar a inicialização e a descoberta de janelas

Sobrescreva estes membros quando os valores padrão não atenderem ao seu aplicativo:

  • ApplicationShutdownTimeout controla quanto tempo a classe base aguarda o desligamento normal e o encerramento forçado. O padrão é cinco segundos.
  • WindowDiscoveryTimeout controla quanto tempo WindowTest espera por uma janela. O padrão é 10 segundos.
  • FindWindow seleciona uma janela para aplicativos que usam um processo inicializador, mostram uma tela inicial ou criam várias janelas de nível superior.
  • StopApplication desliga um aplicativo quando a janela selecionada pertence a um processo diferente do processo iniciado CreateProcessStartInfo .

As classes base observam TestContext.CancellationToken durante a inicialização e a descoberta de janelas. WindowTest falha quando o aplicativo é encerrado antes que uma janela seja exibida ou quando a descoberta atinge o tempo limite.

Entender o comportamento do ciclo de vida

ApplicationTest inicia um processo de aplicativo para cada invocação de teste. WindowTest descobre a janela depois que o processo é iniciado. Depois que o teste e seus métodos de limpeza forem concluídos, o MSTest descartará a classe base, solicitará um fechamento normal pela janela principal e encerrará a árvore de processo se o aplicativo não sair dentro do tempo limite configurado.

Para testes e tentativas parametrizados, cada invocação recebe seu próprio ciclo de vida do aplicativo.

Consulte também