data driven parameterized testing with spock framework
Esplora i modi di scrivere test basati sui dati o parametrizzati con Spock Framework:
In questo Serie di tutorial gratuiti per la formazione di Spock , abbiamo esplorato tutto Test unitari a Spock e Testare i dispositivi, le asserzioni e i rapporti nel nostro tutorial precedente.
In questo tutorial, proveremo a capire cosa sono i test parametrizzati e come puoi sfruttare le funzionalità integrate di Spock per ottenere test basati sui dati.
Iniziamo!!
Guarda il video tutorial
Cosa imparerai:
- Cosa sono i test parametrizzati?
- Scrittura di test parametrizzati con Spock
- Ciclo di vita del blocco 'dove'
- Suggerimenti e trucchi
- Conclusione
- Lettura consigliata
Cosa sono i test parametrizzati?
Per chiunque abbia lavorato con l'automazione / unit test, il test basato sui dati non è un termine nuovo.
I test parametrizzati non sono altro che sono qualsiasi tipo di test che condividono la stessa logica di esecuzione e differiscono solo nei dati di input e in alcuni casi.
Esempio: Supponiamo che tu abbia un'applicazione Calcolatrice, per testare completamente la funzionalità potresti voler eseguire i tuoi test su diversi set di input.
Esempio: Valori negativi, numeri frazionari, numeri interi normali, numeri interi prossimi all'intervallo massimo consentito, ecc. Indipendentemente dai valori di input disponibili, si desidera eseguire la stessa logica di esecuzione.
Un altro buon motivo per scrivere test parametrizzati è che non verifica solo un percorso felice, ma verifica anche il percorso di errore o scenari negativi.
Esempio: Supponiamo che esista un'applicazione che restituisce se una determinata estensione di file è valida o meno. I test basati sui dati possono consentire rapidamente allo sviluppatore di eseguire test per le estensioni di file supportate e qualsiasi scenario di errore o test di input negativo.
Ora, tradizionalmente, puoi pensare di scrivere o copiare i test per più valori di input, ma questo non è il modo corretto o intelligente per ottenere questo tipo di esecuzione del test. Inoltre, poiché il numero di test inizia ad aumentare nella tua app, questi test diventeranno difficili da mantenere.
Scrittura di test parametrizzati con Spock
Il dove: blocco
Il blocco where in un test di Spock è il blocco che contiene i dati per il test parametrizzato. Opzionalmente può contenere valori sia di input che di output attesi. Un punto importante da notare su questo blocco è che questo dovrebbe essere l'ultimo blocco in un test di Spock.
Detto questo, può essere combinato con tutti gli altri blocchi come dato, quando e poi ma dovrebbe essere l'ultimo blocco.
Diamo un'occhiata a un esempio per capirlo meglio
Useremo un'applicazione calcolatrice che accetta 2 parametri di input e restituisce la somma degli input forniti. Scriveremo un test parametrizzato che fornisce più input e valori di expectedOutput.
def 'sample parameterized test'() input2
Nell'esempio di codice sopra puoi vedere quanto segue:
- Blocco 'dove' che contiene i dati per l'esecuzione del test.
- Il blocco 'dove' è l'ultimo blocco del test.
- 'Dove' è combinato con gli altri blocchi, ovvero dato, quando e poi.
- La rappresentazione dei dati è un formato speciale chiamato tabelle di dati che vedremo in dettaglio nelle prossime sezioni di questo tutorial.
- La riga di intestazione dei dati è essenzialmente le proprietà / variabili di input che possono essere utilizzate direttamente nel test. Per esempio. Fare riferimento alla dichiarazione nel blocco 'quando' in cui abbiamo utilizzato direttamente input1 e input2 come parametri di input senza definirli esplicitamente.
Utilizzo di dati
Proviamo ora a comprendere in dettaglio le tabelle di dati. Ogni riga della tabella dati rappresenta i dati per un singolo scenario (esecuzione del test).
Per convenzione, i valori di input sono preceduti da una barra verticale singola ('|') mentre i valori di output sono preceduti da una barra verticale doppia ('||'). Questo non ha alcun significato logico, ma è una convenzione e migliora la leggibilità. Pertanto, entrambi gli esempi seguenti sono veri.
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
La riga di intestazione, come mostrato sopra, ha un nome per ciascuno dei parametri forniti come dati da testare. È importante notare qui che questi nomi di parametri non devono entrare in conflitto con le variabili locali / globali esistenti nel test, altrimenti ci saranno errori in fase di compilazione per risolvere i nomi delle variabili.
Un punto importante da notare durante l'utilizzo di tabelle di dati è che è richiesto un minimo di 2 colonne. Se hai solo bisogno di una colonna, una colonna vuota con valori come carattere di sottolineatura è una soluzione alternativa come di seguito.
input1 ||_ 10 ||_ -4 ||_
Il vantaggio di questo formato è la semplicità, la leggibilità e l'estensibilità. Aggiungere un nuovo input di dati è semplice come aggiungere una nuova riga con valori di dati.
Un altro punto da notare qui è che le tabelle di dati possono essere utilizzate per contenere qualsiasi tipo di variabile, classe, oggetto, enumerazione, ecc. Che lo rendono ancora più potente. Poiché groovy è un linguaggio tipizzato opzionalmente, se non viene specificato un tipo esplicito, le variabili nella tabella dei dati implicano una dipendenza dal tipo di dati forniti.
Vediamone un altro Esempio utilizzando tabelle di dati con un elenco di stringhe come input e output come conteggio degli elementi nella stringa.
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
Nell'esempio sopra, puoi notare che abbiamo fornito l'input come un elenco di array di stringhe e l'output è la dimensione di questo elenco di array. Pertanto, offre molta flessibilità per avere dati di input di diversi tipi.
Puoi anche menzionare semplicemente qualsiasi espressione che restituisca dati del rispettivo tipo di input e utilizzarla direttamente anche nelle tabelle di dati.
Ciclo di vita del blocco 'dove'
Per i test contenenti blocchi di dove e campioni di dati sotto forma di tabelle di dati, ogni riga di dati rappresenta un'esecuzione del metodo di prova.
Per esempio, se ci sono 5 righe di dati e il test contiene blocchi 'dato' e 'quando', allora per tale riga di dati i blocchi di prova verranno eseguiti una volta. Quindi, in totale, ci saranno un totale di 5 esecuzioni del metodo di prova.
Suggerimenti e trucchi
Vediamo alcuni suggerimenti e trucchi per i test parametrizzati mentre si lavora con queste tabelle di dati.
# 1) Visualizzazione separata dei risultati dell'esecuzione di singole righe. Come abbiamo visto nella sezione del ciclo di vita, per ogni riga di dati c'è un'esecuzione del codice di test. Per ottenere queste righe o risultati visualizzati separatamente per ciascuna di queste righe, è possibile utilizzare l'annotazione '@Unroll' per tali test.
Proviamo a capirlo con un esempio:
Useremo la stessa applicazione calcolatrice con 3 set di dati di input forniti al metodo in prova.
.torrent file come aprire
def 'sample parameterized test'() -20
Senza l'annotazione '@Unroll', vediamo come appare il risultato nel terminale (così come i rapporti basati su html). Con questo tipo di output, diventa difficile scoprire quale set di input ha causato il fallimento del test.
Ora vediamo come l'output del test viene riportato separatamente per ciascuna riga dopo aver aggiunto l'annotazione '@Unroll' al metodo di test (che ha tabelle di dati come input di dati).
#Due) Ora, cerchiamo di capire come aggiungere informazioni significative a questi test basati sui dati (invece di alcuni indici aggiunti automaticamente come nello screenshot sopra).
Possiamo usare segnaposto per le proprietà di input e output (come da tabella dati) e quindi possiamo vedere i valori popolati nei nomi dei test con i dati dalle tabelle di dati.
Utilizziamo lo stesso esempio e aggiorniamo il nome del test per ottenere i dati dall'input e dall'output previsto, come indicato nelle tabelle dei dati:
@Unroll def 'result of adding #input1 & #input2 should be #expectedResult'() given: def app = new CalculatorApp() when: def resultSum = app.add(input1, input1) then: resultSum == 2 * input1 where: input1
Ora vediamo come appare l'output nel terminale e nei rapporti basati su HTML:
Quindi, come puoi vedere qui, i dati di input e output ora vengono visualizzati insieme ai nomi dei test quando vengono eseguiti. In questo modo rende la risoluzione dei problemi e il debug molto più semplici in quanto indica chiaramente quale input ha causato il fallimento o il comportamento anomalo del test.
Conclusione
In questo tutorial, abbiamo imparato a scrivere test parametrizzati con il framework Spock. Abbiamo anche discusso di varie caratteristiche delle tabelle di dati e di come possono essere utilizzate.
Dai un'occhiata al nostro prossimo tutorial per sapere come usare Mock e Stub con Spock !!
Tutorial PREV | PROSSIMO Tutorial
Lettura consigliata
- Scrittura di unit test con Spock Framework
- Domande dell'intervista a Spock con risposte (le più popolari)
- Spock per integrazione e test funzionali con selenio
- Spock beffardo e stubbing (esempi con tutorial video)
- Tutorial di Spock: test con Spock e Groovy
- Data Driven Framework in Selenium WebDriver utilizzando Apache POI
- Come eseguire test basati sui dati utilizzando lo strumento TestComplete
- Come funziona il test basato sui dati (esempi di QTP e selenio)