data driven parameterized testing with spock framework
Exploreu les maneres d'escriure proves basades en dades o parametritzades amb Spock Framework:
En aquest Sèrie de cursos de formació gratuïta sobre Spock , ho vam explorar tot Proves unitàries a Spock i Dispositius de prova, afirmacions i informes al nostre tutorial anterior.
En aquest tutorial, intentarem entendre què són les proves parametritzades i com podeu aprofitar les funcions integrades de Spock per aconseguir proves basades en dades.
Comencem!!
Mireu el vídeo tutorial
Què aprendreu:
- Què són les proves parametritzades?
- Escriptura de proves parametritzades amb Spock
- Cicle de vida del bloc 'on'
- Consells i trucs
- Conclusió
- Lectura recomanada
Què són les proves parametritzades?
Per a qualsevol persona que hagi treballat amb proves d'automatització / unitats, les proves basades en dades no són un terme nou.
Les proves parametritzades no són res, sinó que són qualsevol tipus de proves que comparteixen la mateixa lògica d'execució i que només difereixen en les dades d'entrada i el resultat en alguns casos.
Exemple: Suposem que teniu una aplicació Calculadora, per tal de provar completament la funcionalitat, potser voldreu executar les proves amb diferents conjunts d’entrada.
Exemple: Valors negatius, nombres fraccionaris, enters normals, enters que s'acosten al rang màxim permès, etc. No importa els valors d'entrada que tingueu, voleu executar la mateixa lògica d'execució.
Una altra bona raó per escriure proves parametritzades és que no només prova un camí feliç, sinó que també prova el camí d’error o els escenaris negatius.
Exemple: Suposem que hi ha una aplicació que retorna si una extensió de fitxer determinada és vàlida o no. Les proves basades en dades poden permetre ràpidament al desenvolupador executar proves d’extensions de fitxers admeses i de qualsevol escenari d’error o proves d’entrada negatives.
Ara, tradicionalment, es pot pensar en escriure o copiar les proves de diversos valors d’entrada, però no és la manera correcta ni intel·ligent d’aconseguir aquest tipus d’execució de proves. A més, a mesura que el nombre de proves comença a augmentar a la vostra aplicació, aquestes proves seran difícils de mantenir.
Escriptura de proves parametritzades amb Spock
El bloc on:
El bloc d'on en una prova Spock és el bloc que conté dades per a la prova parametritzada. Opcionalment, pot contenir tant valors d’entrada com de sortida esperats. Un punt important a destacar sobre aquest bloc és que aquest hauria de ser l’últim bloc en una prova de Spock.
Dit això, es pot combinar amb tots els altres blocs com els indicats, quan i llavors, però hauria de ser l'últim bloc.
Vegem un exemple per entendre-ho millor
Utilitzarem una aplicació de calculadora que pren 2 paràmetres d’entrada i retorna la suma de les entrades subministrades. Escriureem una prova parametritzada que subministri diverses entrades i valors de sortida esperats.
def 'sample parameterized test'() input2
A l'exemple de codi anterior podeu veure el següent:
- Bloc 'on' que conté les dades per executar la prova.
- El bloc 'on' és l'últim bloc de la prova.
- 'On' es combina amb els altres blocs, és a dir, donat, quan i després.
- La representació de dades és un format especial anomenat taules de dades que examinarem amb detall a les properes seccions d’aquest tutorial.
- La fila de dades de capçalera són essencialment les propietats / variables d'entrada que es poden utilitzar directament a la prova. Per exemple. Consulteu la declaració del bloc 'quan' on hem utilitzat directament entrada1 i entrada2 com a paràmetres d’entrada sense definir-los explícitament.
Ús de dades
Intentem comprendre detalladament les taules de dades ara. Cada línia de la taula de dades representa dades per a un escenari individual (execució de la prova).
Per convenció, és a dir, els valors d’entrada són precedits per una única canonada (‘|’) mentre que els valors de sortida són precedits per una canonada doble (‘||’). Això no té cap significat lògic, però és convencional i millora la llegibilitat. Per tant, els dos exemples següents es mantenen certs.
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
La fila de capçalera, tal com es mostra més amunt, té un nom per a cadascun dels paràmetres proporcionats com a dades a provar. Aquí és important tenir en compte que aquests noms de paràmetres no haurien de xocar amb cap variable local / global existent a la prova, sinó hi haurà errors en temps de compilació per resoldre noms de variables.
Un punt important a tenir en compte en utilitzar taules de dades és que es requereixen un mínim de 2 columnes. Si només necessiteu una columna, una columna en blanc amb valors com a caràcter de subratllat és una solució com la següent.
input1 ||_ 10 ||_ -4 ||_
L’avantatge d’aquest format és la simplicitat, la llegibilitat i l’extensibilitat. Afegir una nova entrada de dades és tan senzill com afegir una fila nova amb valors de dades.
Un altre punt a destacar aquí és que les taules de dades es poden utilitzar per contenir qualsevol tipus de variables, classes, objectes, enumeracions, etc. que la facin encara més potent. Com que groovy és un llenguatge escrivit opcionalment, si no s'especifica un tipus explícit, les variables de la taula de dades impliquen en funció del tipus de dades subministrades.
Vegem-ne un altre Exemple utilitzant taules de dades amb una llista de cadenes com a entrada i sortida com a recompte d’elements de la cadena.
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
A l'exemple anterior, podeu notar que hem proporcionat l'entrada com a llista de matrius de cadenes i la sortida és la mida d'aquesta llista de matrius. Per tant, proporciona molta flexibilitat per tenir dades d’entrada de diferents tipus.
També podeu esmentar qualsevol expressió que retorni dades del tipus d’entrada respectiu i que també s’utilitzi a les taules de dades.
Cicle de vida del bloc 'on'
Per a les proves que contenen mostres de blocs i dades en forma de taules de dades, cada fila de dades representa una execució del mètode de prova.
Per exemple, si hi ha 5 files de dades i la prova conté blocs 'donats' i 'quan', llavors, per a aquesta fila de dades, els blocs de prova s'executaran una vegada. Per tant, en general hi haurà un total de 5 execucions del mètode de prova.
Consells i trucs
Vegem alguns consells i trucs per a les proves parametritzades mentre treballem amb aquestes taules de dades.
# 1) Mostrant els resultats de l'execució de files individuals per separat. Com hem vist a la secció del cicle de vida, per a cada fila de dades hi ha una execució del codi de prova. Per tal que aquestes files o resultats es mostrin per separat per a cada fila, es pot fer servir anotació '@ Desenrotlla' per fer aquestes proves.
Intentem entendre-ho amb un exemple:
Utilitzarem la mateixa aplicació de calculadora amb 3 conjunts de dades d’entrada subministrades al mètode que es prova.
com crear un nou projecte en eclipsi
def 'sample parameterized test'() -20
Sense l’anotació '@ Unroll', vegem com queda el resultat al terminal (així com els informes basats en html). Amb aquest tipus de sortida, es fa difícil esbrinar quin conjunt d’entrada ha provocat el fracàs de la prova.
Ara veurem com s’informa la sortida de la prova per separat per a cada fila després d’afegir l’anotació '@ Unroll' al mètode de prova (que inclou taules de dades com a entrada de dades).
# 2) Ara, entenem com afegir informació significativa a aquestes proves basades en dades (en lloc d’alguns índexs afegits automàticament com a la captura de pantalla anterior).
Podem utilitzar espais reservats per a les propietats d’entrada i sortida (segons la taula de dades) i després podem veure els valors poblats en noms de proves amb dades de les taules de dades.
Utilitzem el mateix exemple i actualitzem el nom de la prova per obtenir dades de l'entrada i de la sortida esperada tal com s'esmenta a les taules de dades:
@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
Ara vegem com queda la sortida al terminal i als informes basats en HTML:
Per tant, com podeu veure aquí, les dades d'entrada i sortida es mostren juntament amb els noms de la prova quan s'estan executant. D’aquesta manera facilita molt la resolució de problemes i la depuració, ja que indica clarament quina entrada va provocar que la prova fallés o es portés malament.
Conclusió
En aquest tutorial, hem après a escriure proves parametritzades amb el framework Spock. També vam parlar de diverses característiques de les taules de dades i de com es poden utilitzar.
Consulteu el nostre proper tutorial per saber com utilitzar Mock and Stubs amb Spock.
Lectura recomanada
- Proves d’unitat d’escriptura amb Spock Framework
- Preguntes d'entrevistes de Spock amb respostes (més populars)
- Spock per a la integració i proves funcionals amb seleni
- Spock burleta i obstrucció (exemples amb tutorials de vídeo)
- Spock Tutorial: proves amb Spock i Groovy
- Marc basat en dades a Selenium WebDriver mitjançant Apache POI
- Com realitzar proves basades en dades mitjançant l'eina TestComplete
- Com funcionen les proves impulsades per dades (exemples de QTP i seleni)