data driven parameterized testing with spock framework
Utforska sätten att skriva datadrivna eller parametrerade tester med Spock Framework:
I denna Gratis Spock-utbildningsserie , vi utforskade allt om Enhetstestning i Spock och testarmaturer, påståenden och rapportering i vår tidigare handledning.
I den här handledningen kommer vi att försöka förstå vad parametrerade tester är och hur du kan använda de inbyggda funktionerna i Spock för att uppnå datadriven testning.
Låt oss börja!!
Titta på videohandledningen
Vad du kommer att lära dig:
- Vad är parametrerade tester?
- Skriva parametrerade tester med Spock
- Livscykeln för 'var' -blocket
- tips och tricks
- Slutsats
- Rekommenderad läsning
Vad är parametrerade tester?
För alla som har arbetat med automatisering / enhetstest är datadriven testning inte en ny term.
Parameteriserade tester är ingenting men de är alla typer av tester som delar samma exekveringslogik och skiljer sig endast i indata och resultat i vissa fall.
Exempel: Antag att du har en miniräknare, för att testa funktionaliteten helt och hållet kanske du vill köra dina tester mot olika ingångssatser.
Exempel: Negativa värden, bråktal, normala heltal, heltal närmar sig max tillåtet intervall etc. Oavsett vilka ingångsvärden du har vill du köra samma exekveringslogik.
En annan bra anledning att skriva parametrerade tester är att den inte bara testar en lycklig väg utan snarare också testar felväg eller negativa scenarier.
Exempel: Antag att det finns ett program som returnerar om ett visst filtillägg är giltigt eller inte. Datadrivna tester kan snabbt göra det möjligt för utvecklaren att utföra tester för filtillägg som stöds och eventuella felscenarier eller negativa ingångstester.
Nu kan du traditionellt tänka på att skriva eller kopiera över testerna för flera inmatningsvärden, men det är inte det rätta eller smarta sättet att uppnå denna typ av testkörning. Eftersom antalet tester börjar öka i din app blir dessa tester dessutom svåra att underhålla.
Skriva parametrerade tester med Spock
Var: blockera
Var-blocket i ett Spock-test är blocket som innehåller data för det parametrerade testet. Det kan valfritt innehålla både ingångs- och förväntade utgångsvärden. En viktig punkt att notera om detta block är att detta ska vara det sista blocket i ett Spock-test.
Med detta sagt kan det kombineras med alla andra block som anges, när & då men bör vara det sista blocket.
Låt oss titta på ett exempel för att förstå det bättre
Vi kommer att använda en räknarepplikation som tar två ingångsparametrar och returnerar summan av de levererade ingångarna. Vi kommer att skriva ett parametrerat test som levererar flera ingångar och förväntade utdatavärden.
def 'sample parameterized test'() input2
I kodexemplet ovan kan du se följande:
- 'Var' -block som innehåller data för testet att köras.
- ”Var” -blocket är testets sista block.
- ”Var” kombineras med de andra blocken dvs anges när och då.
- Datarepresentation är ett speciellt format som kallas datatabeller som vi kommer att titta i detalj i de kommande avsnitten i denna handledning.
- Rubrikrad med data är i huvudsak egenskaper / inmatningsvariabler som kan användas direkt i testet. T.ex. Se uttalandet i 'när' -blocket där vi har använt direkt ingång1 och ingång2 som ingångsparametrar utan att definiera dem uttryckligen.
Använda datatabeller
Låt oss försöka förstå datatabellerna i detalj nu. Varje rad i datatabellen representerar data för ett enskilt scenario (testkörning).
Enligt konvention dvs ingångsvärden föregås av ett enda rör ('|') medan utgångsvärden föregås av dubbelrör ('||'). Detta har ingen logisk betydelse, men det är konvention och det förbättrar läsbarheten. Således gäller båda exemplen nedan.
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
Rubrikraden, som visas ovan, har ett namn för var och en av parametrarna som tillhandahålls som data för att testa. Det är viktigt att notera här att dessa parameternamn inte bör kollidera med några befintliga lokala / globala variabler i testet, annars kommer det att finnas kompileringsfel för att lösa variabla namn.
En viktig punkt att notera när du använder datatabeller är att minst två kolumner krävs. Om du bara har behov av en kolumn, är en tom kolumn med värden som understrykningstecken en lösning som nedan.
input1 ||_ 10 ||_ -4 ||_
Fördelen med detta format är enkelhet, läsbarhet och töjbarhet. Att lägga till en ny dataingång är lika enkelt som att lägga till en ny rad med datavärden.
En annan punkt att notera här är att datatabeller kan användas för att innehålla alla typer av variabler, klasser, objekt, enum etc. som gör det ännu mer kraftfullt. Eftersom groovy är ett valfritt skrivat språk, om en explicit typ inte anges, innebär variablerna i datatabellen beroende på vilken typ av data som tillhandahålls.
Låt oss se en annan Exempel med hjälp av datatabeller med en lista över strängar som in- och utdata som ett antal element i strängen.
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
I exemplet ovan kan du märka att vi har gett input som en array-lista med strängar och output är storleken på denna array-lista. Således ger det stor flexibilitet att ha inmatningsdata av olika slag.
Du kan också helt enkelt nämna alla uttryck som returnerar data av respektive ingångstyp och som också används direkt i datatabeller.
Livscykeln för 'var' -blocket
För tester som innehåller var block och dataprover i form av datatabeller representerar varje datarad ett utförande av testmetoden.
Till exempel, om det finns 5 rader med data och testet innehåller 'given' och 'when' block kommer testblocken att utföras en gång för sådan datarad. Så totalt sett kommer det att genomföras fem körningar av testmetoden.
tips och tricks
Låt oss se några tips och tricks för parametrerade tester när vi arbetar med dessa datatabeller.
# 1) Visar resultaten av individuell radkörning separat. Som vi såg i livscykelsektionen finns det en körning av testkoden för varje rad med data. För att få dessa rader eller resultat att visas separat för varje sådan rad kan '@Unroll' -anmärkningar användas för sådana tester.
Låt oss försöka förstå detta med ett exempel:
Vi kommer att använda samma räknarepplikation med 3 uppsättningar ingångsdata som levereras till metoden som testas.
hur man hittar nätverkssäkerhetsnyckel på routern
def 'sample parameterized test'() -20
Utan '@Unroll' -anmärkning, låt oss se hur resultatet ser ut i terminalen (liksom de html-baserade rapporterna). Med denna typ av utdata blir det svårt att ta reda på vilken uppsättning ingångar som orsakade att testet misslyckades.
Låt oss nu se hur testutmatningen rapporteras separat för varje rad efter att ha lagt till '@Unroll' -anmärkning till testmetoden (som har datatabeller som dataingång).
#två) Låt oss nu förstå hur man lägger till meningsfull information till dessa datadrivna tester (istället för några automatiskt bifogade index som i skärmdumpen ovan).
Vi kan använda platshållare för in- och utgångsegenskaperna (enligt datatabellen) och sedan kan vi se värdena som fylls i testnamn med data från datatabeller.
Låt oss använda samma exempel och uppdatera testnamnet för att få data från ingången och förväntad utdata som nämns i datatabellerna:
@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
Låt oss nu se hur resultatet ser ut i terminalen och de HTML-baserade rapporterna:
Så, som du kan se här, visas nu data från in- och utdata tillsammans med testnamnen när de körs. På det här sättet gör det felsökning och felsökning mycket enklare eftersom det tydligt anger vilken ingång som orsakade att testet misslyckades eller uppförde sig fel.
Slutsats
I den här handledningen lärde vi oss att skriva parametrerade tester med Spock-ramverket. Vi diskuterade också olika funktioner i datatabeller och hur de kan användas.
Kolla in vår kommande handledning för att veta hur man använder Mocks and Stubs med Spock !!
PREV-handledning | NÄSTA självstudie
Rekommenderad läsning
- Skrivenhetstester med Spock Framework
- Spock intervjufrågor med svar (mest populära)
- Spock för integration och funktionstestning med selen
- Spock Mocking and Stubbing (Exempel med videotutorials)
- Spock-handledning: Testning med Spock och Groovy
- Datadriven ram i Selen WebDriver med hjälp av Apache POI
- Hur man utför datadriven testning med TestComplete-verktyget
- Hur datadriven testning fungerar (exempel på QTP och selen)