Automatización de pruebas de WPF y pruebas de interfaz de WinForms sin código (y sin árbol de accesibilidad)

Automatización de pruebas de WPF y pruebas de interfaz de WinForms sin código: lo que su aplicación expone a una herramienta de pruebas, lo que oculta, y cómo grabar, comprobar y ejecutar una prueba en cada compilación.

10 min de lecturaPor Ait Nohaila, Representante de desarrollo de negocio

La respuesta corta

Para automatizar las pruebas de interfaz de una aplicación WPF, grabe un flujo de trabajo una vez en GUI Test Studio: cada clic, cada tecla y cada comprobación se convierten en una prueba que encuentra cada control a través de la información de accesibilidad de la aplicación, o visualmente cuando esta no dice nada.

Esta guía es para un ingeniero de QA o un desarrollador que tiene que probar una aplicación WPF o Windows Forms (WinForms).Muestra lo que una aplicación así le dice a una herramienta de pruebas y lo que oculta, graba una prueba paso a paso, elige las comprobaciones que sobreviven a un rediseño, ejecuta la prueba en cada compilación, y dice cuándo una biblioteca centrada en el código sigue siendo la mejor opción.

Lo que una aplicación WPF o WinForms expone a una herramienta de pruebas, y lo que oculta

WPF y WinForms describen ambos sus controles estándar a Windows mediante UI Automation: un tipo, un nombre, un lugar en la pantalla y, cuando el desarrollador lo definió, un AutomationId.Un lector de pantalla usa esa descripción, y también la usa toda herramienta de pruebas que encuentra los controles mediante localizadores.La misma aplicación también contiene controles que no dicen nada en absoluto.

Orders
Customer
Acme Ltd
Save
Sales this quarter
Lo que dice la aplicación
Button · Save AutomationId: SaveButton
Lo que dice la aplicación
Un rectángulo vacío
Encontrado visualmente, en su zona de búsqueda
Dos controles de una misma ventana.El botón Save se encuentra a través de lo que la aplicación dice de él.El gráfico no dice nada, así que se encuentra por su imagen.
Tipo de controlLo que ve UI AutomationCómo lo encuentra una prueba
Un control WPF estándar con un AutomationId: Button, TextBox, ListView, DataGridSu tipo, su nombre, su lugar y el identificador que le dio el desarrolladorA través de lo que dice la aplicación, al instante
Un control WinForms estándar: Button, TextBox, DataGridViewSu tipo, su texto y la propiedad Name del control como identificador, cuando se definióA través de lo que dice la aplicación
Una aplicación WinForms cuyos controles conservaron sus nombres predeterminadosTipos y textos, con identificadores como button1 que dicen pocoA través del texto y del lugar del control, y visualmente
Un control que dibuja la propia aplicación: un gráfico, un indicador, una cinta, un lienzoUn rectángulo, salvo que sus desarrolladores hayan escrito su accesibilidadVisualmente
Una cuadrícula o una lista dibujada por el propietarioFilas sin sus celdas, o celdas tras nombres genéricosVisualmente, celda por celda
Un conjunto de controles de tercerosDepende del proveedor: de una descripción completa a un único panelA través de lo que dice la aplicación donde lo dice, visualmente donde no
Una imagen, un icono, un dibujoUna imagen sin textoVisualmente

La propia documentación de Microsoft dice que un control sin proveedor de UI Automation es en gran parte opaco para ella, que apenas puede informar de algo más que de su ubicación.Qué aplicaciones de Windows no tienen árbol de accesibilidad enumera los tipos de aplicación en los que esto es la regla y no la excepción.

Pruebas automatizadas de una aplicación WPF: grábela paso a paso

Las pruebas automatizadas de una aplicación WPF empiezan con una grabación, en GUI Test Runner-Recorder.No se añade nada a la aplicación: ni una compilación de prueba, ni una biblioteca, ni un AutomationId que no tuviera ya.El ejemplo siguiente graba una aplicación de introducción de pedidos, y una aplicación WinForms se graba de la misma manera.Consulte Grabar una prueba para conocer todas las opciones.

