Komkommer Haken

1. Inleiding

Komkommerhaken kunnen van pas komen als we voor elk scenario of stap specifieke acties willen uitvoeren, maar deze acties niet expliciet in de Gherkin-code hebben staan.

In deze tutorial kijken we naar de @Voordat, @BeforeStep, @AfterStep, en @Na Komkommer haken.

2. Overzicht van haken in komkommer

2.1. Wanneer moeten haken worden gebruikt?

Hooks kunnen worden gebruikt om achtergrondtaken uit te voeren die geen deel uitmaken van de zakelijke functionaliteit. Dergelijke taken kunnen zijn:

  • Een browser opstarten
  • Cookies instellen of wissen
  • Verbinding maken met een database
  • De toestand van het systeem controleren
  • Toezicht houden

Een use case voor monitoring zou zijn om een ​​dashboard bij te werken met de voortgang van de test in realtime.

Haken zijn niet zichtbaar in de augurkcode. Daarom we moeten ze niet zien als een vervanging voor een komkommerachtergrond of een bepaalde stap.

We zullen een voorbeeld bekijken waarin we hooks gebruiken om schermafbeeldingen te maken tijdens het uitvoeren van tests.

2.2. Reikwijdte van haken

Haken zijn van invloed op elk scenario. Daarom is het een goede gewoonte om alle hooks in een speciale configuratieklasse te definiëren.

Het is niet nodig om in elke lijmcodeklasse dezelfde haken te definiëren. Als we haken in dezelfde klasse definiëren met onze lijmcode, zouden we minder leesbare code hebben.

3. Haken

Laten we eerst eens kijken naar de individuele haken. We zullen dan een volledig voorbeeld bekijken waarin we zullen zien hoe hooks worden uitgevoerd wanneer ze worden gecombineerd.

3.1. @Voordat

Methoden die zijn geannoteerd met @Voordat zullen uitvoeren voor elk scenario. In ons voorbeeld starten we de browser voor elk scenario:

@Before public void initialization () {startBrowser (); }

Als we meerdere methoden annoteren met @Voordat, kunnen we expliciet de volgorde bepalen waarin de stappen worden uitgevoerd:

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

De bovenstaande methode wordt als tweede uitgevoerd, terwijl we passeren 2 als waarde voor de bestellen parameter toe aan de annotatie. We kunnen ook passeren 1 als waarde voor de orderparameter van onze initialisatiemethode:

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

Dus als we een scenario uitvoeren, initialisatie () wordt als eerste uitgevoerd, en vóórScenario () voert als tweede uit.

3.2. @VoorStep

Methoden die zijn geannoteerd met @BeforeStepuitvoeren voor elke stap. Laten we de annotatie gebruiken om voor elke stap een screenshot te maken:

@BeforeStep openbare leegte beforeStep () {takeScreenshot (); }

3.3. @AfterStep

Methoden die zijn geannoteerd met @AfterStepuitvoeren na elke stap:

@AfterStep openbare leegte afterStep () {takeScreenshot (); }

We hebben gebruikt @AfterStep hier om na elke stap een screenshot te maken. Dit gebeurt ongeacht of de stap met succes wordt voltooid of mislukt.

3.4. @Na

Methoden die zijn geannoteerd met @Nauitvoeren na elk scenario:

@After public void afterScenario () {takeScreenshot (); closeBrowser (); }

In ons voorbeeld maken we een laatste schermafbeelding en sluiten we de browser. Dit gebeurt ongeacht of het scenario met succes wordt voltooid.

3.5. De Scenario Parameter

De methoden die zijn geannoteerd met een hook-annotatie, kunnen een parameter van het type accepteren Scenario:

