Automazione dei test WPF e test dell'interfaccia WinForms senza codice (e senza albero di accessibilità)

Automazione dei test WPF e test dell'interfaccia WinForms senza codice: ciò che la vostra app espone a uno strumento di test, ciò che nasconde, e come registrare, controllare ed eseguire un test a ogni build.

10 min di letturaDi Ait Nohaila, Business Development Representative

La risposta breve

Per automatizzare i test dell'interfaccia di un'applicazione WPF, registrate un flusso una volta in GUI Test Studio: ogni clic, ogni tasto e ogni asserzione diventano un test che trova ogni controllo tramite le informazioni di accessibilità dell'app, o a vista quando l'app non dice nulla.

Questa guida è per un QA engineer o uno sviluppatore che deve testare un'applicazione WPF o Windows Forms (WinForms).Mostra ciò che un'app di questo tipo dice a uno strumento di test e ciò che nasconde, registra un test passo dopo passo, sceglie le asserzioni che sopravvivono a un restyling, esegue il test a ogni build, e dice quando una libreria basata sul codice resta la scelta migliore.

Ciò che un'app WPF o WinForms espone a uno strumento di test, e ciò che nasconde

WPF e WinForms descrivono entrambi i loro controlli standard a Windows tramite UI Automation: un tipo, un nome, una posizione sullo schermo e, quando lo sviluppatore ne ha impostato uno, un AutomationId.Un lettore di schermo usa quella descrizione, e così fa ogni strumento di test che trova i controlli tramite locator.La stessa app contiene anche controlli che non dicono assolutamente nulla.

Orders
Customer
Acme Ltd
Save
Sales this quarter
Ciò che dice l'app
Button · Save AutomationId: SaveButton
Ciò che dice l'app
Un rettangolo vuoto
Trovato a vista, nella sua area di ricerca
Due controlli di una stessa finestra.Il pulsante Save viene trovato tramite ciò che l'app dice di esso.Il grafico non dice nulla, quindi viene trovato dalla sua immagine.
Tipo di controlloCiò che vede UI AutomationCome lo trova un test
Un controllo WPF standard con un AutomationId: Button, TextBox, ListView, DataGridIl suo tipo, il suo nome, la sua posizione, e l'id che gli ha dato lo sviluppatoreTramite ciò che dice l'app, subito
Un controllo WinForms standard: Button, TextBox, DataGridViewIl suo tipo, il suo testo e il Name del controllo come id, quando è stato impostatoTramite ciò che dice l'app
Un'app WinForms i cui controlli hanno mantenuto i nomi predefinitiTipi e testi, con id come button1 che dicono pocoTramite il testo e la posizione del controllo, e a vista
Un controllo che l'app disegna da sé: un grafico, un indicatore, una barra multifunzione, un canvasUn rettangolo, a meno che i suoi sviluppatori non ne abbiano scritto l'accessibilitàA vista
Una griglia o un elenco disegnati dall'appRighe senza le loro celle, o celle dietro nomi segnapostoA vista, cella per cella
Una suite di controlli di terze partiDipende dal fornitore: da una descrizione completa a un unico riquadroTramite ciò che dice l'app dove lo dice, a vista dove non lo dice
Un'immagine, un'icona, un disegnoUn'immagine senza testoA vista

La documentazione stessa di Microsoft dice che un controllo senza un provider UI Automation è in gran parte opaco per UI Automation, che può riportare poco più della sua posizione.Quali app Windows non hanno un albero di accessibilità elenca i tipi di applicazione in cui questa è la regola e non l'eccezione.

Test automatici di un'applicazione WPF: registrare il test passo dopo passo

I test automatici di un'applicazione WPF cominciano con una sola registrazione, in GUI Test Runner-Recorder.Nulla viene aggiunto all'app: nessuna build di test, nessuna libreria, nessun AutomationId che non aveste già.L'esempio qui sotto registra un'app di inserimento ordini, e un'app WinForms si registra allo stesso modo.Vedete Registrare un test per tutte le opzioni.

