bdd cucumber tutorial with examples
Denne dybdegående agurkveiledningen diskuterer BDD og fordelene, agurkeramme, miljøinnstillinger, oppretting av testskript, agurkfunksjoner, rapporter osv .:
Agurk har blitt veldig populær, og nå brukes den mye i programvaretestindustrien.
Forutsetninger - Tiltenkte mottakere bør ha kunnskap om Scrum, Maven, TestNG, etc.
Hva du vil lære:
- Bakgrunn av BDD
- Fordeler med atferdsdrevet utvikling (BDD)
- BDD-verktøy
- Hvorfor agurk?
- Hvordan fungerer agurk?
- Miljøinnstillinger
- Skrive testtilfeller ved bruk av agurk
- Lage filer for agurk
- Agurkfunksjoner
- TestNG med agurk
- Konklusjon
- Anbefalt lesing
Bakgrunn av BDD
I TDD Framework of Agile-metodikken skriver vi normalt testtilfellene først og utfører dem deretter. Dette er bra for å oppnå testdekning og sørge for at bygningen er klar til produksjon.
Vi kan imidlertid forbedre TDD-rammeverket ved å introdusere Behaviors, Features, etc. på testen og deretter utføre det samme. Denne forbedringen av TDD blir betegnet som BDD (Behavior Driven Development).
Fordeler med atferdsdrevet utvikling (BDD)
Noen fordeler med å bruke BDD er:
#1) Broer gapet mellom forretningsinteressenter og det tekniske teamet gjennom en felles plattform. Derfor blir kommunikasjonen mellom teamet mer gjennomsiktig.
#to) Scenarier kan skrives av alle inkludert mennesker fra en klientside, et medlem av forretningsteamet, ledelse osv. Derfor blir kravene, scenariene dekket.
# 3) Utviklere vil skrive koden i samsvar med scenariene skrevet i BDD-rammeverket i stedet for å skrive / utvikle koden i henhold til deres forståelse.
# 4) Testing blir skarpere, tiden brukt på å opprette og påfølgende utførelse av en test lagres, kritiske feil, spesielt de som kan påvirke virksomheten, finnes i selve fronten.
# 5) Kode, dokumentasjon knyttet til BDD er lett forståelig og vedlikeholdelig, da det ikke kreves noen annen innsats for å opprettholde koden, ettersom dokumentene og den tilhørende koden allerede er relatert. Derfor vil det som er nevnt i dokumentasjonen, dvs. scenarier, ha sin tilsvarende kode.
# 6) Siden vi har veldig lett forståelige scenarier, kan vi enkelt dele dem inn i oppgaver, underoppgaver osv. På en logisk måte.
# 7) Teamet kan være mer dynamisk, smidig da det er en klarhet om scenariene, akseptkriteriene og nesten nøyaktig testestimering.
# 8) Veldig god plattform for en ny ble sammen med det eksisterende teamet både når det gjelder dokumentasjon og koden på grunn av sin enkelhet.
# 9) Ikke bare hjelper med å validere scenariene (for det meste brukergrensesnitt, atferdsrelatert), men det hjelper også i testsaker på enhetsnivå.
# 10) Det er også nyttig å spore teamets fremgang fra første dag, fordi kravene og scenariene er tydelig definert (noe som utviklerne vanligvis sliter med å samle inn i TDD).
Derfor fjerner implementering av BDD antagelsen om at “sluttklienten ikke tenker på viktigheten av testing”, “klienten ikke ønsker å involvere seg i testaktivitetene” osv.
BDD-verktøy
Det er flere testverktøy som gjør det mulig for oss å implementere BDD-tilnærmingen.
Som for eksempel:
- Agurk
- SpecFlow
- Jbehave
- Salat
- Concordion
- FitNesse
- BeanSpec
- Lett B
- Jdave
- Givwenzen-flex
- GivWenZen
- Instinkt
- Tumbler-glass
- Evangeliser
- Spektakulær
- dSpec
- Spesifikasjoner
- Biff
- JSSpec
Blant de ovennevnte verktøyene fungerer Jbehave ganske likt agurk, men disse er litt forskjellige når det gjelder implementeringen.
JBEHAVE | AGURK |
---|---|
Støtter eksterne datakilder | Den støtter ikke eksterne datakilder |
Støtter historier | Støtter funksjoner |
Veldig god dokumentasjon | Ingen standard dokumentasjon |
Støtter sammensatte trinn | Støtter ikke sammensatte trinn |
Ikke så fleksibel | Fleksibel i passerende parametere |
Støtter ikke bakgrunn | Støtter bakgrunn |
Ikke så omfattende rapporter | Bedre formateringsfleksibilitet, innebygde rapporter |
Utviklet ved hjelp av Java | Utviklet med Ruby |
Hvorfor agurk?
Agurk brukes til å skrive alle slags testtilfeller, spesielt akseptnivå-testtilfeller (om hvilke sluttbrukere som er mer bekymret) skrevet i en Behavioral Driven Development-stil. Den støtter bruken av språkparsere som Gherkin.
Opprinnelig ble agurk skrevet ved hjelp av Ruby programmeringsspråk og ble utviklet spesielt for Ruby testing. Men nå støttes det av andre programmeringsspråk som Java.
Agurk blir brukt som språket testsakene er skrevet på i et enkelt format og kan også leses og endres av en ikke-teknisk bruker.
Bortsett fra engelsk, støtter agurk også andre språk.
Hvordan fungerer agurk?
Når vi kommer til arbeidsmekanismen, lar vi først brukerne (teknisk / ikke-teknisk) skrive sine ønskede testtilfeller (som funksjoner) ved hjelp av Gherkin-syntaksen. Når det er gjort, må vi sørge for at de er godkjent slik at de kan gå neste nivå.
Etter det må vi implementere dvs. skrive skript for hver linje (ved hjelp av en stepdef-fil) som nevnt i funksjonsfilen. Når kodene er implementert, vil det neste være å kjøre skriptene (ved hjelp av en løpefil).
Miljøoppsett
Miljøoppsettet for Agurk er litt komplisert sammenlignet med å jobbe med andre verktøy som Eclipse eller andre IDE.
Utfordringer
Vi må sørge for at versjonene av agurk krukker samsvarer med den installerte Java-versjonen, samt IDE som vi jobber med for øyeblikket.
Miljøinnstillinger
# 1) Eclipse Agurk Plugin : Det hjelper formørkelsen å forstå Gherkin-syntaksen og fremhever syntaksen til funksjonsfilen i stedet for en ren tekst.
Vi må gå til Formørkelse >> Hjelp >> Installer ny programvare >> Klikk på Legg til-knapp >> Angi plasseringen som dette . Navnet sier 'Agurk' og klikk deretter på OK og følg resten av installasjonsprosessen.
Endelig start IDE på nytt, dvs. formørkelse.
#to) Bruk Maven til å ha alle glassene, dvs. avhengigheter, plugins osv. Som nevnt 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) Forsikre deg om at vi gjør Ctrl + s eller utfører Maven-installasjon.
# 4) Etter det må du sørge for å utføre Maven-bygging for å unngå avhengighetsrelaterte feil, slik at vi ikke har noen avhengighets-, plugin-, versjonsfeilfeil senere.
hvilken type programvare er tilgang, oracle, db2, mysql og sql server?
# 5) Når trinnene ovenfor er gjort, er miljøet vårt klart.
Skrive testtilfeller ved bruk av agurk
Agurk inneholder følgende tre filer:
- Funksjonsfil: Her skriver vi Funksjonene som skal testes i Gherkin-format, dvs. gitt når da. Vi kan til og med kjøre funksjonsfilen for å utføre testskriptene som er skrevet i Stepdef-filen.
- Stepdef-fil: Når funksjonsfilen er klar, kan hver setning i funksjonsfilen implementeres ytterligere over Stepdef-filen.
- Runner-fil: Dette er bare for å utføre det faktiske testskriptet som er skrevet over Stepdef-filen ved å referere til funksjonsfilen. Bortsett fra det, har den mange andre alternativer for tilpasning, rapportering, selektiv kjøring, etc.
Her er et enkelt 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 { }
Lage filer for agurk
- Stepdef-fil - Src / test / java >> Ny >> Andre >> Agurk >> StepDef klasse.
- Funksjonsfil - Prosjekt >> Ny >> Fil >> spesifiser navnet på filen med filtypen som .feature.
- Runner-fil - Det ligner på hvilken som helst annen Java-klasseoppretting, men vi kan kreve å implementere noen metode her.
Agurkfunksjoner
Her er noen av de grunnleggende egenskapene til agurk som vi skal implementere i testskriptet vårt.
# 1) Agurkekroker
Dette er blokkene i koden som kjører før eller etter hvert scenario. Slik at vi kan definere disse, hvor som helst i prosjektet vårt. For eksempel, Trinn Definisjon.
I henhold til definisjonen er dette bare to merknader @After og @Before. I konsollen kan vi se blokkene blir utført og gir klare utdata. Vi kan også utføre krokene for bestemte koder.
# 2) Agurkmerker
Disse brukes normalt over funksjonsfilen for å klassifisere scenariene over funksjonsfilene i henhold til deres gitte tagnavn. Vi kan ha flere koder for et gitt scenario i funksjonsfilen.
Tagger er brukerdefinerte, og vi kan gi hvilket som helst navn til det, som @Smoke, @Regression, etc.
# 3) Agurkkommentarer
Disse er innebygd til agurk. Normalt er kodene @Given, @When, @Then.
Men senere, hvis vi trenger det, kan vi lage vår egen kommentar og deretter bruke den i programmet vårt. Under utførelse skrives den matchende limkoden, dvs. funksjonene, i en Stepdef-fil som har @Given, @When, @Then blir utført.
# 4) Agurkbakgrunn
Dette er trinn eller serie trinn som er felles for alle scenariene i funksjonsfilen.
Det lar oss legge til litt sammenheng i scenariene for en funksjon der den er definert. Den kjører før hvert scenario for en funksjon der den er definert.
# 5) Agurkdatatabeller
Agurk har funksjonen for å støtte datadrevet testing, som lar oss automatisk kjøre en testkasse flere ganger med forskjellige input- og valideringsverdier for et gitt skript.
Agurk støtter datatabellen. Den første raden betraktes som kolonnen, og radene ved siden av er dataene for skriptene.
# 6) Agurk Transponere
Dette er en liten modifikasjon av agurkdatatabellen. Her vil den første kolonnen bli betraktet som kolonne, og kolonnene neste blir betraktet som data for skriptene.
# 7) Agurk Multi Scenarios
Agurk lar oss utføre testing av flere scenarier under en funksjonsfil.
# 8) Agurkrapportering
I motsetning til rapportering og andre tredjepartsverktøy der vi trenger å gjøre noen konfigurasjoner for å se rapporteringen.
Her i Agurk har vi innebygde plugins som pretty, JSON, HTML, XML som gir oss den omfattende rapporten om testutførelse.
TestNG med agurk
Vi kan fremdeles utføre JUnit-testtilfellene skrevet i Agurk ved hjelp av TestNG ved å følge:
- Vi må legge til avhengighet til Maven-prosjektet.
- Utvid klassen i Runner-klassen som AbstractTestNGCucumberTests-pakkeløper.
- Konverter maven-prosjektet og legg til pakken (der løperklassen eksisterer).
Etter det kan vi kjøre hele Cucumber test case som TestNG og generere rapporter om det samme (hvis vi har lytterne).
I denne opplæringen vil vi diskutere 3 forskjellige agurkeksempler for å dekke de ovennevnte konseptene
Eksempel 1
Det vil dekke kroker, koder, merknader, bakgrunn, flere scenarier og TestNG med agurk.
Når testmiljøet er satt opp:
- Legg til Eclipse Cucumber plugin i Eclipse.
- Opprett et Maven-prosjekt og legg til alle nødvendige avhengigheter til det, og legg også til TestNG-relatert avhengighet i Maven.
- Opprett en ny funksjonsfil.
- Legg til den nødvendige implementeringen for den i Stepdef-filen.
- Opprett nå en løpefil med utvidede AbstractTestNGCucumberTests.
- Konverter Maven-prosjektet til TestNG og i testng.xml legg til pakkestien til agurkløperklassen.
- Kjør TestNG.xml-filen.
Funksjonsfil
Trekk:
Som bruker
Jeg vil kunne legge til nye klienter i systemet
Slik at jeg kan legge til regnskapsdata for den klienten
Bakgrunn:
Gitt at jeg er på Github-hjemmesiden
Når jeg angir brukernavn som “xxxxxxxxxxxxxxxxxxxx” og passord som “xxx”
Og klikk på Logg på-knappen
@Røyk
Scenario: Redigering av profilen
Gitt jeg klikker på alternativet Profil
Når jeg klikker på rediger profil-knappen
Og lastet opp nytt bilde
Da burde jeg se et nytt profilbilde
@Regresjon @Hverytime
Scenario: Opprett ny kjerne
Gitt jeg klikker på Your Gists-alternativet
Når jeg oppgir filnavn, beskrivelse
Og klikk på Create public gist method
Da burde jeg se den nye kjernen
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 av TestNG XML
Standard TestNG-rapporten ser ut som den som er gitt nedenfor.
Eksempel 2
Den vil dekke datatabeller og transponere.
Når miljøet er satt opp:
- Legg til Eclipse Cucumber plugin i Eclipse.
- Opprett et Maven-prosjekt og legg til alle nødvendige avhengigheter til det.
- Opprett en ny funksjonsfil.
- Legg til den nødvendige implementeringen for den i stepdef-filen.
- Utfør direkte fra funksjonsfilen ved å høyreklikke på filen >> Kjør som >> Agurk. Funksjon
Funksjonsfil
Trekk: Tittel på funksjonen din
Jeg vil bruke denne malen for funksjonsfilen min
Bakgrunn:
Gitt at jeg er på Gmail-påloggingssiden
Når jeg spesifiserer brukernavn og passord
Og klikk på Logg på-knappen
Scenario: Opprett ny melding fra datatabellen
Når jeg er på ny e-postside
Og jeg spesifiserer følgende detaljer
| To1 | Emne |
| Person1@email.com | Person1-emne |
| Person2@email.com | Person2-emne |
Scenario: Opprett ny melding fra transponert datatabell
Når jeg er på ny e-postside
Og jeg spesifiserer følgende detaljer fra transponere tabellen
| 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 }
Produksjon : Så eksemplet ovenfor skal logge på Gmail og sende to e-poster for hvert scenario som er for datatabellen og overført datatabellen.
Eksempel 3
Det vil dekke rapportering.
Når miljøet er satt opp:
- Legg til Eclipse Cucumber plugin i Eclipse.
- Lag et Maven-prosjekt og legg til alle nødvendige avhengigheter til det.
- Opprett en ny funksjonsfil.
- Legg til den nødvendige implementeringen for den i Stepdef-filen.
- Lag en løperklasse og kjør løperklassen.
- Vis alle typer rapporter.
Funksjonsfil
Trekk: Tittel på funksjonen din
Jeg vil bruke denne malen for funksjonsfilen min
@ tag1
Scenario: Tittel på scenariet ditt
Gitt at jeg er på Github-hjemmesiden
Når jeg spesifiserer brukernavn og passord
Og klikk på Logg på-knappen
Da skal jeg kunne se alternativet for avlogging
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 forskjellige typene rapporter som genereres av agurk:
HTML-rapport
Ganske
Junit
Konklusjon
Å være et open source-verktøy, er agurk mye brukt i BDD. Og det er veldig lett å forstå, og det har mye omfang med hensyn til nye funksjoner, og det er praktisk mulig å integrere Agurk med Selen eller andre tredjepartsverktøy / krukker etc.
Siden det har aktive hjelpegrupper / medlemmer, blir det virkelig enkelt for alle som nettopp har begynt å lære agurk eller for de som har mellomkunnskap i agurk / BDD.
Agurk støtter videre integrering med excel-arket og Jenkins også.
Anbefalt lesing
- Agurk Selen Tutorial: Agurk Java Selen WebDriver Integration
- Python DateTime Tutorial med eksempler
- REST API-testing med agurk ved bruk av BDD-tilnærming
- Automatiseringstesting ved hjelp av agurkverktøy og selen - Selenveiledning nr. 30
- Agurkgurkeopplæring: Automatiseringstesting ved hjelp av agurk
- Unix Shell Scripting Tutorial med eksempler
- Selen Find Element By Text Tutorial med eksempler
- Java 'dette' nøkkelord: Opplæring med kodeeksempler