1
Grabar
En GUI Test Runner-Recorder
2
¿Qué quiere probar?
Una aplicación: la suya
3
Usar la aplicación
Hacer clic, escribir, leer
4
¿Qué debe verificar esta prueba?
Imágenes, texto, lo que aparece
5
Guardada y ejecutada
Orders\Orders.GTS, luego Ejecutar prueba
Cinco etapas, sin código: dos preguntas, la aplicación usada una vez, y una prueba que se ejecuta.
  1. 1

    Haga clic en Grabar

    Abra GUI Test Runner-Recorder y haga clic en Grabar.Ponga su aplicación en el estado desde el que debe empezar la prueba: la primera pantalla del flujo de trabajo, sin nada más abierto en ella.

  2. 2

    Responda a «¿Qué quiere probar?» con «Una aplicación»

    Elija Una aplicación y escoja su programa entre los que están en ejecución, o busque su .exe si todavía no está abierto.Marque la casilla que inicia la aplicación con la prueba y la cierra al final, para que cada ejecución empiece con la aplicación recién abierta.

    Siempre se graba la pantalla completa.Elegir «Una aplicación» solo decide de dónde salen las comprobaciones automáticas.
  3. 3

    Use la aplicación como lo haría un tester

    Escriba el nombre del cliente, elija un producto en la lista, haga clic en Save y lea la confirmación.Cada clic y cada tecla se graban, y el grabador recorta una imagen de cada control en el que hace clic, justo antes de hacerlo.Pulse la tecla para detener cuando termine el flujo de trabajo.

  4. 4

    Responda a «¿Qué debe verificar esta prueba?»

    Tres tarjetas preguntan qué debe comprobar la prueba: los elementos visuales en los que hizo clic, el texto de la pantalla, y lo que apareció mientras trabajaba, como un diálogo o una confirmación.Conserve los valores predeterminados para una primera prueba, y guarde.

    Las comprobaciones se eligen después de la grabación, cuando acaba de ver lo que hizo la aplicación.
  5. 5

    La prueba se guarda en una carpeta propia, y se ejecuta

    Una prueba llamada Orders se guarda como Orders\Orders.GTS, en una carpeta propia, donde se conservan a su lado los resultados y el historial de cada ejecución.Haga clic en Ejecutar prueba: la prueba reproduce sus clics y teclas como entrada real, dirigida al lugar donde está ahora cada control, y termina en un Informe de confianza que dice qué se superó y qué cambió.

Lo que la grabación conservó de cada control decide cómo se encuentra en la siguiente ejecución.

  • Para el botón Save, la aplicación dijo Button, Save y SaveButton, y la prueba lo conserva junto a la imagen del botón.
  • Para el gráfico, la aplicación no dijo nada que valiera la pena conservar, y basta la imagen para encontrarlo.

También puede prescindir de la grabación y describir el flujo de trabajo en una petición a Claude, a ChatGPT o a un modelo de IA local, uno que proporcionamos nosotros o uno que usted aporta: la prueba se crea de la misma manera, con las mismas comprobaciones.

Pruebas de interfaz de WinForms: las comprobaciones que sobreviven a un rediseño

Las pruebas de interfaz de WinForms, como las de WPF, dependen por completo de comprobaciones que detecten un cambio real e ignoren los inofensivos.GUI Test Studio ofrece tres tipos, cada uno un bloque en la línea de tiempo de la prueba que cualquier persona del equipo puede añadir, mover o editar.

Aserción visual

Una aserción visual comprueba que un elemento está en la pantalla y tiene el aspecto grabado: un icono de la barra de herramientas, un indicador de estado, un gráfico que debe mostrar la misma curva.

Aserción de texto

Una aserción de texto comprueba las palabras que muestra un elemento, preguntando primero a la aplicación y leyendo la pantalla cuando la aplicación no puede decirlo, y una aserción de texto dinámico acepta por su formato un valor que cambia, como un número de pedido.

Aserción de disposición

Una aserción de disposición comprueba que los elementos de una pantalla están dispuestos como se grabaron, así que una columna que se movió o un botón que perdió su lugar se detectan aunque cada elemento siga teniendo el aspecto correcto.

Las tres ignoran el ruido que tiene toda pantalla y aun así detectan lo que una persona llamaría un cambio: un color equivocado, un icono que falta, una palabra que cambió de mayúsculas a minúsculas, un control que se desplazó de su lugar.Comprobaciones visuales repasa la configuración de cada una.

La zona de búsqueda

Cada comprobación busca su elemento dentro de una zona de búsqueda, un área alrededor del lugar donde se grabó el elemento.La zona mantiene separados los elementos parecidos: un botón Save en la barra de herramientas y un botón Save en un diálogo se distinguen por el lugar donde está cada uno.Una comprobación que no ha encontrado su elemento en su zona al cabo de un segundo busca también en toda la pantalla, así que una ventana que se abrió más a la derecha no hace fallar la prueba, y el Informe de confianza dice dónde se encontró el elemento.

Un rediseño del código que hay detrás de un control