@After public void beforeScenario (Scenario-scenario) {// enige code}

Het object van type Scenario bevat informatie over het huidige scenario. Inbegrepen zijn de naam van het scenario, het aantal stappen, de namen van de stappen en de status (geslaagd of mislukt). Dit kan handig zijn als we verschillende acties willen uitvoeren voor geslaagde en mislukte tests.

4. Uitvoering van de haak

4.1. Gelukkig Flow

Laten we nu eens kijken wat er gebeurt als we een komkommerscenario uitvoeren met alle vier soorten haken:

Feature: boekwinkel met haken Achtergrond: de boekwinkel gegeven De volgende boeken zijn verkrijgbaar in de winkel | De duivel in de witte stad | Erik Larson | | De leeuw, de heks en de kleerkast | C.S. Lewis | | In the Garden of Beasts | Erik Larson | Scenario: 1 - Vind boeken op auteur Als ik om een ​​boek van de auteur Erik Larson vraag Dan zegt de verkoper dat er 2 boeken zijn Scenario: 2 - Vind boeken op auteur, maar is er niet Als ik om een ​​boek van de auteur Marcel Proust Dan De verkoper zegt dat er 0 boeken zijn

Als we naar het resultaat van een testrun in de IntelliJ IDE kijken, kunnen we de uitvoeringsvolgorde zien:

Ten eerste, onze twee @Voordat haken uitvoeren. Vervolgens, voor en na elke stap, de @BeforeStep en @AfterStep haken lopen, respectievelijk. eindelijk, de @Na haak loopt. Alle hooks worden uitgevoerd voor beide scenario's.

4.2. Ongelukkige stroom: een stap mislukt

Laten we eens kijken wat er gebeurt als een stap mislukt. Zoals we in de onderstaande schermafbeelding kunnen zien, zijn zowel de @Voordat en @Na haken van de falende stap worden uitgevoerd. De volgende stappen worden overgeslagen en ten slotte wordt het @Na hook voert uit:

Het gedrag van @Na is vergelijkbaar met de eindelijk-clausule na een proberen te vangen in Java. We zouden het kunnen gebruiken om opruimtaken uit te voeren als een stap mislukte. In ons voorbeeld maken we nog steeds een screenshot, zelfs als het scenario mislukt.

4.3. Ongelukkige stroom: een haak mislukt

Laten we eens kijken wat er gebeurt als een haak zelf faalt. In het onderstaande voorbeeld is de eerste @VoorStep mislukt.

In dit geval wordt de eigenlijke stap niet uitgevoerd, maar wel @AfterStep haak doet. Volgende stappen worden ook niet uitgevoerd, terwijl de @Na haak wordt aan het einde uitgevoerd:

5. Voorwaardelijke uitvoering met tags

Haken worden globaal gedefinieerd en zijn van invloed op alle scenario's en stappen. Met behulp van Cucumber-tags kunnen we echter precies definiëren voor welke scenario's een hook moet worden uitgevoerd:

@Before (order = 2, value = "@ Screenshots") public void beforeScenario () {takeScreenshot (); }

Deze hook wordt alleen uitgevoerd voor scenario's die zijn getagd met @Screenshots:

@Screenshots Scenario: 1 - Vind boeken op auteur Als ik om een ​​boek van de auteur Erik Larson vraag. Dan De verkoper zegt dat er 2 boeken zijn

6. Java 8

We kunnen Cucumber Java 8 Support toevoegen om alle hooks met lambda-expressies te definiëren.

Roep onze initialisatiehaak op uit het bovenstaande voorbeeld:

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

Herschreven met een lambda-uitdrukking, krijgen we:

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

Hetzelfde werkt ook voor @BeforeStep, @Na, en @AfterStep.

7. Conclusie

In dit artikel hebben we gekeken naar het definiëren van komkommerhaken.

We hebben besproken in welke gevallen we ze zouden moeten gebruiken en wanneer niet. Vervolgens hebben we gezien in welke volgorde hooks worden uitgevoerd en hoe we voorwaardelijke uitvoering kunnen bereiken.

Ten slotte hebben we gezien hoe we hooks konden definiëren met Java 8 lambda-notatie.

Zoals gewoonlijk is de volledige broncode van dit artikel beschikbaar op GitHub.