Agurkroge

1. Introduktion

Agurkroge kan være nyttige, når vi vil udføre specifikke handlinger for hvert scenarie eller trin, men uden at have disse handlinger eksplicit i agurkekoden.

I denne vejledning ser vi på @Før, @BeforeStep, @AfterStep, og @Efter Agurkroge.

2. Oversigt over kroge i agurk

2.1. Hvornår skal kroge bruges?

Kroge kan bruges til at udføre baggrundsopgaver, der ikke er en del af forretningsfunktionaliteten. Sådanne opgaver kan være:

  • Start af en browser
  • Indstilling eller rydning af cookies
  • Opretter forbindelse til en database
  • Kontrol af systemets tilstand
  • Overvågning

Et brugssag til overvågning ville være at opdatere et dashboard med testforløbet i realtid.

Kroge er ikke synlige i agurkekoden. Derfor, vi bør ikke se dem som en erstatning for en agurk baggrund eller et givet trin.

Vi ser på et eksempel, hvor vi bruger kroge til at tage skærmbilleder under testudførelse.

2.2. Omfang af kroge

Kroge påvirker alle scenarier. Derfor er det god praksis at definere alle kroge i en dedikeret konfigurationsklasse.

Det er ikke nødvendigt at definere de samme kroge i hver limkodeklasse. Hvis vi definerer kroge i samme klasse med vores limkode, ville vi have mindre læsbar kode.

3. Kroge

Lad os først se på de enkelte kroge. Vi ser derefter på et komplet eksempel, hvor vi ser, hvordan kroge udføres, når de kombineres.

3.1. @Før

Metoder kommenteret med @Før vilje udføre før hvert scenarie. I vores eksempel starter vi browseren op før hvert scenarie:

@Før offentlig initialisering af ugyldig () {startBrowser (); }

Hvis vi kommenterer flere metoder med @Før, kan vi eksplicit definere rækkefølgen, i hvilken trinene udføres:

@Before (rækkefølge = 2) offentlig ugyldighed førScenario () {takeScreenshot (); }

Ovenstående metode udfører andet, når vi passerer 2 som en værdi for bestille parameter til kommentaren. Vi kan også passere 1 som en værdi for ordreparameteren for vores initialiseringsmetode:

@Before (rækkefølge = 1) initial ugyldig initialisering ()

Så når vi udfører et scenario, initialisering () udfører først, og beforeScenario () udfører anden.

3.2. @BeforeStep

Metoder, der er kommenteret med @BeforeStepudføre før hvert trin. Lad os bruge kommentaren til at tage et screenshot før hvert trin:

@BeforeStep offentlig ugyldighed beforeStep () {takeScreenshot (); }

3.3. @AfterStep

Metoder, der er kommenteret med @AfterStepudføre efter hvert trin:

@AfterStep offentlig ugyldighed efterStep () {takeScreenshot (); }

Vi har brugt @AfterStep her for at tage et skærmbillede efter hvert trin. Dette sker uanset om trinnet afsluttes med succes eller mislykkes.

3.4. @Efter

Metoder kommenteret med @Efterudføre efter hvert scenario:

@Efter offentligt ugyldigt efterScenario () {takeScreenshot (); closeBrowser (); }

I vores eksempel tager vi et sidste skærmbillede og lukker browseren. Dette sker uanset om scenariet slutter med succes.

3.5. Det Scenarie Parameter

Metoderne, der er kommenteret med en krogkommentar, kan acceptere en parameter af typen Scenarie:

@Efter offentlig ugyldighed førScenario (scenarie scenario) {// noget kode}

Objekt af typen Scenarie indeholder oplysninger om det aktuelle scenarie. Inkluderet er scenarienavnet, antal trin, trinnavne og status (bestået eller ikke bestået). Dette kan være nyttigt, hvis vi vil udføre forskellige handlinger for beståede og mislykkede tests.

4. Krogudførelse

4.1. Happy Flow

Lad os nu se på, hvad der sker, når vi kører et agurkscenario med alle fire typer kroge:

Funktion: Boghandel med kroge Baggrund: Boghandelen givet Følgende bøger er tilgængelige i butikken | Djævelen i den hvide by | Erik Larson | | Løven, heksen og klædeskabet | C.S. Lewis | | I Dyrenes Have | Erik Larson | Scenarie: 1 - Find bøger efter forfatter Når jeg beder om en bog af forfatteren Erik Larson Så siger sælgeren, at der er 2 bøger Scenario: 2 - Find bøger efter forfatter, men er der ikke Når jeg beder om en bog af forfatter Marcel Proust Så sælger siger, at der er 0 bøger

Ser man på resultatet af en testkørsel i IntelliJ IDE, kan vi se udførelsesordren:

Først vores to @Før kroge udføres. Så før og efter hvert trin, @BeforeStep og @AfterStep kroge løber henholdsvis. Endelig blev @Efter krog kører. Alle kroge udføres for begge scenarier.

4.2. Ulykkelig strøm: et trin mislykkes

Lad os se, hvad der sker, hvis et trin mislykkes. Som vi kan se på skærmbilledet nedenfor, er begge @Før og @Efter kroge i det svigtende trin udføres. De efterfølgende trin springes over, og endelig bliver @Efter krog udfører:

Opførelsen af @Efter svarer til endelig-klausul efter en prøve-fangst i Java. Vi kunne bruge det til at udføre oprydningsopgaver, hvis et trin mislykkedes. I vores eksempel tager vi stadig et screenshot, selvom scenariet mislykkes.

4.3. Ulykkelig strømning: en kroge fejler

Lad os se på, hvad der sker, når selve krogen fejler. I eksemplet nedenfor er den første @BeforeStep mislykkes.

I dette tilfælde kører det faktiske trin ikke, men det er det @AfterStep krog gør. Efterfølgende trin kører heller ikke, mens @Efter krog udføres i slutningen:

5. Betinget udførelse med tags

Kroge defineres globalt og påvirker alle scenarier og trin. Ved hjælp af agurktags kan vi dog definere nøjagtigt, hvilke scenarier en krog skal udføres for:

@Before (rækkefølge = 2, værdi = "@ Screenshots") offentlig ugyldig før Scenario () {takeScreenshot (); }

Denne krog udføres kun for scenarier, der er tagget med @Screenshots:

@Screenshots Scenario: 1 - Find bøger efter forfatter Når jeg beder om en bog af forfatteren Erik Larson Så siger sælgeren, at der er 2 bøger

6. Java 8

Vi kan tilføje agurk Java 8 Support til at definere alle kroge med lambda-udtryk.

Husk vores initialiseringskrog fra eksemplet ovenfor:

@Before (ordre = 2) offentlig ugyldig initialisering () {startBrowser (); }

Omskrevet med et lambda-udtryk får vi:

public BookStoreWithHooksRunSteps () {Before (2, () -> startBrowser ()); }

Det samme fungerer også for @BeforeStep, @Efter, og @AfterStep.

7. Konklusion

I denne artikel så vi på, hvordan man definerer agurkekroge.

Vi diskuterede i hvilke tilfælde vi skulle bruge dem, og hvornår vi ikke skulle. Derefter så vi i hvilken rækkefølge kroge udføres, og hvordan vi kan opnå betinget udførelse.

Endelig så vi, hvordan vi kunne definere kroge med Java 8 lambda-notation.

Som sædvanlig er den komplette kildekode i denne artikel tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found