1
Registra
In GUI Test Runner-Recorder
2
Che cosa vuole testare?
Un'app: la vostra
3
Usare l'app
Clic, digitazione, lettura
4
Cosa deve verificare questo test?
Immagini, testo, ciò che appare
5
Salvato ed eseguito
Orders\Orders.GTS, poi Esegui test
Cinque tappe, nessun codice: due domande, l'app usata una volta, e un test che viene eseguito.
  1. 1

    Fare clic su Registra

    Aprite GUI Test Runner-Recorder e fate clic su Registra.Portate la vostra app nello stato da cui deve partire il test: la prima schermata del flusso, senza nient'altro aperto sopra.

  2. 2

    Rispondere a “Che cosa vuole testare?” con Un'app

    Scegliete Un'app e selezionate il vostro programma tra quelli in esecuzione, oppure cercate il suo .exe se non è ancora aperto.Spuntate la casella che avvia l'app con il test e la chiude alla fine, così ogni esecuzione parte da un'app appena aperta.

    Viene sempre registrato l'intero schermo.Scegliere Un'app decide solo da dove provengono le asserzioni automatiche.
  3. 3

    Usare l'app come farebbe un tester

    Digitate il nome del cliente, scegliete un prodotto nell'elenco, fate clic su Save e leggete la conferma.Ogni clic e ogni tasto vengono registrati, e il registratore ritaglia un'immagine di ogni controllo su cui fate clic, appena prima del clic.Premete il tasto Termina quando il flusso è finito.

  4. 4

    Rispondere a “Cosa deve verificare questo test?”

    Tre schede chiedono cosa deve verificare il test: gli elementi visivi su cui avete fatto clic, il testo sullo schermo, e ciò che è comparso mentre lavoravate, come una finestra di dialogo o una conferma.Per un primo test lasciate le impostazioni predefinite, e salvate.

    Le asserzioni si scelgono dopo la registrazione, quando avete appena visto cosa ha fatto l'app.
  5. 5

    Il test viene salvato in una cartella tutta sua, ed eseguito

    Un test chiamato Orders viene salvato come Orders\Orders.GTS, in una cartella tutta sua, dove i risultati e la cronologia di ogni esecuzione vengono conservati accanto a esso.Fate clic su Esegui test: il test riproduce i vostri clic e i vostri tasti come input reale, mirando a dove si trova ora ogni controllo, e termina con un report di affidabilità che dice cosa è stato superato e cosa è cambiato.

Ciò che la registrazione ha conservato di ogni controllo decide come viene trovato all'esecuzione successiva.

  • Per il pulsante Save, l'app ha detto Button, Save e SaveButton, e il test lo conserva accanto all'immagine del pulsante.
  • Per il grafico, l'app non ha detto nulla che valesse la pena conservare, e lo trova l'immagine da sola.

Potete anche saltare la registrazione e descrivere il flusso in un prompt a Claude, ChatGPT o a un modello di IA locale, uno dei nostri o uno vostro: il test viene creato allo stesso modo, con le stesse asserzioni.

Test dell'interfaccia WinForms: le asserzioni che sopravvivono a un restyling

I test dell'interfaccia WinForms, come i test WPF, vivono o muoiono di asserzioni che colgono un vero cambiamento e ignorano quelli innocui.GUI Test Studio ne offre tre tipi, ciascuno un blocco sulla timeline del test che chiunque nel team può aggiungere, spostare o modificare.

Asserzione visiva

Un'asserzione visiva controlla che un elemento sia sullo schermo e abbia l'aspetto registrato: un'icona della barra degli strumenti, una spia di stato, un grafico che deve mostrare la stessa curva.

Asserzione testuale

Un'asserzione testuale controlla le parole che mostra un elemento, interrogando prima l'app e leggendo lo schermo quando l'app non sa dirlo, e un'asserzione testuale dinamica accetta un valore che cambia in base al suo formato, come un numero d'ordine.

Asserzione di layout

Un'asserzione di layout controlla che gli elementi di una schermata siano disposti come sono stati registrati, così una colonna che si è spostata o un pulsante che ha perso il suo posto vengono colti anche quando ogni elemento ha ancora l'aspetto giusto.

Tutte e tre ignorano il rumore che ogni schermo ha e colgono comunque ciò che una persona chiamerebbe un cambiamento: un colore sbagliato, un'icona mancante, una parola che ha cambiato maiuscole e minuscole, un controllo scivolato fuori posto.Asserzioni visive passa in rassegna le impostazioni di ciascuna.

L'area di ricerca

Ogni asserzione cerca il suo elemento all'interno di un'area di ricerca, una zona intorno al punto in cui l'elemento è stato registrato.L'area tiene separati gli elementi simili: un pulsante Save nella barra degli strumenti e un pulsante Save in una finestra di dialogo si distinguono dal punto in cui si trova ciascuno.Un'asserzione che dopo un secondo non ha trovato il suo elemento nella sua area guarda anche su tutto lo schermo, così una finestra che si è aperta più a destra non fa fallire il test, e il report di affidabilità dice dove è stato trovato l'elemento.