Una prueba sigue funcionando a través de los cambios por los que pasa una aplicación WPF o WinForms.

  • Un control reescrito de WinForms a WPF se sigue encontrando: la aplicación sigue nombrándolo, y sigue teniendo el mismo aspecto.
  • Un control movido a otro panel se encuentra donde está ahora.
  • Una clase renombrada o una nueva biblioteca de controles no cambia nada de lo que usa la prueba.

Un tema oscuro, un tema de alto contraste, otro idioma

La información de accesibilidad de la aplicación no cambia con un tema, así que una comprobación que pregunta a la aplicación se cumple igual en claro que en oscuro.La imagen que compara una aserción visual sí cambia, y un perfil de línea base conserva una versión esperada por entorno: ejecute la prueba con el perfil «Modo oscuro», acepte cada nuevo aspecto una vez en el Informe de confianza, y la misma prueba comprueba después el aspecto claro y el aspecto oscuro, cada uno contra la versión correcta.

Una ejecución de ejemplo: el Informe de confianza ilumina lo que cambió y lo dice en palabras sencillas, con las imágenes esperada y encontrada una junto a otra.
Un localizador se rompe cuando cambia el código.Una comprobación que pregunta a la aplicación y mira la pantalla se rompe cuando la pantalla está mal, que es el único fallo que usted quiere.

Automatización de pruebas de escritorio en Windows en cada compilación

La automatización de pruebas de escritorio en Windows compensa cuando se ejecuta sin que nadie la ponga en marcha. gtr-cli, el ejecutor de línea de comandos, ejecuta una prueba exactamente como el botón Ejecutar prueba y responde como espera un pipeline: una prueba fallida hace fallar la compilación, un archivo JUnit llena la pestaña de pruebas, y cada imagen de lo que falló se conserva en una carpeta.

Las pruebas de una carpeta, en cada compilación
gtr-cli run tests --countdown 0 --junit results\junit.xml --artifacts results\artifacts

Una opción indica la herramienta de CI, y los fallos aparecen entonces en su propio registro, como anotaciones o como entradas de prueba, sin ningún plugin que instalar:

Herramienta de CIEl comandoLo que muestra la herramienta
TeamCitygtr-cli run tests --countdown 0 --format teamcity --artifacts results\artifactsCada prueba en la pestaña Tests, los fallos con sus motivos
Azure DevOpsgtr-cli run tests --countdown 0 --format azure --junit results\junit.xml --artifacts results\artifactsUn comando de registro por fallo, y el archivo JUnit en la pestaña Tests
GitHub Actionsgtr-cli run tests --countdown 0 --format github --junit results\junit.xml --artifacts results\artifactsUna anotación por fallo en la ejecución, y la carpeta de artefactos para descargar

Una prueba de escritorio se reproduce en una pantalla real, así que el agente de compilación necesita una sesión de escritorio de Windows desbloqueada: una máquina virtual con un tamaño de pantalla fijo funciona bien.Ejecutar pruebas en su pipeline enumera todas las opciones, y Ejecute sus pruebas de extremo a extremo en cada compilación configura paso a paso una compilación de TeamCity, con el mismo comando para Jenkins, GitHub Actions, GitLab y Azure DevOps.

FlaUI, pywinauto y otras herramientas de pruebas de interfaz para WPF: cuándo el código es la elección correcta

Dos bibliotecas de código abierto son la alternativa a la que recurriría un desarrollador.FlaUI es una biblioteca .NET para pruebas de interfaz automatizadas de aplicaciones de Windows, entre ellas WPF y WinForms, que envuelve las bibliotecas UI Automation de Microsoft para una prueba escrita en C#.pywinauto, según su página de GitHub, es un conjunto de módulos Python para automatizar la GUI de Windows, con dos backends: la API de Win32, la predeterminada, y UI Automation.

Las dos son una elección razonable para un equipo centrado en el código cuyos controles son todos accesibles: las pruebas viven en el propio repositorio de la aplicación, en un lenguaje que el equipo escribe a diario, junto a las pruebas unitarias, y un desarrollador que conoce el árbol de controles puede escribir un localizador preciso para cada elemento.El coste se paga en tiempo de desarrollo, por cada localizador y por cada rediseño que cambia alguno, y un elemento que la aplicación no describe necesita otra forma de llegar a él.

Los dos enfoques no son enemigos.Un equipo con una aplicación WPF llena de controles personalizados suele mantener sus pruebas unitarias en código y grabar sus pruebas de extremo a extremo, para que las personas que mejor conocen los flujos de trabajo puedan mantenerlas, y para que también se prueben los controles que la aplicación no describe.

