writing unit tests with spock framework
Pisanje jedinstvenih testova sa Spock Framework-om: Ispitivanja, tvrdnje i izvještavanje
U ovome Kompletni vodič za početnike na Spocku , kratki Uvod u Spock Framework i Groovy programiranje je dato u našem prethodnom vodiču.
U ovom uputstvu proći ćemo kroz sve detalje / korake potrebne za početak Jedinstveno ispitivanje u Spocku.
Radi jednostavnosti testirat ćemo jednostavnu aplikaciju Kalkulator koja ima različite metode poput zbrajanja, oduzimanja, množenja, dijeljenja itd., A sve one prihvaćaju cjelobrojne parametre i vraćaju cjelobrojni izlaz.
Što ćete naučiti:
- Jedinstveno testiranje uz pomoć vodiča za Spock
- Početak rada
- Ključna riječ 'def'
- Životni ciklus Spock specifikacije
- Spockove tvrdnje
- Izvještavanje
- Zaključak
- Preporučena literatura
Jedinstveno testiranje uz pomoć vodiča za Spock
Početak rada
Slično bilo kojem drugom okviru za testiranje jedinice, i Spock se može koristiti za pisanje scenarija / test slučajeva za aplikaciju koja se testira. Pokušat ćemo usporediti i usporediti različite značajke Spock okvira sa postojećim / poznatim okvirima poput JUNIT .
Ključna riječ 'def'
Pokušajmo najprije ukratko razumjeti Groovyjevu ključnu riječ 'def'. Ključna riječ def koristi se za definiranje type-def, a može se koristiti za deklariranje funkcije kao i polja / varijable.
'Def' se obično koristi kada ne želimo ograničiti vrstu polja ili povratnu vrstu metode. Pogledajmo nekoliko primjera ključne riječi def u groovy klasi i svih njezinih valjanih upotreba.
// 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 } Životni ciklus Spock specifikacije
Spock spec. Kada se izvrši traži sve definirane testove i izvršava ih jedan po jedan. Međutim, malo je drugih funkcionalnosti / značajki koje nudi Spock kako bi testovi bili manje suvišni i čitljiviji.
Razmotrimo neke značajke u nastavku:
Utvrđivanje ulaza / varijabli kao dijela specifikacije
Razmislite o tome da imate više testova koji svi koriste iste ulazne vrijednosti. Jedan od načina bio bi inicijalizacija ulaznih vrijednosti u svakom testu pojedinačno, inače možemo izravno definirati polja na razini specifikacija i osigurati da će polja prije svakog testa biti inicijalizirana i dostupna testu koji se izvršava.
Pogledajmo primjer za našu klasu aplikacije za kalkulator .
Ulazne podatke definirat ćemo na razini specifikacija tako da budu dostupni s početnim vrijednostima svim testovima koji su prisutni u 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 } } U ovom uzorku koda možete vidjeti da smo definirali input1, input2, aplikaciju koja se testira i rezultat na razini specifikacija. To osigurava da se svaki put kada se test pokrene iz datoteka sa specifikacijama, a inicijalizirana polja prosljeđuju tom testu. To doista uklanja potrebu za postavljanjem testova svaki put s ulaznim vrijednostima.
Ispitna tijela
Slično većini okvira za jedinstveno testiranje, Spock također nudi metode postavljanja i čišćenja za izvršavanje posebne logike / zadataka u određenim događajima životnog ciklusa izvršavanja testa.
setupSpec & cleanupSpec
Te se metode pozivaju jednom za svako izvršavanje Spec-a i pozivaju se prije i nakon izvršavanja testa. Oni su usporedivi s @ BeforeClass i @ Nakon nastave bilješke JUnit-a.
postavljanje i čišćenje
Te se metode pozivaju prije i nakon izvođenja svakog testa u specifikaciji.
Ove su kuke pravo mjesto za bilo koju logiku / dio koda koji biste željeli izvršiti prije i nakon izvršavanja testa. Na primjer , U čišćenju možete napisati kod za zatvaranje veze s bazom podataka (ako postoji) koja je korištena tijekom testa.
To se može usporediti s @ BeforeTest i @ AfterTest napomene u JUnit-u.
Pogledajmo Primjer ovih čvora u našem testu za primjenu kalkulatora.
def setupSpec() { println('###in setup spec!') } def cleanupSpec() { println('###in cleanup spec!') } def setup() { println('>>>in test setup!') } def cleanup() { println('>>>in test cleanup!') } Ako se gornji kod ispitnog učvršćenja doda specifikaciji koja sadrži 4 testa, tada će se dobiti sljedeći rezultat:
###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 tvrdnje
Tvrdnje u Spocku nazivaju se potvrđivanjem snage (a Groovy ga je usvojio kasnije nakon što ga je Spock predstavio). Spockove tvrdnje pružaju puno dijagnostičkih iznimaka u slučaju bilo kakvih neuspjeha u tvrdnji.
Jednostavno se može saznati što je pošlo po krivu jednostavnim promatranjem dijagnostike kvara, za razliku od opširnog AssertionErrors u JUnit-u i drugim okvirima.
Pokušajmo to razumjeti na Primjeru i usporedimo ga s JUnit
Radit ćemo s jednostavnim testom koji provjerava postoji li jednakost nizova i vidjet ćemo koja se dijagnostika generira u slučaju neuspjeha tvrdnje.
Spock 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 izlaz
Condition not satisfied: str1 == str2 | | | hello| hello world false 6 differences (45% similarity) hello(------) hello( world) Expected :hello world Actual :hello JUnit izlaz
org.junit.ComparisonFailure: Expected :hello Actual :hello world Kao što možete zaključiti odozgo, dijagnostičke informacije koje pruža Spock imaju bolje detalje i jednostavnije su za korisnika u usporedbi s drugim okvirima poput JUnit.
Savjeti i trikovi za tvrdnje
Utvrđivanje više elemenata odjednom - Spock nudi razne skraćenice za tvrdnje, a jedna od njih je oznaka '*' koja omogućuje potvrđivanje elemenata na popisu.
Shvatimo to na primjeru:
Uzmite u obzir razred CityInfo koji kao polja ima CityName i stanovništvo. Napisat ćemo Spock test kako bismo utvrdili imena gradova koji se nalaze na danom popisu.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; } Pogledajmo sada 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') } Kao što je prikazano u gornjoj stenografiji tvrdnje, cijeli popis možete provjeriti uz pomoć ključne riječi '*'.
Da vidimo i kako bi izgledao neuspjeh. Uklonit ću ime bilo kojeg grada iz gornje tvrdnje.
Condition not satisfied: cityList*.cityName == ('Delhi', 'Chennai') | | | | | false | (Mumbai, Delhi, Chennai) (app.CityInfo@31368b99, app.CityInfo@1725dc0f, app.CityInfo@3911c2a7) Možete vidjeti da su dijagnostičke informacije neuspjeha tvrdnje bogate i lako razumljive.
najbolji način za pretvaranje YouTube videa u mp3
Korištenje parametra zatvaranja - svaki ().
Pogledajmo kako možemo iskoristiti parametar zatvaranja imenovan svaki () kako bismo dodali tvrdnju za svaki element popisa ili zbirke. U istom primjeru, pokušajmo dodati tvrdnju koja potvrđuje stanovništvo svakog grada ako je zadani ulaz> 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 } } Utvrđivanje izbačenih iznimaka
Iznimke se mogu tvrditi da se bacaju u blok 'tada' (što znači da kada je blok također potreban). Pojedinosti o iznimci mogu se dijagnosticirati dodjeljivanjem bačenog izuzetka polju i utvrđivanjem potrebnih svojstava bačenog izuzetka.
Upotrijebimo istu klasu CityInfo i definirajmo metodu koja donosi iznimku i napišimo test za nju.
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'); } } Pogledajmo sada 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' } Izvještavanje
Da bi se generirale lijepe i detaljne HTML temeljene prijave, postoje biblioteke koje se mogu dodati u datoteku gradnje, a sada kad god se testovi izvrše tijekom gradnje (ili izravnim izvršavanjem), detaljno izvješće temeljeno na HTML-u generirat će se u izlazna mapa.
Da biste generirali izvješća o testiranju, dodajte sljedeće knjižnice u datoteku build.gradle (a slično i za datoteku 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' Sada izgradite projekt i izvršite testove pokretanjem svih testova u mapi 'test' ili izvršavanjem ' test čiste gradle '.

Možete otvoriti index.html datoteku da biste dobili sažeti izvještaj za sve Spockove specifikacije koje su bile dostupne za izvršenje.

Ako želite vidjeti detaljno izvješće za određenu specifikaciju, kliknite na specifikaciju s gornjeg popisa i vidjet ćete detaljno izvješće o neuspjesima i uspjesima.

Zaključak
U ovom smo tutorijalu pokrili osnove jediničnog testiranja pomoću Spock Framework-a. Vidjeli smo različite načine i skraćenice za pisanje tvrdnji i vrste bogatih dijagnostičkih informacija koje generira Spockov okvir za pogreške u tvrdnjama.
Također smo pogledali kako bismo mogli generirati tiha lijepa HTML izvješća za Spockove testove koji uključuju istu detaljnu dijagnostiku za izvršene testove.
Naš predstojeći vodič uputit će vas u detalje o pisanju parametarskih testova sa Spockom !!
Preporučena literatura
- Podaci vođeni ili parametarsko testiranje sa Spock Frameworkom
- Spock intervju pitanja s odgovorima (najpopularnije)
- Spock za integraciju i funkcionalna ispitivanja sa selenom
- Spock ruganje i nabacivanje (primjeri uz video upute)
- Vodič za Spock: Testiranje sa Spockom i Groovyjem
- Vodič za Mockito: Mockito okvir za ruganje u jedinstvenom testiranju
- Razlike između jedinstvenog testiranja, integracijskog ispitivanja i funkcionalnog ispitivanja
- Ključ uspješnog jediničnog testiranja - kako programeri testiraju vlastiti kôd?