Un restyling del codice dietro un controllo

Un test continua a funzionare attraverso i cambiamenti che un'app WPF o WinForms attraversa.

  • Un controllo riscritto da WinForms a WPF viene ancora trovato: l'app lo nomina ancora, e ha ancora lo stesso aspetto.
  • Un controllo spostato in un altro pannello viene trovato dove si trova ora.
  • Una classe rinominata o una nuova libreria di controlli non cambiano nulla di ciò su cui il test si basa.

Un tema scuro, un tema a contrasto elevato, un'altra lingua

Le informazioni di accessibilità dell'app non cambiano con un tema, quindi un'asserzione che interroga l'app regge sia nel tema chiaro sia in quello scuro.L'immagine che confronta un'asserzione visiva invece cambia, e un profilo di baseline conserva una versione attesa per ambiente: eseguite il test con il profilo Modalità scura, accettate una volta ogni nuovo aspetto nel report di affidabilità, e lo stesso test controlla poi l'aspetto chiaro e quello scuro, ciascuno rispetto alla versione giusta.

Un'esecuzione di esempio: il report di affidabilità illumina ciò che è cambiato e lo dice in parole semplici, con l'immagine attesa e quella trovata affiancate.
Un locator si rompe quando cambia il codice.Un'asserzione che interroga l'app e guarda lo schermo si rompe quando lo schermo è sbagliato, che è l'unico errore che volete.

Automazione dei test desktop su Windows a ogni build

L'automazione dei test desktop su Windows ripaga quando viene eseguita senza che nessuno la avvii. gtr-cli, l'esecutore da riga di comando, esegue un test esattamente come il pulsante Esegui test e risponde come si aspetta una pipeline: un test non superato fa fallire la build, un file JUnit riempie la scheda dei test, e ogni immagine di ciò che non è riuscito viene conservata in un'unica cartella.

I test di una cartella, a ogni build
gtr-cli run tests --countdown 0 --junit results\junit.xml --artifacts results\artifacts

Un'opzione indica lo strumento di CI, e gli errori compaiono poi nel suo stesso log, come annotazioni o voci di test, senza alcun plugin da installare:

Strumento di CIIl comandoCosa mostra lo strumento
TeamCitygtr-cli run tests --countdown 0 --format teamcity --artifacts results\artifactsOgni test nella scheda Tests, gli errori con i loro motivi
Azure DevOpsgtr-cli run tests --countdown 0 --format azure --junit results\junit.xml --artifacts results\artifactsUn comando di logging per ogni errore, e il file JUnit nella scheda Tests
GitHub Actionsgtr-cli run tests --countdown 0 --format github --junit results\junit.xml --artifacts results\artifactsUn'annotazione per ogni errore sull'esecuzione, e la cartella degli artefatti da scaricare

Un test desktop viene riprodotto su uno schermo reale, quindi l'agente di build ha bisogno di una sessione desktop di Windows sbloccata: una macchina virtuale con una dimensione dello schermo fissa funziona bene.Eseguire i test nella pipeline elenca ogni opzione, e Eseguite i vostri test end-to-end a ogni build configura passo dopo passo una build di TeamCity, con lo stesso comando per Jenkins, GitHub Actions, GitLab e Azure DevOps.

FlaUI, pywinauto e altri strumenti di test dell'interfaccia WPF: quando il codice è la scelta giusta

Due librerie open source sono ciò a cui uno sviluppatore ricorrerebbe altrimenti.FlaUI è una libreria .NET per i test automatici dell'interfaccia delle applicazioni Windows, tra cui WPF e WinForms, che incapsula le librerie UI Automation di Microsoft per un test scritto in C#.pywinauto, secondo la sua pagina GitHub, è un insieme di moduli Python per automatizzare l'interfaccia grafica di Windows, con due back-end: l'API Win32, quello predefinito, e UI Automation.

Entrambe sono una scelta sensata per un team orientato al codice i cui controlli sono tutti accessibili: i test vivono nel repository stesso dell'app, in un linguaggio che il team scrive ogni giorno, accanto ai test unitari, e uno sviluppatore che conosce l'albero dei controlli può scrivere un locator preciso per ogni elemento.Il costo si paga in tempo degli sviluppatori, per ogni locator e per ogni restyling che ne cambia uno, e un elemento che l'app non descrive richiede un'altra via d'accesso.

Le due cose non sono nemiche.Un team con un'app WPF piena di controlli personalizzati spesso tiene i test unitari nel codice e registra i test end-to-end, così le persone che conoscono meglio i flussi possono mantenerli, e vengono testati anche i controlli che l'app non descrive.

