writing unit tests with spock framework
Písanie testov jednotiek s programom Spock Framework: Testovacie prípravky, tvrdenia a správy
V tomto Kompletný sprievodca pre začiatočníkov v Spocku , stručná Úvod do Spock Framework a Groovy programovania bol uvedený v našom predchádzajúcom návode.
V tomto tutoriáli si prejdeme všetky podrobnosti / kroky potrebné na začiatok Testovanie jednotky v Spockovi.
Kvôli jednoduchosti otestujeme jednoduchú aplikáciu Kalkulačka, ktorá má rôzne metódy ako sčítanie, odčítanie, násobenie, delenie atď., Ktoré všetky akceptujú celočíselné parametre a vrátia celočíselný výstup.
Čo sa dozviete:
- Testovanie jednotiek s výučbovým videom Spock
- Začíname
- Kľúčové slovo „def“
- Životný cyklus špecifikácie Spock
- Spock tvrdenia
- Podávanie správ
- Záver
- Odporúčané čítanie
Testovanie jednotiek s výučbovým videom Spock
Začíname
Podobne ako v iných rámcoch na testovanie jednotiek, aj Spock sa dá použiť na písanie scenárov / testovacích prípadov pre testovanú aplikáciu. Pokúsime sa porovnať a porovnať rôzne vlastnosti rámca Spock s existujúcimi / známymi rámcami ako napr JUnit .
Kľúčové slovo „def“
Najprv sa pokúsime stručne porozumieť kľúčovému slovu Groovy „def“. Kľúčové slovo def sa používa na definovanie typu def a možno ho použiť na deklaráciu funkcie, ako aj poľa / premennej.
Výraz „def“ sa zvyčajne používa, keď nechceme obmedziť typ poľa alebo vrátiť typ metódy. Pozrime sa na niekoľko príkladov kľúčového slova def v triede groovy a všetkých jeho platných zvyklostí.
// def as variable types def inputNum = 100 def inputStr = 'hello world!!' def app = new CalculatorApp() // def as return type of function def 'test function'() { // function body here }
Životný cyklus špecifikácie Spock
Spock spec pri spustení vyhľadá všetky definované testy a vykoná ich jeden po druhom. Existuje však niekoľko ďalších funkcií / funkcií, ktoré poskytuje Spock, aby boli testy menej nadbytočné a čitateľnejšie.
Pozrime sa na niektoré funkcie nižšie:
Definovanie vstupov / premenných ako súčasti špec
Zvážte vykonanie viacerých testov, pri ktorých sa použijú rovnaké vstupné hodnoty. Jedným zo spôsobov by bolo inicializovať vstupné hodnoty v každom teste jednotlivo, inak môžeme priamo definovať polia na úrovni špecifikácie a zabezpečiť, aby pred každým testom boli polia inicializované a dostupné pre vykonaný test.
Pozrime sa na príklad našej triedy aplikácií kalkulačky .
Definujeme vstupné údaje na úrovni špecifikácie tak, aby boli k dispozícii s počiatočnými hodnotami pre všetky testy uvedené v špecifikácii.
class CalculatorAppSpec extends Specification { def input1 = 50 def input2 = 10 def result = 0 def app = new CalculatorApp() def 'addition with valid inputs return expected result'() { when: result = app.add(input1, input2) then: result == 60 } def 'multiplication with valid inputs return expected result'() { when: result = app.multiply(input1, input2) then: result == 500 } def 'division with valid inputs return expected result'() { when: result = app.divide(input1, input2) then: result == 5 } def 'subsctraction with valid inputs return expected result'() { when: result = app.substract(input1, input2) then: result == 40 } }
V tejto ukážke kódu vidíte, že sme definovali vstup1, vstup2, testovanú aplikáciu a výsledok na úrovni špecifikácie. To zaisťuje, že pri každom spustení testu zo súborov spec sa do tohto testu odovzdajú inicializované polia. To skutočne vylučuje potrebu zakaždým nastavovať testy so vstupnými hodnotami.
Testovacie prípravky
Podobne ako väčšina rámcov na testovanie jednotiek, Spock poskytuje aj metódy nastavenia a čistenia na vykonávanie špeciálnej logiky / úloh pri konkrétnych udalostiach životného cyklu vykonávania testu.
setupSpec & cleanupSpec
Tieto metódy sa volajú raz pre každé vykonanie Spec a volajú sa pred a po vykonaní testu. Sú porovnateľné s @ Predtrieda a @ Po hodine anotácie JUnit.
nastavenie a vyčistenie
Tieto metódy sa volajú pred a po vykonaní každého testu v špecifikácii.
Tieto háky sú správnym miestom pre každú logiku / časť kódu, ktorú chcete vykonať pred a po vykonaní testu. Napríklad , Pri čistení môžete napísať kód na ukončenie databázového pripojenia (ak existuje), ktoré bolo použité počas testu.
Dajú sa porovnať s @ BeforeTest a @ AfterTest anotácie v JUnit.
Pozrime sa na príklad týchto prípravkov v našom teste aplikácie kalkulačky.
def setupSpec() { println('###in setup spec!') } def cleanupSpec() { println('###in cleanup spec!') } def setup() { println('>>>in test setup!') } def cleanup() { println('>>>in test cleanup!') }
Ak je vyššie uvedený kód testovacieho zariadenia pridaný k špecifikácii obsahujúcej 4 testy, bude výstup uvedený nižšie:
prevodník z YouTube na wav zadarmo na stiahnutie
###in setup spec! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! ###in cleanup spec!
Spock tvrdenia
Tvrdenia v Spocku sa nazývajú power assert (a to bolo adoptované groovy neskôr po zavedení Spockom). Spockove tvrdenia poskytujú veľa diagnostických výnimiek v prípade akýchkoľvek zlyhaní tvrdenia.
Jeden môže ľahko zistiť, čo sa pokazilo, jednoduchým pohľadom na diagnostiku zlyhania na rozdiel od podrobností AssertionErrors v JUnit a iných rámcoch.
Skúsme to pochopiť na príklade a porovnajme to s JUnit
Budeme pracovať s jednoduchým testom, ktorý skontroluje rovnosť reťazcov a zistí, aké diagnostiky sa vygenerujú v prípade zlyhania tvrdenia.
Spockov test
def 'check case-insensitive equality of 2 strings'() { given: 'two input strings' String str1 = 'hello' String str2 = 'HELLO world' when: 'strings are lowercased' str1 = str1.toLowerCase() str2 = str2.toLowerCase() then: 'equal strings should return success' str1 == str2 }
JUnit Test
@Test public void compareStrings_withValidInput_shouldReturnSuccess() { // Arrange String str1 = 'hello'; String str2 = 'HELLO world'; // Act str1 = str1.toLowerCase(); str2 = str2.toLowerCase(); // Assert Assert.assertEquals(str1,str2); }
Spock výstup
Condition not satisfied: str1 == str2 | | | hello| hello world false 6 differences (45% similarity) hello(------) hello( world) Expected :hello world Actual :hello
Výstup JUnit
org.junit.ComparisonFailure: Expected :hello Actual :hello world
Ako môžete odvodiť zhora, diagnostické informácie poskytované spoločnosťou Spock majú lepšie podrobnosti a sú v porovnaní s ostatnými rámcami ako JUnit užívateľsky príjemnejšie.
Tipy a triky na uplatnenie
Vkladanie viacerých prvkov naraz - Spock poskytuje rôzne skratky pre tvrdenia a jedným z nich je zápis „*“, ktorý umožňuje uplatnenie prvkov v zozname.
Poďme to pochopiť na príklade:
Zvážte triedu CityInfo, ktorá má ako polia cityName a populáciu. Napíšeme Spockov test, aby sme presadili názvy miest, ktoré sa v danom zozname nachádzajú.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; }
Pozrime sa teraz na test:
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') }
Ako je uvedené v skratke tvrdenia vyššie, celý zoznam môžete overiť pomocou kľúčového slova „*“.
Pozrime sa tiež, ako by vyzerala porucha. Z tvrdenia vyššie odstránim názov ktoréhokoľvek mesta.
Condition not satisfied: cityList*.cityName == ('Delhi', 'Chennai') | | | | | false | (Mumbai, Delhi, Chennai) (app.CityInfo@31368b99, app.CityInfo@1725dc0f, app.CityInfo@3911c2a7)
Môžete vidieť, že diagnostické informácie o zlyhaní tvrdenia sú bohaté a ľahko pochopiteľné.
Využitie parametra ukončenia - každý ().
Pozrime sa, ako môžeme využiť parameter uzavretia s názvom every () na pridanie tvrdenia pre každý prvok zoznamu alebo kolekcie. V rovnakom príklade skúsme pridať tvrdenie, ktoré overí počet obyvateľov každého mesta, ak je zadaný vstup> 50.
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') and: cityList.population.every() { it > 50 } }
Uplatňovanie vyhodených výnimiek
Možno tvrdiť, že sa vrhajú výnimky do bloku „potom“ (čo znamená, že keď je blok tiež požadovaný). Podrobnosti o výnimke možno diagnostikovať priradením vyvolanej výnimky k poľu a uplatnením požadovaných vlastností vyvolanej výnimky.
Použime rovnakú triedu CityInfo a definujme metódu, ktorá vyvolá výnimku, a napíšeme pre ňu test.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; public CityInfo() { } public int getCleanlinessScore() { throw new RuntimeException('method not implemented'); } }
Pozrime sa teraz na test:
def 'cleanliness score throws runtime exception with message - method not implemented'() { given: CityInfo app = new CityInfo(); when: app.cleanlinessScore() then: def e = thrown(RuntimeException) e.message == 'method not implemented' }
Podávanie správ
Na generovanie krásnych a podrobných správ založených na formáte HTML sú k dispozícii knižnice, ktoré je možné pridať do súboru zostavenia. Teraz, kedykoľvek sa počas zostavovania (alebo priamym vykonaním) vykonajú testy, sa v výstupný priečinok.
Ak chcete, aby sa protokoly o testoch generovali, pridajte do súboru build.gradle (a podobne aj pre súbor Maven pom.xml) nasledujúce knižnice.
testCompile 'com.athaydes:spock-reports:1.6.1' testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13'
Teraz zostavte projekt a vykonajte testy spustením všetkých testov v priečinku „test“ alebo vykonaním „ gradle čistý test “.
Môžete otvoriť index.html súboru získate súhrnnú správu o všetkých špecifikáciách Spocku, ktoré boli k dispozícii na vykonanie.
ako napísať testovací plán
Ak chcete zobraziť podrobnú správu pre konkrétnu špecifikáciu, kliknite na špecifikáciu z vyššie uvedeného zoznamu a uvidíte podrobnú správu o zlyhaniach aj úspechoch.
Záver
V tomto tutoriáli sme sa venovali základom testovania jednotiek pomocou Spock Framework. Videli sme rôzne spôsoby a skratky pre písanie tvrdení a druh bohatých diagnostických informácií generovaných Spockovým rámcom pre zlyhania tvrdení.
Pozreli sme sa tiež na to, ako môžeme vygenerovať tiché pekné správy založené na HTML pre testy Spock, ktoré obsahujú rovnako podrobnú diagnostiku vykonaných testov.
Náš nadchádzajúci tutoriál vás podrobne oboznámi s písaním parametrizovaných testov so Spockom !!
Výukový program PREV | NEXT Tutorial
Odporúčané čítanie
- Testovanie na základe dát alebo parametrizovanie pomocou Spock Framework
- Spock Interview Otázky s odpoveďami (najobľúbenejšie)
- Spock pre integráciu a funkčné testovanie so selénom
- Spock Mocking and Stubbing (Príklady s videonávodmi)
- Výukový program pre Spock: Testovanie s programom Spock a Groovy
- Výukový program Mockito: Rámec Mockito pre simuláciu pri testovaní jednotiek
- Rozdiely medzi testovaním jednotiek, testovaním integrácie a funkčným testovaním
- Kľúč k úspešnému testovaniu jednotiek - Ako vývojári testujú svoj vlastný kód?