bdd cucumber tutorial with examples
Denne dybdegående agurktutorial diskuterer BDD og dens fordele, agurkeramme, miljøindstillinger, oprettelse af testscript, agurkfunktioner, rapporter osv .:
Agurk er blevet meget populær, og nu bruges den i vid udstrækning i softwaretestindustrien.
Forudsætninger - Tilsigtede modtagere skal have kendskab til Scrum, Maven, TestNG osv.
Hvad du lærer:
- Baggrund for BDD
- Fordele ved adfærdsdrevet udvikling (BDD)
- BDD-værktøjer
- Hvorfor agurk?
- Hvordan fungerer agurk?
- Miljøindstillinger
- Skrivning af testsager ved hjælp af agurk
- Oprettelse af filer til agurk
- Agurk Funktioner
- TestNG med agurk
- Konklusion
- Anbefalet læsning
Baggrund for BDD
I TDD Framework of Agile-metoden skriver vi normalt først testsagerne og udfører dem derefter. Dette er godt for at opnå testdækning og sikre, at bygningen er klar til produktion.
Vi kan dog forbedre TDD-rammen ved at introducere adfærd, funktioner osv. Til testen og derefter udføre den samme. Denne forbedring af TDD kaldes BDD (Behavior Driven Development).
Fordele ved adfærdsdrevet udvikling (BDD)
Nogle fordele ved at bruge BDD er:
# 1) Broer kløften mellem forretningsinteressenter og det tekniske team gennem en fælles platform. Derfor bliver kommunikationen mellem holdet mere gennemsigtig.
#to) Scenarier kan skrives af alle inklusive personer fra en klientside, et medlem af forretningsteamet, ledelse osv. Derfor bliver kravene, scenarierne dækket.
# 3) Udviklere vil skrive koden i overensstemmelse med de scenarier, der er skrevet i BDD-rammen i stedet for at skrive / udvikle koden i henhold til deres forståelse.
# 4) Test bliver skarpere, tid brugt på oprettelsen og efterfølgende udførelse af en test gemmes, kritiske fejl, især dem, der kan påvirke virksomheden, kan findes i selve frontenden.
# 5) Kode, dokumentation vedrørende BDD er let forståelige og vedligeholdelige, da der ikke kræves nogen anden indsats for at vedligeholde koden, da dokumenterne og dens tilsvarende kode allerede er relateret. Derfor vil det, der er nævnt i dokumentationen, dvs. scenarier, have sin tilsvarende kode.
# 6) Da vi har meget let forståelige scenarier, kan vi let opdele dem i opgaver, underopgaver osv. På en logisk måde.
# 7) Holdet kan være mere dynamisk, smidigt, da der er en klarhed omkring scenarierne, acceptkriterier og næsten nøjagtig testestimering.
# 8) Meget god platform for en ny deltager i at gifte sig med det eksisterende team både med hensyn til dokumentation og koden på grund af sin enkelhed.
# 9) Ikke kun hjælper med at validere scenarierne (for det meste brugergrænseflade, adfærdsrelateret), men det hjælper også i testsager på enhedsniveau.
# 10) Det er også nyttigt at spore holdets fremskridt fra dag ét, fordi kravene og scenarierne er klart definerede (noget som udviklerne normalt kæmper for at samle i TDD).
Derfor fjerner implementeringen af BDD antagelsen om, at 'slutklient ikke tænker på vigtigheden af testning', 'klient ikke ønsker at involvere sig i testaktiviteterne' osv.
BDD-værktøjer
Der er flere testværktøjer, der gør det muligt for os at implementere BDD-tilgangen.
Såsom:
- Agurk
- SpecFlow
- Jbehave
- Salat
- Concordion
- FitNesse
- BeanSpec
- Let B
- Jdave
- Givwenzen-flex
- GivWenZen
- Instinkt
- Tumbler-glas
- Gospecify
- Spektakulær
- dSpec
- Specifikationer
- Bøf
- JSSpec
Blandt ovenstående værktøjer fungerer Jbehave meget lig agurk, men disse er lidt forskellige med hensyn til deres implementering.
JBEHAVE | AGURK |
---|---|
Understøtter eksterne datakilder | Det understøtter ikke eksterne datakilder |
Understøtter historier | Understøtter funktioner |
Meget god dokumentation | Ingen standarddokumentation |
Understøtter sammensatte trin | Understøtter ikke sammensatte trin |
Ikke så fleksibel | Fleksibel i forbipasserende parametre |
Understøtter ikke baggrund | Understøtter baggrund |
Ikke så omfattende rapporter | Bedre formateringsfleksibilitet, indbyggede rapporter |
Udviklet ved hjælp af Java | Udviklet ved hjælp af Ruby |
Hvorfor agurk?
Agurk bruges til at skrive alle mulige testsager, især testsager om acceptniveauer (om hvilke slutbrugere er mere bekymrede) skrevet i en Behavioral Driven Development-stil. Det understøtter brugen af sprogparsere som agurk.
Oprindeligt blev agurk skrevet ved hjælp af Ruby programmeringssprog og blev udviklet specielt til Ruby test. Men nu understøttes det af andre programmeringssprog som Java.
Agurk bruges som det sprog, hvor testcases er skrevet i et simpelt format og kan også læses og ændres af en ikke-teknisk bruger.
Bortset fra engelsk understøtter agurk også andre sprog.
Hvordan fungerer agurk?
Når vi kommer til dens arbejdsmekanisme, lader vi først brugerne (teknisk / ikke-teknisk) skrive deres ønskede testtilfælde (som funktioner) ved hjælp af agurkesyntaks, når det er gjort, skal vi sikre os, at de er godkendt, så de kan gå det næste niveau.
Derefter skal vi implementere dvs. skrive scripts til hver linje (ved hjælp af en stepdef-fil) som nævnt i funktionsfilen. Når koderne er implementeret, er den næste ting at køre scripts (ved hjælp af en runner-fil).
Opsætning af miljøet
Miljøopsætningen for agurk er lidt kompleks sammenlignet med at arbejde med ethvert andet værktøj som Eclipse eller ethvert andet IDE.
Udfordringer
Vi er nødt til at sørge for, at versionerne af agurkkrukker matcher den installerede Java-version samt den IDE, som vi i øjeblikket arbejder med.
Miljøindstillinger
# 1) Eclipse Agurk Plugin : Det hjælper formørkelsen med at forstå agurkisyntaxen og fremhæver syntaxen for funktionsfilen i stedet for en almindelig tekst.
Vi er nødt til at gå til Formørkelse >> Hjælp >> Installer ny software >> Klik på knappen Tilføj >> Angiv placeringen som dette . Navnet siger 'Agurk', og klik derefter på OK, og følg resten af installationsprocessen.
Til sidst genstart din IDE, dvs. Eclipse.
#to) Brug Maven til at have alle krukkerne, dvs. afhængigheder, plugins osv. Som nævnt nedenfor.
4.0.0 com cucumber.example 0.0.1-SNAPSHOT jar cucumber.example http://maven.apache.org UTF-8 org.seleniumhq.selenium selenium-java 3.6.0 org.seleniumhq.selenium selenium-chrome-driver 3.6.0 info.cukes cucumber-core 1.2.5 info.cukes cucumber-java 1.2.5 test info.cukes cucumber-junit 1.2.5 test junit junit 4.11 test info.cukes cucumber-testng 1.2.0 info.cukes gherkin 2.12.2 provided log4j log4j 1.2.17 org.apache.poi poi-ooxml 3.9 org.apache.poi poi 3.11-beta3 xml-apis xml-apis 2.0.2 xerces xercesImpl 2.8.0 info.cukes cucumber-jvm-deps 1.0.5 provided org.apache.maven.plugins maven-surefire-plugin 2.18 org.apache.maven.surefire surefire-junit47 2.18
# 3) Sørg for, at hvis vi enten Ctrl + s eller udfører Maven-installation.
# 4) Derefter skal du sørge for at udføre Maven-build for at undgå enhver afhængighedsrelateret fejl, så vi ikke har nogen afhængighed, plugin, version mismatch error senere.
hvordan man åbner krukke med java
# 5) Når ovenstående trin er udført, er vores miljø klar.
Skrivning af testsager ved hjælp af agurk
Agurk indeholder følgende tre filer:
- Funktionsfil: Her skriver vi de funktioner, der skal testes i agurk-format, dvs. givet når derefter. Vi kan endda køre funktionsfilen for at udføre testskripterne skrevet i Stepdef-filen.
- Stepdef-fil: Når Feature-filen er klar, kan hver sætning i Feature-filen implementeres yderligere over Stepdef-filen.
- Runner-fil: Dette er bare for at udføre det faktiske test script skrevet over Stepdef filen ved at henvise til funktionsfilen. Bortset fra det har den mange andre muligheder for tilpasning, rapportering, selektiv udførelse osv.
Her er et simpelt eksempel på en Runner File
package runner; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions( features='Features', glue='com.Multi', plugin={'html:target/cucumber-html-report', 'json:target/cucumber.json', 'pretty:target/cucumber-pretty.txt','usage:target/cucumber-usage.json', 'junit:target/cucumber- results.xml'}, dryRun = false, monochrome = true, tags={'@Smoke,@Regression'} ) public class Runner { }
Oprettelse af filer til agurk
- Stepdef-fil - Src / test / java >> Ny >> Andet >> Agurk >> StepDef klasse.
- Funktionsfil - Projekt >> Ny >> Fil >> angiv navnet på filen med udvidelse som '.feature'.
- Runner-fil - Det ligner enhver anden Java-klasseoprettelse, men vi kan kræve, at vi implementerer en eller anden metode her.
Agurk Funktioner
Her er nogle af de grundlæggende funktioner i agurk, som vi vil implementere i vores test script.
# 1) Agurkroge
Dette er blokkene i koden, der kører før eller efter hvert scenarie. Så vi kan definere disse, hvor som helst i vores projekt. For eksempel, Trindefinition.
Ifølge definitionen er disse kun to kommentarer @After og @Before. I konsollen kan vi se blokkene blive udført og give klar output. Vi kan også udføre kroge til specifikke tags.
# 2) Agurker
Disse bruges normalt over funktionsfilen til at klassificere scenarierne over funktionsfilerne efter deres givne tagnavn. Vi kan have flere tags til et givet scenario i funktionsfilen.
Mærker er brugerdefinerede, og vi kan give ethvert navn til det som @Smoke, @Regression osv.
# 3) Agurkkommentarer
Disse er indbygget i agurk. Normalt er tags @Given, @When, @Then.
Men senere, hvis vi har brug for det, kan vi oprette vores egen kommentar og derefter bruge den i vores program. Under udførelse skrives den matchende limkode, dvs. funktioner, i en Stepdef-fil med @Given, @When, @Then bliver udført.
# 4) Agurk baggrund
Dette er trin eller en række trin, der er fælles for alle scenarierne i funktionsfilen.
Det giver os mulighed for at tilføje nogle kontekster til scenarierne for en funktion, hvor den er defineret. Det kører før hvert scenario for en funktion, hvor den er defineret.
# 5) Agurktabeller
Agurk har funktionen til at understøtte datadrevet test, som giver os mulighed for automatisk at køre en testcase flere gange med forskellige input- og valideringsværdier for et givet script.
Agurk understøtter datatabellen. Den første række betragtes som kolonnen, og rækken ved siden af den er dataene for scripts.
# 6) Transponering af agurk
Dette er en lille ændring af agurktabellen. Her betragtes den første kolonne som kolonne, og kolonnerne næste betragtes som data for scripts.
# 7) Agurk Multi Scenarier
Agurk giver os mulighed for at udføre test af flere scenarier under en funktionsfil.
# 8) Agurkrapportering
I modsætning til rapportering og andre tredjepartsværktøjer, hvor vi skal konfigurere for at se rapporteringen.
Her i agurk har vi indbyggede plugins som pretty, JSON, HTML, XML, som giver os den omfattende rapport om testudførelse.
TestNG med agurk
Vi kan stadig udføre JUnit-testsager skrevet i Agurk ved hjælp af TestNG ved at følge:
- Vi er nødt til at tilføje afhængighederne til Maven-projektet.
- Udvid klassen i Runner-klasse som AbstractTestNGCucumberTests-pakkeløber.
- Konverter maven-projektet, og tilføj pakken (hvor løberklassen findes).
Derefter kan vi køre hele agurkestestsagen som TestNG og generere rapporter om det samme (hvis vi har lytterne).
I denne vejledning diskuterer vi 3 forskellige agurkeksempler til dækning af ovenstående begreber
Eksempel 1
Det dækker kroge, tags, kommentar, baggrund, flere scenarier og TestNG med agurk.
Når testmiljøet er konfigureret:
- Tilføj Eclipse Agurk-plugin i Eclipse.
- Opret et Maven-projekt, og tilføj alle de nødvendige afhængigheder til det, og tilføj også TestNG-relateret afhængighed i Maven.
- Opret en ny funktionsfil.
- Tilføj den krævede implementering til det i Stepdef-filen.
- Opret nu en løberfil med udvidelser af AbstractTestNGCucumberTests.
- Konverter Maven-projektet til TestNG og i testng.xml tilføj pakke stien til agurk runner klasse.
- Kør filen TestNG.xml.
Funktionsfil
Funktion:
Som bruger
Jeg vil være i stand til at tilføje nye klienter i systemet
Så jeg kan tilføje regnskabsdata for den klient
Baggrund:
Da jeg er på Github-hjemmesiden
Når jeg angiver brugernavn som “xxxxxxxxxxxxxxxxxxxx” og adgangskode som “xxx”
Og klik på knappen Log ind
@Røg
Scenarie: Redigering af profilen
Når jeg klikker på din profilindstilling
Når jeg klikker på knappen Rediger profil
Og uploadet nyt billede
Så skulle jeg se et nyt profilbillede
@Regression @Everytime
Scenarie: Opret ny kerne
Da jeg klikker på indstillingen Your Gists
Når jeg angiver filnavn, beskrivelse
Og klik på Opret offentlig kernemetode
Så skulle jeg se den nye kerne
Stepdef-fil
package com.Multi; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.runtime.ScenarioImpl; import gherkin.formatter.model.Scenario; import gherkin.formatter.model.ScenarioOutline; import cucumber.api.DataTable; import org.junit.Assert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.cli.Main; public class Step2 { static public String sb; static public String sa; static WebDriver driver = null; @Before('@Smoke,@Regression') public void beforeScenario(){ System.out.println('New scenario begins'); } @After('@Smoke,@Regression') public void afterScenario(){ System.out.println('Scenario ends'); } @MyAnnotation public static void myanno() { System.out.println('my annot gets executed'); } @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username as '((^')*)' and Password as '((^')*)'$') public void i_specify_Username_as_and_Password_as(String arg1, String arg2){ driver.findElement(By.cssSelector('input#login_field')).sendKeys(arg1); driver.findElement(By.cssSelector('input#password')).sendKeys(arg2); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Profile option$') public void i_click_on_Your_Profile_option(){ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your profile')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I click on edit profile button$') public void i_click_on_edit_profile_button(){ driver.findElement(By.xpath('//*(@id='js-pjax -container')/div/div(2)/div(1)/a')).click(); // Write code here that turns the phrase above into concrete actions } @When('^Uploaded new picture$') public void uploaded_new_picture() throws InterruptedException{ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); driver.findElement(By.id('upload-profile -picture')).sendKeys('D://cucumberFinal//multiple//Files//images.jpg'); Thread.sleep(10000); String wh = driver.getWindowHandle(); driver.switchTo().window(wh); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')); Thread.sleep(10000); actions.moveToElement(element); //Thread.sleep(10000); actions.click(); //actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')).click(); Thread.sleep(3000); // Write code here that turns the phrase above into concrete actions } @Then('^I should be seeing new profile picture$') public void i_should_be_seeing_new_profile_picture(){ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); if(!(sb.equals(sa))) { Assert.assertTrue('File Upload successful', true); } // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Gists option$') public void i_click_on_Your_Gists_option(){ driver.findElement(By.xpath('//*(@id='user-links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your Gists')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I provide filename, description$') public void i_provide_filename_description() throws InterruptedException { // Write code here that turns the phrase above into concrete actions driver.findElement(By.xpath('//div(@class='edit container')/div(@id='gists')/input')).sendKeys('Gist1'); Thread.sleep(2000); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')); actions.moveToElement(element); actions.click(); actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')).sendKeys('GIST1 Description'); Thread.sleep(2000); } @When('^click on Create public gist method$') public void click_on_Create_public_gist_method() { driver.findElement(By.xpath('//*(@id='new_gist')/div(2)/div(2)/button(1)')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^i should be seeing the new gist$') public void i_should_be_seeing_the_new_gist(){ List glist = driver.findElements(By.xpath('//div(@class='container repohead-details- container')/ul(1)/li(@class='flex-auto')/div/a')); for(WebElement o:glist) { if(o.getText().equals('Gist1')) { System.out.println('Gist created successfully'); } } // Write code here that turns the phrase above into concrete actions } }
Her er testresultatet af TestNG XML
Standard TestNG-rapporten ligner den, der er angivet nedenfor.
Eksempel 2
Det vil dække datatabeller og transponere.
Når miljøet er konfigureret:
- Tilføj Eclipse Agurk-plugin i Eclipse.
- Opret et Maven-projekt, og tilføj alle de nødvendige afhængigheder til det.
- Opret en ny funktionsfil.
- Tilføj den krævede implementering til den i stepdef-filen.
- Udfør direkte fra funktionsfilen ved at højreklikke på filen >> Kør som >> Agurk.feature
Funktionsfil
Funktion: Titel på din funktion
Jeg vil bruge denne skabelon til min funktionsfil
Baggrund:
Da jeg er på Gmail-login-siden
Når jeg angiver brugernavn og adgangskode
Og klik på knappen Log ind
Scenarie: Opret ny besked fra datatabellen
Når jeg er på en ny e-mail-side
Og jeg specificerer følgende detaljer
| To1 | Emne |
| Person1@email.com | Person1-emne |
| Person2@email.com | Person2-emne |
Scenarie: Opret ny besked fra den transponerede datatabel
Når jeg er på en ny e-mail-side
Og jeg specificerer følgende detaljer fra transponeringstabellen
| To1 | Person1@email.com | Person2@email.com |
| Emne | Person1-emne | Person2-emne |
Stepdef-fil
package com.datatable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.time.*; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.DataTable; import cucumber.api.Transpose; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import gherkin.formatter.model.Examples; import cucumber.runtime.CucumberException; import cucumber.runtime.ParameterInfo; import cucumber.runtime.xstream.LocalizedXStreams; public class Step3 { static public WebDriver driver; @Given('^I am on Gmail login page$') public void i_am_on_Gmail_login_page() throws InterruptedException{ System.setProperty('webdriver.chrome.driver', 'Executables/chromedriver.exe'); driver= new ChromeDriver(); Actions act = new Actions(driver); driver.manage().window().maximize(); driver.navigate().to('https://www.google.com/gmail/about'); driver.findElement(By.xpath('//nav/div/a(2)')).click(); Thread.sleep(3000); } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() throws InterruptedException{ driver.findElement(By.xpath('//input(@type='email')')).sendKeys('xxxxxx@xxx. com'); driver.findElement(By.xpath('//*(@id='identifierNext')/content/span')).click(); Thread.sleep(3000); driver.findElement(By.xpath('//input(@type='password')')).sendKeys('xxxxxxxx xxx'); } @When('^Click on SignIn button$') public void click_on_SignIn_button() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='passwordNext')/content/span')).click(); Thread.sleep(5000); } @When('^I am on New Email Page$') public void i_am_on_New_Email_Page(){ } @When('^I specify following details$') public void i_specify_following_details(DataTable tables)throws Throwable{ for (Map row : tables.asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^I specify following details from transpose table$') public void i_specify_following_details_from_transpose_table(DataTable tables) throws InterruptedException { // DataTable tables = null; for (Map row : tables.transpose().asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). Thread.sleep(2000); System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).click(); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^then click on Send button$') public void then_click_on_Send_button(){ // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to send the email successfully$') public void i_should_be_able_to_send_the_email_successfully() { // Write code here that turns the phrase above into concrete actions }
Produktion : Så ovenstående eksempel skal logge ind på Gmail og sende to e-mails for hvert scenarie, der er for tabellen Data og Transponerede data.
Eksempel 3
Det dækker rapportering.
Når miljøet er konfigureret:
- Tilføj Eclipse Agurk-plugin i Eclipse.
- Opret et Maven-projekt, og tilføj alle nødvendige afhængigheder til det.
- Opret en ny funktionsfil.
- Tilføj den krævede implementering til det i Stepdef-filen.
- Opret en løberklasse og udfør løberklassen.
- Se alle typer rapporter.
Funktionsfil
Funktion: Titel på din funktion
Jeg vil bruge denne skabelon til min funktionsfil
@ tag1
Scenarie: Titel på dit scenario
Da jeg er på Github-hjemmesiden
Når jeg angiver brugernavn og adgangskode
Og klik på knappen Log ind
Så skulle jeg være i stand til at se logout-mulighed
Stepdef-fil
package com.cucumber; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.api.DataTable; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import cucumber.api.cli.Main; public class Step1 { static WebDriver driver = null; @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() { driver.findElement(By.cssSelector('input#login_field')).sendKeys('chintamoni .patra@gmail.com'); driver.findElement(By.cssSelector('input#password')).sendKeys('Test@123'); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to see logout option$') public void I_should_be_able_to_see_logout_option() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); WebElement opt = driver.findElement(By.xpath('//*(@id='user- links')/li(3)/details/ul/li')); List olist = opt.findElements(By.xpath('//li/form/button')); for(WebElement o : olist) { System.out.println(o); } //int a = olist.size(); System.out.println(olist.get(0).getText()); olist.get(0).click(); Thread.sleep(2000); // Write code here that turns the phrase above into concrete actions } }
Her er de forskellige typer rapporter, der genereres af agurk:
HTML-rapport
Smuk
Junit
Konklusion
At være et open source-værktøj, er agurk meget brugt i BDD. Og det er meget let at forstå, og det har meget omfang med hensyn til nye funktioner, og det er praktisk muligt at integrere agurk med selen eller andre tredjepartsværktøjer / krukker osv.
Da det har aktive hjælpegrupper / medlemmer, bliver det virkelig let for alle, der lige er begyndt at lære agurk eller for dem, der har mellemliggende viden om agurk / BDD.
Agurk understøtter yderligere integration med excel-arket og Jenkins også.
Anbefalet læsning
- Agurk Selen Tutorial: Agurk Java Selen WebDriver Integration
- Python DateTime-tutorial med eksempler
- REST API-test med agurk ved hjælp af BDD-tilgang
- Automatiseringstest ved hjælp af agurkværktøj og selen - Selen-tutorial # 30
- Agurkgurkevejledning: Automatiseringstest ved hjælp af agurk
- Unix Shell Scripting Tutorial med eksempler
- Selen Find Element By Text Tutorial med eksempler
- Java 'dette' Nøgleord: Vejledning med kodeeksempler