Punti chiave

  • 1WPF e WinForms descrivono i loro controlli standard, e non dicono nulla di un grafico, di un indicatore, di una griglia disegnata dall'app o di molti controlli di terze parti.
  • 2Una sola registrazione testa entrambi i tipi: il GTS Engine + AI interroga prima l'app e trova il controllo a vista quando l'app non dice nulla.
  • 3Scegliete asserzioni che sopravvivono a un restyling: un'asserzione visiva, un'asserzione testuale e un'asserzione di layout falliscono solo quando lo schermo è sbagliato, e un profilo di baseline copre un tema scuro.
  • 4Eseguitelo a ogni build con gtr-cli, in TeamCity, Azure DevOps, GitHub Actions, Jenkins o GitLab, su un desktop Windows sbloccato.
  • 5FlaUI e pywinauto hanno ancora senso per un team orientato al codice i cui controlli sono tutti accessibili; il costo è il tempo degli sviluppatori per ogni locator.

Domande

Come si automatizzano i test dell'interfaccia di un'applicazione WPF?

Registrate un flusso una volta in GUI Test Studio: aprite l'app, fate clic, digitate e leggete ciò che compare, come farebbe un tester.Ogni azione e ogni asserzione diventano un test senza codice, e gtr-cli lo esegue di nuovo a ogni build.Ogni controllo viene trovato tramite le informazioni di accessibilità dell'app, o a vista quando l'app non dice nulla di esso.

Si può testare un'app WinForms che non ha AutomationId?

Sì.Un controllo WinForms standard riporta comunque il suo tipo e il suo testo, e un controllo che non riporta nulla di utile viene trovato a vista, dalla sua immagine sullo schermo.Non bisogna aggiungere nulla all'applicazione perché il test funzioni.

Bisogna aggiungere degli AutomationId alla propria app WPF per automatizzare i test?

Non con GUI Test Studio.Un AutomationId aiuta, perché l'app nomina allora il controllo con precisione, e GUI Test Studio lo conserva quando c'è.Senza di esso, il nome, il tipo e la posizione del controllo, e la sua immagine, bastano.

Come si testano i controlli disegnati su misura o di terze parti in un'app WPF?

A vista.Un grafico, un indicatore, una griglia disegnata dall'app o un controllo di terze parti mostrano spesso a Windows un unico rettangolo vuoto.GUI Test Studio trova un controllo di questo tipo dalla sua immagine nella sua area di ricerca, agisce su di esso con input reale di mouse e tastiera, e verifica allo stesso modo ciò che mostra.

Qual è un'alternativa a FlaUI che non richiede codice?

GUI Test Studio.FlaUI è una libreria .NET che pilota Windows UI Automation da codice C#, quindi ogni elemento ha bisogno di un locator in un progetto di test.GUI Test Studio invece registra il flusso, conserva da solo le informazioni di accessibilità dell'app, e trova a vista ciò che l'app non descrive.

L'automazione dei test WPF funziona con un tema scuro?

Sì.Le informazioni di accessibilità dell'app non cambiano con un tema, e per le asserzioni che confrontano un'immagine un profilo di baseline conserva una versione attesa per ogni tema.Lo stesso test viene eseguito sull'aspetto chiaro e su quello scuro, e confronta ciascuno con la versione giusta.

I test WPF e WinForms possono essere eseguiti in una pipeline CI/CD?

Sì. gtr-cli esegue i test su un agente di build Windows con una sessione desktop sbloccata, fa fallire la build quando un test non viene superato, scrive un file JUnit e conserva ogni immagine di un errore.Funziona con TeamCity, Azure DevOps, GitHub Actions, Jenkins e GitLab.

Bisogna installare qualcosa all'interno dell'applicazione?

No.GUI Test Studio osserva lo schermo, chiede a Windows ciò che l'app descrive già di sé, e usa mouse e tastiera come una persona.Non c'è nessuna libreria, nessuna build di test e nessun agente all'interno dell'app.

Microsoft, Windows, WPF, Windows Forms, FlaUI, pywinauto, TeamCity, Azure DevOps, GitHub, GitLab e Jenkins sono marchi o progetti dei rispettivi proprietari.

Pronti a registrare il vostro primo test?

Tutte le funzionalità, per 15 giorni.

Preferite vederlo sul tipo di app che testate?Prenotate una chiamata gratuita di 30 minuti con il nostro team.

Prenota una demo