Lo esencial

  • 1WPF y WinForms describen sus controles estándar, y no dicen nada de un gráfico, de un indicador, de una cuadrícula dibujada por el propietario ni de muchos controles de terceros.
  • 2Una sola grabación prueba los dos tipos: el GTS Engine + AI pregunta primero a la aplicación y encuentra el control visualmente cuando la aplicación no dice nada.
  • 3Elija comprobaciones que sobrevivan a un rediseño: una aserción visual, una aserción de texto y una aserción de disposición solo fallan cuando la pantalla está mal, y un perfil de línea base cubre un tema oscuro.
  • 4Ejecútela en cada compilación con gtr-cli, en TeamCity, Azure DevOps, GitHub Actions, Jenkins o GitLab, en un escritorio de Windows desbloqueado.
  • 5FlaUI y pywinauto siguen teniendo sentido para un equipo centrado en el código cuyos controles son todos accesibles; el coste es el tiempo de desarrollo de cada localizador.

Preguntas

¿Cómo se automatizan las pruebas de interfaz de una aplicación WPF?

Grabe un flujo de trabajo una vez en GUI Test Studio: abra la aplicación, haga clic, escriba y lea lo que aparece, como lo haría un tester.Cada acción y cada comprobación se convierten en una prueba sin código, y gtr-cli la vuelve a ejecutar en cada compilación.Cada control se encuentra a través de la información de accesibilidad de la aplicación, o visualmente cuando la aplicación no dice nada de él.

¿Se puede probar una aplicación WinForms que no tiene AutomationId?

Sí.Un control WinForms estándar sigue informando de su tipo y de su texto, y un control que no informa de nada útil se encuentra visualmente, por su imagen en la pantalla.No hay que añadir nada a la aplicación para que la prueba funcione.

¿Tengo que añadir AutomationId a mi aplicación WPF para automatizar las pruebas?

Con GUI Test Studio, no.Un AutomationId ayuda, porque la aplicación nombra entonces el control con precisión, y GUI Test Studio lo conserva cuando existe.Sin él, bastan el nombre, el tipo y el lugar del control, y su imagen.

¿Cómo se prueban los controles dibujados a medida o de terceros en una aplicación WPF?

Visualmente.Un gráfico, un indicador, una cuadrícula dibujada por el propietario o un control de terceros a menudo solo muestra a Windows un rectángulo vacío.GUI Test Studio encuentra un control así por su imagen en su zona de búsqueda, actúa sobre él con una entrada real de ratón y teclado, y comprueba de la misma manera lo que muestra.

¿Qué alternativa a FlaUI no necesita código?

GUI Test Studio.FlaUI es una biblioteca .NET que maneja Windows UI Automation desde código C#, así que cada elemento necesita un localizador en un proyecto de pruebas.GUI Test Studio graba en cambio el flujo de trabajo, conserva por sí mismo la información de accesibilidad de la aplicación, y encuentra visualmente lo que la aplicación no describe.

¿La automatización de pruebas de WPF funciona con un tema oscuro?

Sí.La información de accesibilidad de la aplicación no cambia con un tema, y para las comprobaciones que comparan una imagen, un perfil de línea base conserva una versión esperada por tema.La misma prueba se ejecuta contra el aspecto claro y el aspecto oscuro, y compara cada uno con la versión correcta.

¿Se pueden ejecutar pruebas de WPF y WinForms en un pipeline de CI/CD?

Sí. gtr-cli ejecuta las pruebas en un agente de compilación de Windows con una sesión de escritorio desbloqueada, hace fallar la compilación cuando una prueba falla, escribe un archivo JUnit y conserva cada imagen de un fallo.Funciona con TeamCity, Azure DevOps, GitHub Actions, Jenkins y GitLab.

¿Hay que instalar algo dentro de la aplicación?

No.GUI Test Studio observa la pantalla, pregunta a Windows lo que la aplicación ya describe de sí misma, y usa el ratón y el teclado como una persona.No hay ninguna biblioteca, ninguna compilación de prueba ni ningún agente dentro de la aplicación.

Microsoft, Windows, WPF, Windows Forms, FlaUI, pywinauto, TeamCity, Azure DevOps, GitHub, GitLab y Jenkins son marcas o proyectos de sus respectivos propietarios.

¿Listo para grabar su primera prueba?

Todas las funciones, durante 15 días.

¿Prefiere verlo con el tipo de aplicación que prueba?Reserve una llamada gratuita de 30 minutos con nuestro equipo.

Reservar una demo