writing unit tests with spock framework
Pisanje enotnih testov s Spock Framework: preizkusi, trditve in poročanje
V tem Izpolnite Vodnik za začetnike na Spocku , kratko Uvod v Spock Framework in Groovy programiranje je bila podana v prejšnji vadnici.
V tej vadnici si bomo ogledali vse podrobnosti / korake, ki so potrebni za začetek Enotno testiranje v Spocku.
Zaradi poenostavitve bomo preizkusili preprosto aplikacijo kalkulatorja, ki ima različne metode, kot so seštevanje, odštevanje, množenje, deljenje itd., Ki sprejemajo celoštevilčne parametre in vrnejo celoštevilski izhod.
Kaj se boste naučili:
- Enotno testiranje z video vadnico Spock
- Kako začeti
- Ključna beseda 'def'
- Specifikacija življenjskega cikla Spocka
- Spockove trditve
- Poročanje
- Zaključek
- Priporočeno branje
Enotno testiranje z video vadnico Spock
Kako začeti
Podobno kot v vseh drugih enotah za testiranje enot lahko tudi Spock uporabljamo za pisanje scenarijev / testnih primerov za preizkušano aplikacijo. Poskusili bomo primerjati in primerjati različne značilnosti okvira Spock z obstoječimi / znanimi okviri, kot je JUnit .
Ključna beseda 'def'
Najprej poskusimo na kratko razumeti Groovyjevo ključno besedo 'def'. Ključna beseda def se uporablja za določanje tipa-def, z njo pa lahko razglasimo funkcijo in polje / spremenljivko.
»Def« se običajno uporablja, kadar ne želimo omejiti vrste polja ali vrniti vrste metode. Oglejmo si nekaj primerov ključne besede def v groovy razredu in vseh njenih veljavnih načinov uporabe.
// 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 } Specifikacija življenjskega cikla Spocka
Spock spec ob izvedbi poišče vse opredeljene teste in jih izvede enega za drugim. Vendar pa obstaja nekaj drugih funkcij / funkcij, ki jih ponuja Spock, da bi bili testi manj odvečni in bolj berljivi.
Spodaj bomo razpravljali o nekaterih funkcijah:
Določanje vhodov / spremenljivk kot del specifikacije
Razmislite o večkratnih preizkusih, pri katerih se uporabljajo enake vhodne vrednosti. Eden od načinov bi bil inicializirati vhodne vrednosti v vsakem testu posebej, sicer lahko polja neposredno določimo na ravni specifikacij in zagotovimo, da bodo polja pred vsakim testom inicializirana in na voljo preizkusu, ki se izvaja.
Oglejmo si primer za naš razred aplikacije kalkulatorja .
Vhodne podatke bomo opredelili na ravni specifikacij, tako da bodo z začetnimi vrednostmi na voljo vsem testom, ki so prisotni v specifikaciji.
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 tem vzorcu kode lahko vidite, da smo definirali input1, input2, aplikacijo, ki se preizkuša, in rezultat na ravni specifikacij. To zagotavlja, da se vsakič, ko se test zažene iz datotek s specifikacijami, in inicializirana polja prenesejo na ta test. To dejansko odpravlja potrebo po vsaki nastavitvi testov z vhodnimi vrednostmi.
najlažji način za dodajanje vrednosti v matriko je uporaba
Testne napeljave
Podobno kot pri večini okvirov za preskušanje enot tudi Spock ponuja metode nastavitve in čiščenja za izvajanje posebne logike / nalog pri določenih dogodkih življenjskega cikla izvajanja testa.
setupSpec & cleanupSpec
Te metode se pokličejo enkrat za vsako izvedbo Spec in se pokličejo pred in po izvedbi preizkusa. Ti so primerljivi z @ Predrazred in @ Po pouku pripise JUnit.
namestitev in čiščenje
Te metode se pokličejo pred in po izvedbi vsakega preizkusa v specifikaciji.
Ti kavlji so pravo mesto za katero koli logiko / kos kode, ki bi ga radi izvedli pred in po izvedbi testa. Na primer , Pri čiščenju lahko napišete kodo, s katero zaprete povezavo do baze podatkov (če obstaja), ki je bila uporabljena med preskusom.
Te lahko primerjamo z @ BeforeTest in @ AfterTest pripise v JUnit.
Oglejmo si primer teh naprav v našem testu za uporabo kalkulatorja.
def setupSpec() { println('###in setup spec!') } def cleanupSpec() { println('###in cleanup spec!') } def setup() { println('>>>in test setup!') } def cleanup() { println('>>>in test cleanup!') } Če je zgornja koda preskusne napeljave dodana v specifikacijo, ki vsebuje 4 preizkuse, bo izhod naslednji:
###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! Spockove trditve
Trditve v Spocku se imenujejo uveljavljanje moči (in Groovy ga je sprejel kasneje, potem ko ga je Spock predstavil). Spockove trditve ponujajo veliko diagnostičnih izjem v primeru kakršnih koli napak pri uveljavljanju.
Enostavno lahko ugotovimo, kaj je šlo narobe, tako da preprosto pogledamo diagnostiko napak, namesto da bi bili podrobni AssertionErrors v JUnit in drugih okvirih.
Poskusimo to razumeti s primerom in ga primerjamo z JUnit
Delali bomo s preprostim testom, ki preveri, ali obstaja niz enakosti, in ugotovili, kakšna diagnostika se ustvari v primeru napake trditve.
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 izhod
Condition not satisfied: str1 == str2 | | | hello| hello world false 6 differences (45% similarity) hello(------) hello( world) Expected :hello world Actual :hello Izhod JUnit
org.junit.ComparisonFailure: Expected :hello Actual :hello world Kot lahko sklepate od zgoraj, imajo diagnostične informacije, ki jih ponuja Spock, boljše podrobnosti in so uporabniku prijaznejše v primerjavi z drugimi ogrodji, kot je JUnit.
Trditev Nasveti in triki
Uveljavitev več elementov hkrati - Spock ponuja različne okrajšave za trditve, ena izmed njih je zapis »*«, ki omogoča uveljavitev elementov na seznamu.
Razumimo to s primerom:
Razmislite o razredu CityInfo, ki ima kot ime cityName in prebivalstvo. Napisali bomo Spockov test, s katerim bomo uveljavili imena mest, ki so tam na danem seznamu.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; } Oglejmo si test zdaj:
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') } Kot je prikazano v trditvi zgoraj, lahko celoten seznam potrdite s pomočjo ključne besede '*'.
Poglejmo tudi, kako bi izgledala napaka. Iz zgornje trditve bom odstranil ime katerega koli mesta.
Condition not satisfied: cityList*.cityName == ('Delhi', 'Chennai') | | | | | false | (Mumbai, Delhi, Chennai) (app.CityInfo@31368b99, app.CityInfo@1725dc0f, app.CityInfo@3911c2a7) Vidite lahko, da so diagnostične informacije o napaki trditve bogate in enostavne za razumevanje.
Parameter zapiranja vzvoda - vsak ().
Poglejmo, kako lahko uporabimo parameter zapiranja z imenom every (), da dodamo trditev za vsak element seznama ali zbirke. V istem primeru poskusimo dodati trditev, ki potrjuje prebivalstvo vsakega mesta, če je dani vnos> 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 } } Uveljavljanje vrženih izjem
Izjeme lahko zatrdimo, da jih vržemo v blok »then« (kar pomeni, kadar je potreben tudi blok). Podrobnosti izjeme je mogoče diagnosticirati tako, da vrženo izjemo dodelite polju in uveljavite zahtevane lastnosti vržene izjeme.
Uporabimo isti razred CityInfo in določimo metodo, ki vrže izjemo, in za to napišimo 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'); } } Poglejmo zdaj 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' } Poročanje
Za ustvarjanje lepih in podrobnih poročil, ki temeljijo na HTML, so na voljo knjižnice, ki jih je mogoče dodati v datoteko gradnje, zdaj pa se bodo, kadar se bodo preizkusi med gradnjo izvedli (ali z neposrednim izvajanjem), v izhodna mapa.
Če želite pridobiti poročila o preskusih, dodajte naslednje knjižnice v datoteko build.gradle (in podobno tudi v datoteko Maven pom.xml).
testCompile 'com.athaydes:spock-reports:1.6.1' testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13' Zdaj zgradite projekt in izvedite teste tako, da zaženete vse teste v mapi »test« ali izvedete » čist test '.

