data driven parameterized testing with spock framework
Explorați modalitățile de scriere a testelor bazate pe date sau parametrizate cu Spock Framework:
In acest Seria gratuită de instruire Spock Training , am explorat totul Testarea unității în Spock și Dispozitive de testare, afirmații și raportare în tutorialul nostru anterior.
În acest tutorial, vom încerca să înțelegem ce sunt testele parametrizate și cum puteți utiliza funcțiile integrate ale Spock pentru a realiza teste bazate pe date.
Să începem!!
Urmăriți Tutorialul video
Ce veți învăța:
- Ce sunt testele parametrizate?
- Scrierea testelor parametrizate cu Spock
- Ciclul de viață al blocului „unde”
- Sfaturi si trucuri
- Concluzie
- Lectură recomandată
Ce sunt testele parametrizate?
Pentru oricine a lucrat cu automatizare / teste unitare, testarea bazată pe date nu este un termen nou.
Testele parametrizate nu sunt altceva decât sunt orice fel de teste care împărtășesc aceeași logică de execuție și diferă doar în datele de intrare și rezultatul în unele cazuri.
Exemplu: Să presupunem că aveți o aplicație Calculator, pentru a testa complet funcționalitatea, vă recomandăm să rulați testele pe diferite seturi de intrare.
Exemplu: Valori negative, numere fracționare, numere întregi normale, numere întregi care se apropie de intervalul maxim permis etc. Nu contează ce valori de intrare aveți, doriți să rulați aceeași logică de execuție.
Un alt motiv bun pentru a scrie teste parametrizate este că nu doar testează o cale fericită, ci mai degrabă testează calea de eroare sau scenariile negative.
Exemplu: Să presupunem că există o aplicație care returnează dacă o anumită extensie de fișier este validă sau nu. Testele bazate pe date pot permite dezvoltatorului să execute rapid teste pentru extensiile de fișiere acceptate și orice scenarii de eroare sau teste de intrare negative.
Acum, în mod tradițional, vă puteți gândi să scrieți sau să copiați testele pentru mai multe valori de intrare, dar acesta nu este modul corect sau inteligent de a realiza acest tip de execuție a testului. Mai mult, pe măsură ce numărul testelor începe să crească în aplicația dvs., aceste teste vor deveni dificil de întreținut.
Scrierea testelor parametrizate cu Spock
Blocul unde:
Blocul unde dintr-un test Spock este blocul care conține date pentru testul parametrizat. Opțional poate conține atât valori de intrare, cât și valori de ieșire așteptate. Un punct important de remarcat despre acest bloc este că acesta ar trebui să fie ultimul bloc dintr-un test Spock.
Acestea fiind spuse, poate fi combinat cu toate celelalte blocuri, cum ar fi date, când și apoi, dar ar trebui să fie ultimul bloc.
Să vedem un exemplu pentru a-l înțelege mai bine
Vom folosi o aplicație de calculator care ia 2 parametri de intrare și returnează suma intrărilor furnizate. Vom scrie un test parametrizat care furnizează mai multe intrări și valori de ieșire așteptate.
def 'sample parameterized test'() input2
În exemplul de cod de mai sus puteți vedea următoarele:
- Blocul „unde” care conține datele pentru efectuarea testului.
- Blocul „unde” este ultimul bloc al testului.
- „Unde” este combinat cu celelalte blocuri, adică dat, când și apoi.
- Reprezentarea datelor este un format special numit tabele de date pe care le vom analiza în detaliu în următoarele secțiuni ale acestui tutorial.
- Rândul antet de date este în esență proprietățile / variabilele de intrare care pot fi utilizate direct în test. De exemplu. Consultați declarația din blocul „când” unde am folosit-o direct input1 și intrare2 ca parametri de intrare fără a le defini în mod explicit.
Utilizarea tabelelor de date
Să încercăm să înțelegem în detaliu tabelele de date acum. Fiecare linie a tabelului de date reprezintă date pentru un scenariu individual (execuția testului).
Prin convenție, adică valorile de intrare sunt precedate de o singură conductă („|”), în timp ce valorile de ieșire sunt precedate de o conductă dublă („||”). Acest lucru nu are nicio semnificație logică, dar este convențional și îmbunătățește lizibilitatea. Astfel, ambele exemple de mai jos sunt valabile.
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
Rândul de antet, așa cum se arată mai sus, are un nume pentru fiecare dintre parametrii furnizați ca date de testat. Este important să rețineți aici că aceste nume de parametri nu ar trebui să intre în conflict cu nicio variabilă locală / globală existentă în test, altfel vor exista erori în timpul compilării pentru a rezolva numele variabilelor.
Un punct important de reținut în timpul utilizării tabelelor de date este că este necesar un minim de 2 coloane. Dacă aveți nevoie doar de o coloană, atunci o coloană goală cu valori ca caracter de subliniere este o soluție ca mai jos.
input1 ||_ 10 ||_ -4 ||_
Avantajul acestui format este simplitatea, lizibilitatea și extensibilitatea. Adăugarea unei noi date de intrare este la fel de simplă precum adăugarea unui rând nou cu valori de date.
Un alt punct de remarcat aici este că tabelele de date pot fi utilizate pentru a conține orice tip de variabile, clase, obiecte, enumere etc., care îl fac și mai puternic. Deoarece groovy este un limbaj tastat opțional, dacă nu este specificat un tip explicit, variabilele din tabelul de date implică în funcție de tipul de date furnizate.
Să vedem altul Exemplu folosind tabele de date cu o listă de șiruri ca intrare și ieșire ca număr de elemente din șir.
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
În exemplul de mai sus, puteți observa că am furnizat date de intrare ca o listă de matrice de șiruri, iar ieșirea este de mărimea acestei liste de matrice. Astfel, oferă multă flexibilitate pentru a avea date de intrare de diferite tipuri.
De asemenea, puteți menționa pur și simplu orice expresii care returnează date de tipul respectiv de intrare și se utilizează direct în tabelele de date.
Ciclul de viață al blocului „unde”
Pentru testele care conțin blocuri și eșantioane de date sub formă de tabele de date, fiecare rând de date reprezintă o execuție a metodei de testare.
De exemplu, dacă există 5 rânduri de date și testul conține blocuri „date” și „când”, atunci pentru astfel de rânduri de date blocurile de testare vor fi executate o singură dată. Deci, în general, vor exista un total de 5 execuții ale metodei de testare.
Sfaturi si trucuri
Să vedem câteva sfaturi și trucuri pentru teste parametrizate în timp ce lucrăm cu aceste tabele de date.
# 1) Afișarea rezultatelor execuției rândurilor individuale separat. După cum am văzut în secțiunea ciclului de viață, pentru fiecare rând de date există o execuție a codului de testare. Pentru a obține aceste rânduri sau rezultate afișate separat pentru fiecare astfel de rând, adnotarea „@ Unroll” poate fi utilizată pentru astfel de teste.
Să încercăm să înțelegem acest lucru cu un exemplu:
Vom folosi aceeași aplicație de calcul cu 3 seturi de date de intrare furnizate metodei testate.
convertor de la YouTube la mp3 cu editare
def 'sample parameterized test'() -20
Fără adnotare „@Unroll”, să vedem cum arată rezultatul în terminal (precum și rapoartele bazate pe html). Cu acest tip de ieșire, devine dificil să aflăm ce set de intrări a determinat eșecul testului.
Acum, să vedem cum rezultatele testului sunt raportate separat pentru fiecare rând după adăugarea adnotării „@Unroll” la metoda de testare (care are tabele de date ca date de intrare).
#Două) Acum, permiteți-ne să înțelegem cum să adăugăm informații semnificative la aceste teste bazate pe date (în locul unor indici auto-adăugați ca în captura de ecran de mai sus).
Putem folosi substituenți pentru proprietățile de intrare și ieșire (conform tabelului de date) și apoi putem vedea valorile populate în numele testelor cu date din tabelele de date.
Să folosim același exemplu și să actualizăm numele testului pentru a obține date de la intrare și de la ieșirea preconizată așa cum se menționează în tabelele de date:
@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
Acum, să vedem cum arată ieșirea în terminal și rapoartele bazate pe HTML:
Deci, după cum puteți vedea aici, datele de la intrare și ieșire sunt acum afișate împreună cu numele testelor atunci când sunt executate. În acest fel, facilitează depanarea și depanarea, deoarece indică în mod clar ce intrare a cauzat eșecul testului sau comportamentul greșit.
Concluzie
În acest tutorial, am aflat despre scrierea testelor parametrizate cu cadrul Spock. De asemenea, am discutat despre diverse caracteristici ale tabelelor de date și despre modul în care acestea pot fi utilizate.
Consultați următorul nostru tutorial pentru a ști cum să folosiți Mock și Stubs cu Spock !!
Lectură recomandată
- Testarea unităților de scriere cu Spock Framework
- Întrebări de interviu cu răspunsuri Spock (Cele mai populare)
- Spock pentru integrare și testare funcțională cu seleniu
- Spock batjocură și stubbing (exemple cu tutoriale video)
- Tutorial Spock: Testare cu Spock și Groovy
- Cadru bazat pe date în Selenium WebDriver folosind Apache POI
- Cum se efectuează testarea bazată pe date folosind instrumentul TestComplete
- Cum funcționează testarea bazată pe date (exemple de QTP și seleniu)