Agurkekroker

1. Introduksjon

Agurk kroker kan komme til nytte når vi ønsker å utføre spesifikke handlinger for hvert scenario eller trinn, men uten å ha disse handlingene eksplisitt i Gherkin-koden.

I denne opplæringen vil vi se på @Før, @BeforeStep, @AfterStep, og @Etter Agurk kroker.

2. Oversikt over kroker i agurk

2.1. Når skal kroker brukes?

Kroker kan brukes til å utføre bakgrunnsoppgaver som ikke er en del av forretningsfunksjonaliteten. Slike oppgaver kan være:

  • Starte en nettleser
  • Sette eller fjerne informasjonskapsler
  • Koble til en database
  • Kontrollerer tilstanden til systemet
  • Overvåkning

Et brukstilfelle for overvåking vil være å oppdatere et dashbord med testfremdriften i sanntid.

Kroker er ikke synlige i Gherkin-koden. Derfor, vi skal ikke se dem som erstatning for en agurkbakgrunn eller et gitt trinn.

Vi ser på et eksempel der vi bruker kroker til å ta skjermbilder under testutførelsen.

2.2. Omfanget av kroker

Kroker påvirker hvert scenario. Derfor er det god praksis å definere alle kroker i en dedikert konfigurasjonsklasse.

Det er ikke nødvendig å definere de samme krokene i hver limkodeklasse. Hvis vi definerer kroker i samme klasse med limkoden vår, ville vi ha mindre lesbar kode.

3. Kroker

La oss først se på de enkelte krokene. Deretter ser vi på et fullstendig eksempel der vi ser hvordan kroker utføres når de kombineres.

3.1. @Før

Metoder kommentert med @Før vil utføre før hvert scenario. I vårt eksempel starter vi nettleseren før hvert scenario:

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

Hvis vi kommenterer flere metoder med @Før, kan vi eksplisitt definere rekkefølgen trinnene utføres i:

@Before (order = 2) public void beforeScenario () {takeScreenshot (); }

Ovennevnte metode utfører andre når vi passerer 2 som en verdi for rekkefølge parameteren til merknaden. Vi kan også passere 1 som en verdi for bestillingsparameteren til initialiseringsmetoden vår:

@Before (order = 1) initial void initialization ()

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

3.2. @BeforeStep

Metoder kommentert med @BeforeSteputføre før hvert trinn. La oss bruke kommentaren til å ta et skjermbilde før hvert trinn:

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

3.3. @AfterStep

Metoder kommentert med @AfterSteputføre etter hvert trinn:

@AfterStep offentlig ugyldig etterStep () {takeScreenshot (); }

Vi har brukt @AfterStep her for å ta et skjermbilde etter hvert trinn. Dette skjer uavhengig av om trinnet er vellykket eller mislykkes.

3.4. @Etter

Metoder kommentert med @Etterutføre etter hvert scenario:

@Efter offentlig ugyldighet etterScenario () {takeScreenshot (); closeBrowser (); }

I vårt eksempel tar vi et siste skjermbilde og lukker nettleseren. Dette skjer uavhengig av om scenariet er vellykket.

3.5. De Scenario Parameter

Metodene som er merket med en kroknotering kan akseptere en parameterparameter Scenario:

@Efter offentlig ugyldighet førScenario (Scenario scenario) {// noe kode}

Objektet av typen Scenario inneholder informasjon om dagens scenario. Inkludert er scenarionavnet, antall trinn, navn på trinn og status (bestått eller ikke bestått). Dette kan være nyttig hvis vi ønsker å utføre forskjellige handlinger for beståtte og mislykkede tester.

4. Hook Execution

4.1. Happy Flow

La oss nå se på hva som skjer når vi kjører et agurkscenario med alle fire typer kroker:

Feature: Book Store With Hooks Background: The Book Store Gitt Følgende bøker er tilgjengelige i butikken | Djevelen i den hvite byen | Erik Larson | | Løven, heksen og garderoben | C.S. Lewis | | I dyrenes hage | Erik Larson | Scenario: 1 - Finn bøker av forfatter Når jeg ber om en bok av forfatteren Erik Larson Så sier selgeren at det er to bøker Scenario: 2 - Finn bøker av forfatteren, men er ikke der Når jeg ber om en bok av forfatter Marcel Proust Then Selgeren sier at det er 0 bøker

Ser vi på resultatet av en testkjøring i IntelliJ IDE, kan vi se utførelsesordren:

Først våre to @Før kroker utfører. Så før og etter hvert trinn, @BeforeStep og @AfterStep kroker løper, henholdsvis. Til slutt, @Etter krok løper. Alle kroker utføres for begge scenariene.

4.2. Ulykkelig flyt: et trinn mislykkes

La oss se hva som skjer hvis et trinn mislykkes. Som vi kan se på skjermbildet nedenfor, begge @Før og @Etter krokene til det sviktende trinnet blir utført. De påfølgende trinnene hoppes over, og til slutt, @Etter krok utfører:

Oppførselen til @Etter ligner på endelig-klausul etter en prøvefangst i Java. Vi kan bruke den til å utføre opprydningsoppgaver hvis et trinn mislyktes. I vårt eksempel tar vi fortsatt et skjermbilde selv om scenariet mislykkes.

4.3. Unhappy Flow: a Hook Fails

La oss se på hva som skjer når en krok i seg selv mislykkes. I eksemplet nedenfor, den første @BeforeStep mislykkes.

I dette tilfellet går ikke det faktiske trinnet, men det er det @AfterStep krok gjør. Påfølgende trinn vil ikke kjøre heller, mens @Etter krok utføres på slutten:

5. Betinget utførelse med tagger

Kroker er definert globalt og påvirker alle scenarier og trinn. Men ved hjelp av agurkmerker kan vi definere nøyaktig hvilke scenarier en krok skal utføres for:

@Before (order = 2, value = "@ Screenshots") offentlig ugyldig før Scenario () {takeScreenshot (); }

Denne kroken blir bare utført for scenarier som er merket med @Screenshots:

@Screenshots Scenario: 1 - Finn bøker av forfatter Når jeg ber om en bok av forfatteren Erik Larson Så sier selgeren at det er to bøker

6. Java 8

Vi kan legge til Cucumber Java 8 Support for å definere alle kroker med lambdauttrykk.

Husk initialiseringskroken vår fra eksemplet ovenfor:

@Before (order = 2) public void initialization () {startBrowser (); }

Omskrevet med et lambdauttrykk får vi:

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

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

7. Konklusjon

I denne artikkelen så vi på hvordan man definerer agurk kroker.

Vi diskuterte i hvilke tilfeller vi skulle bruke dem, og når vi ikke skulle. Så så vi i hvilken rekkefølge kroker utføres, og hvordan vi kan oppnå betinget utførelse.

Til slutt så vi hvordan vi kunne definere kroker med Java 8 lambda-notasjon.

Som vanlig er den komplette kildekoden til denne artikkelen tilgjengelig på GitHub.


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