Lahko odprete index.html datoteko, da dobite strnjeno poročilo za vse specifikacije Spocka, ki so bile na voljo za izvedbo.

Če želite videti podrobno poročilo za določeno specifikacijo, kliknite na specifikacijo z zgornjega seznama in videli boste podrobno poročilo o napakah in uspehih.

Zaključek
V tej vadnici smo z Spock Framework zajeli osnove enotnega testiranja. Videli smo različne načine in okrajšave za pisanje trditev in vrsto bogatih diagnostičnih informacij, ki jih ustvarja Spockov okvir za napake pri trditvah.
Preučili smo tudi, kako bi lahko ustvarili tiha poročila, ki temeljijo na HTML-ju, za Spockove teste, ki vključujejo enako podrobno diagnostiko za izvedene teste.
Naša prihajajoča vadnica vas bo podrobno seznanila s pisanjem parametriziranih testov s Spockom !!
PREV Vadnica | NASLEDNJA Vadnica
Priporočeno branje
- Podatkovno ali parametrizirano testiranje s Spock Framework
- Vprašanja za intervju z Spockom z odgovori (najbolj priljubljeno)
- Spock za integracijo in funkcionalno testiranje s selenom
- Spock posmehovanje in zatiranje (primeri z video vajami)
- Vadnica za Spock: Testiranje s Spockom in Groovyjem
- Vadnica za Mockito: Mockito Framework za posmeh pri preskušanju enot
- Razlike med preskušanjem enot, preskušanjem integracije in funkcionalnim preskušanjem
- Ključ do uspešnega testiranja enot - kako razvijalci preizkušajo lastno kodo?