bdd cucumber tutorial with examples
Ta poglobljeni vadnik o kumarah razpravlja o BDD in njegovih prednostih, Okvir kumare, Okoljske nastavitve, Ustvarjanje testnega skripta, Značilnosti kumar, Poročila itd.:
Kumara je postala zelo priljubljena in se zdaj pogosto uporablja v industriji za testiranje programske opreme.
Predpogoji - Predvideni prejemniki bi morali poznati Scrum, Maven, TestNG itd.
Kaj se boste naučili:
- Ozadje BDD
- Prednosti razvoja, usmerjenega v vedenje (BDD)
- Orodja BDD
- Zakaj kumare?
- Kako deluje kumara?
- Okoljske nastavitve
- Pisanje testnih primerov z uporabo kumar
- Ustvarjanje datotek za kumare
- Značilnosti kumar
- TestNG s kumaro
- Zaključek
- Priporočeno branje
Ozadje BDD
V metodologiji TDD Framework of Agile običajno najprej napišemo testne primere in jih nato izvedemo. To je dobro, da dosežete testno pokritost in se prepričate, da je gradnja pripravljena za proizvodnjo.
Vendar lahko ogrodje TDD izboljšamo z uvedbo vedenj, lastnosti itd. V test in nato izvedemo isto. Ta izboljšava TDD se imenuje BDD (Behavior Driven Development).
Prednosti razvoja, usmerjenega v vedenje (BDD)
Nekatere prednosti uporabe BDD so:
# 1) Prekoračuje vrzel med poslovnimi deležniki in tehnično skupino s skupno platformo. Tako komunikacija med ekipo postane bolj pregledna.
#two) Scenarije lahko napiše vsak, vključno z osebami s strani stranke, članom poslovne skupine, vodstvom itd. Zato se zahteve in scenariji pokrivajo.
# 3) Razvijalci bodo kodo napisali skladno s scenariji, zapisanimi v okviru BDD, namesto da bi pisali / razvijali kodo po njihovem razumevanju.
# 4) Testiranje postane ostrejše, čas, porabljen za ustvarjanje in nadaljnjo izvedbo testa, se prihrani, kritične napake, zlasti tiste, ki lahko vplivajo na poslovanje, pa najdemo na samem sprednjem delu.
# 5) Kodeks, dokumentacija, ki se nanaša na BDD, je lahko razumljiva in vzdrževalna, saj za vzdrževanje kode ni treba drugače delati, saj sta dokumenta in ustrezna koda že povezana. Zato bo tisto, kar je omenjeno v dokumentaciji, torej scenariji, imelo ustrezno kodo.
# 6) Ker imamo zelo enostavno razumljive scenarije, jih lahko na logičen način enostavno razdelimo na naloge, podnaloge itd.
# 7) Ekipa je lahko bolj dinamična, gibčna, saj je vnaprej jasna glede scenarijev, meril sprejemljivosti in skoraj natančne ocene preizkusov.
# 8) Zelo dobra platforma za New Joined, da se z obstoječo ekipo uredi tako zaradi dokumentacije kot kode zaradi enostavnosti.
# 9) Ne pomaga le pri preverjanju veljavnosti scenarijev (večinoma uporabniškega vmesnika, povezanih z vedenjem), ampak pomaga tudi v testnih primerih na ravni enote.
# 10) Prav tako je koristno spremljati napredek ekipe od prvega dne, ker so zahteve in scenariji jasno opredeljeni (nekaj, česar se razvijalci običajno trudijo zbrati v TDD).
Zato izvajanje BDD odstrani predpostavko, da 'končni odjemalec ne razmišlja o pomenu testiranja', 'odjemalec se ne želi vključiti v dejavnosti testiranja' itd.
Orodja BDD
Obstaja več orodij za testiranje, ki nam omogočajo izvajanje pristopa BDD.
Kot naprimer:
- Kumara
- SpecFlow
- Jbehave
- Solata
- Concordion
- FitNesse
- BeanSpec
- Enostavno B
- Jdave
- Givwenzen-flex
- GivWenZen
- Nagon
- Tumbler-steklo
- Gospecify
- Spektakularno
- dSpec
- Očala
- Zrezek
- JSSpec
Med zgoraj omenjenimi orodji deluje Jbehave precej podobno kot Kumara, vendar se ta nekoliko razlikujejo glede njihove izvedbe.
JBEHAVE | KUMAPA |
---|---|
Podpira zunanje vire podatkov | Ne podpira zunanjih virov podatkov |
Podpira zgodbe | Podpira funkcije |
Zelo dobra dokumentacija | Ni standardne dokumentacije |
Podpira sestavljene korake | Ne podpira sestavljenih korakov |
Ni tako prilagodljiv | Prilagodljivi parametri prenosa |
Ne podpira ozadja | Podpira ozadje |
Ne tako obsežna poročila | Boljša prilagodljivost oblikovanja, vgrajena poročila |
Razvit z uporabo Jave | Razvit z uporabo Rubyja |
Zakaj kumare?
Kumara se uporablja za pisanje vseh vrst testnih primerov, zlasti testnih primerov na ravni sprejemljivosti (o katerih končni uporabniki bolj skrbijo), napisanih v slogu vedenjskega razvoja. Podpira uporabo jezikovnih razčlenjevalnikov, kot je Gherkin.
Prvotno je bila Cucumber napisana v programskem jeziku Ruby in je bila razvita posebej za testiranje Rubyja. Zdaj pa ga podpirajo drugi programski jeziki, kot je Java.
Gherkin se uporablja kot jezik, v katerem so testni primeri napisani v preprosti obliki in jih lahko bere in spreminja tudi netehnični uporabnik.
Kumara poleg angleščine podpira tudi druge jezike.
Kako deluje kumara?
Ko pridemo do njegovega delovnega mehanizma, najprej uporabnikom (tehničnim / netehničnim) omogočimo, da s pomočjo sintakse Gherkin napišejo želene testne primere (kot značilnosti). naslednjo stopnjo.
Po tem moramo implementirati, torej napisati skripte za vsako vrstico (z uporabo datoteke stepdef), kot je omenjeno v funkcijski datoteki. Ko so kode implementirane, je naslednja stvar zagnati skripte (z uporabo datoteke tekača).
Nastavitev okolja
Okoljska nastavitev za kumare je nekoliko zapletena v primerjavi z delom s katerim koli drugim orodjem, kot je Eclipse ali katero koli drugo IDE.
Izzivi
Prepričati se moramo, da se različice kozarcev za kumarice ujemajo z nameščeno različico Java, pa tudi z IDE, v katerem trenutno delamo.
Okoljske nastavitve
# 1) Vtičnik Eclipse Cucumber : Eclipseu pomaga razumeti sintakso Gherkin in poudari sintakso datoteke funkcije namesto navadnega besedila.
Moramo iti v Eclipse >> Pomoč >> Namestitev nove programske opreme >> Kliknite gumb Dodaj >> Določite lokacijo kot to . V imenu piše 'Kumara', nato kliknite V redu in sledite preostalemu postopku namestitve.
Končno znova zaženite IDE, tj. Eclipse.
#two) Uporabite Maven za vse kozarce, tj.odvisnosti, vtičnike itd., Kot je navedeno spodaj.
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) Prepričajte se, ali uporabljamo Ctrl + s ali namestimo Maven.
# 4) Po tem se prepričajte, da izvedete Maven build, da se izognete kakršni koli napaki, povezani z odvisnostjo, tako da kasneje ne bomo imeli napake v odvisnosti, vtičniku ali različici.
java dodajanje elementov v matriko
# 5) Ko so zgornji koraki končani, je naše okolje pripravljeno.
Pisanje testnih primerov z uporabo kumar
Kumara vključuje naslednje tri datoteke:
- Datoteka funkcije: Tu pišemo lastnosti, ki jih bomo preizkusili v obliki Gherkin, tj. Kdaj potem. Datoteko funkcije lahko celo zaženemo za izvajanje testnih skriptov, zapisanih v datoteki Stepdef.
- Datoteka Stepdef: Ko je datoteka Feature pripravljena, je mogoče vsak stavek datoteke Feature nadalje implementirati prek datoteke Stepdef.
- Datoteka tekača: To je samo za izvedbo dejanskega testnega skripta, napisanega nad datoteko Stepdef, s sklicevanjem na funkcijsko datoteko. Poleg tega ima še veliko drugih možnosti za prilagajanje, poročanje, selektivno izvajanje itd.
Tu je preprost primer datoteke Runner
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 { }
Ustvarjanje datotek za kumare
- Datoteka Stepdef - Src / test / java >> Novo >> Ostalo >> Kumare >> StepDef razred.
- Datoteka funkcije - Projekt >> Novo >> Datoteka >> navedite ime datoteke s pripono kot '.feature'.
- Datoteka tekača - Podobno je kot pri ustvarjanju katerega koli drugega razreda Java, vendar bomo morda morali tu uporabiti kakšno metodo.
Značilnosti kumar
Tu je nekaj osnovnih značilnosti kumar, ki jih bomo uporabili v našem testnem skriptu.
# 1) Kljuke za kumare
To so bloki kode, ki se izvajajo pred ali po vsakem scenariju. Tako da jih lahko definiramo kjer koli v našem projektu. Na primer, Opredelitev koraka.
Glede na definicijo sta to le dva pripisa @After in @Before. V konzoli lahko vidimo, kako se bloki izvajajo in dajejo jasen izhod. Kljuke lahko izvedemo tudi za določene oznake.
# 2) Oznake kumar
Običajno se uporabljajo nad datoteko funkcije za razvrščanje scenarijev nad datotekami funkcij glede na njihovo ime oznake. V datoteki funkcije imamo lahko več oznak za dani scenarij.
Oznake so uporabniško določene in jim lahko damo poljubno ime, na primer @Smoke, @Regression itd.
# 3) Pripombe kumar
Ti so vgrajeni v kumare. Običajno so oznake @Given, @When, @Then.
Pozneje pa lahko po potrebi ustvarimo lastno opombo in jo nato uporabimo v našem programu. Med izvajanjem se ujemajoča lepilna koda, tj. Funkcije, zapišejo v datoteko Stepdef, ki bo izvedla @Given, @When, @Then.
# 4) Ozadje kumar
To so koraki ali vrste korakov, ki so skupni vsem scenarijem v datoteki funkcije.
Omogoča nam, da scenarijem za funkcijo, kjer je definirana, dodamo nekaj konteksta. Zažene se pred vsakim scenarijem za funkcijo, v kateri je definirana.
# 5) Tabele s podatki o kumarah
Kumara ima funkcijo, ki podpira testiranje na podlagi podatkov, kar nam omogoča, da večkrat samodejno zaženemo testni primer z različnimi vhodnimi in validacijskimi vrednostmi za dani skript.
Kumara podpira podatkovno tabelo. Prva vrstica se šteje za stolpec, vrstice poleg nje pa so podatki za skripte.
# 6) Prenos kumar
To je majhna sprememba tabele s podatki o kumarah. Tu bi se prvi stolpec obravnaval kot stolpec, naslednji stolpci pa kot podatki za skripte.
# 7) Več scenarijev s kumaricami
Kumara nam omogoča izvajanje preizkusov več scenarijev v eni datoteki funkcije.
# 8) Poročanje o kumarah
Za razliko od poročanja in drugih orodij drugih proizvajalcev, kjer moramo za ogled poročanja narediti nekaj konfiguracije.
Tukaj v Cucumber imamo vgrajene vtičnike, kot so pretty, JSON, HTML, XML, ki nam dajejo izčrpno poročilo o izvajanju testa.
TestNG s kumaro
S testNG še vedno lahko izvajamo testne primere JUnit, napisane v kumaricah z naslednjim:
- Odvisnosti moramo dodati projektu Maven.
- Razširite razred v tekaškem razredu kot tekač paketov AbstractTestNGCucumberTests.
- Pretvorite projekt maven in dodajte paket (kjer obstaja razred tekača).
Po tem lahko celoten testni primer Kumare zaženemo kot TestNG in ustvarimo poročila, ki se nanašajo nanj (če imamo poslušalce).
V tej vadnici bomo obravnavali 3 različne primere kumar, da bi pokrili zgornje koncepte
Primer 1
Obsegal bo kljuke, oznake, pripise, ozadje, več scenarijev in testNG s kumaricami.
Ko je testno okolje nastavljeno:
- Dodajte vtičnik Eclipse Cucumber v Eclipse.
- Ustvarite projekt Maven in mu dodajte vse zahtevane odvisnosti ter v Maven dodajte tudi odvisnost, povezano s TestNG.
- Ustvarite novo funkcijsko datoteko.
- V datoteko Stepdef dodajte zahtevano izvedbo zanj.
- Zdaj ustvarite datoteko tekača z razširitvami AbstractTestNGCucumberTests.
- Projekt Maven pretvorite v TestNG in v testng.xml dodajte pot do razreda tekača kumar.
- Zaženite datoteko TestNG.xml.
Datoteka funkcije
Značilnost:
Kot uporabnik
Želim imeti možnost dodajanja novih strank v sistem
Tako da lahko dodam računovodske podatke za to stranko
Ozadje:
Glede na to, da sem na domači strani Github
Ko uporabniško ime določim kot »xxxxxxxxxxxxxxxxxxxx«, geslo pa kot »xxx«
In kliknite gumb Prijava
@Smoke
Scenarij: Urejanje profila
Glede na to, da kliknem na možnost Vaš profil
Ko kliknem na gumb za urejanje profila
In naložil novo sliko
Potem bi moral videti novo sliko profila
@Regression @Everytime
Scenarij: Ustvari novo bistvo
Glede na to, da kliknem na možnost Vaša seznama
Ko navedem ime datoteke, opis
In kliknite na Ustvari javno sliko
Potem bi moral videti novo bistvo
Datoteka Stepdef
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 } }
Tu je rezultat testa TestNG XML
Privzeto poročilo TestNG je videti kot spodnje.
2. primer
Zajemal bo tabele podatkov in jih prenesel.
Ko je okolje nastavljeno:
- Dodajte vtičnik Eclipse Cucumber v Eclipse.
- Ustvarite projekt Maven in mu dodajte vse zahtevane odvisnosti.
- Ustvarite novo funkcijsko datoteko.
- Dodajte potrebno izvedbo zanj v datoteko stepdef.
- Izvedite neposredno iz datoteke funkcije z desnim klikom na datoteko >> Zaženi kot >> Cucumber.feature
Datoteka funkcije
Značilnost: Naslov vaše funkcije
To predlogo želim uporabiti za svojo funkcijsko datoteko
Ozadje:
Glede na to, da sem na strani za prijavo v Gmail
Ko določim uporabniško ime in geslo
In kliknite gumb Prijava
Scenarij: Ustvari novo sporočilo iz podatkovne tabele
Ko sem na novi e-poštni strani
In določim naslednje podrobnosti
| To1 | Predmet |
| Person1@email.com | Oseba1 subjekt |
| Person2@email.com | Oseba2 subjekt |
Scenarij: Ustvari novo sporočilo iz prenesene tabele podatkov
Ko sem na novi e-poštni strani
Iz tabele za prenos določim naslednje podrobnosti
| To1 | Person1@email.com | Person2@email.com |
| Predmet | Oseba1 subjekt | Oseba2 subjekt |
Datoteka Stepdef
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 }
Izhod : Torej, zgornji primer se bo prijavil v Gmail in poslal dva e-poštna sporočila za vsak scenarij, ki je za tabelo podatkov in tabelo prenesenih podatkov.
3. primer
Zajemalo bo poročanje.
Ko je okolje nastavljeno:
- Dodajte vtičnik Eclipse Cucumber v Eclipse.
- Ustvarite projekt Maven in mu dodajte vse zahtevane odvisnosti.
- Ustvarite novo funkcijsko datoteko.
- V datoteko Stepdef dodajte zahtevano izvedbo zanj.
- Ustvarite razred tekača in izvedite razred tekača.
- Oglejte si vse vrste poročil.
Datoteka funkcije
Značilnost: Naslov vaše funkcije
To predlogo želim uporabiti za svojo funkcijsko datoteko
@ tag1
Scenarij: Naslov vašega scenarija
Glede na to, da sem na domači strani Github
Ko določim uporabniško ime in geslo
In kliknite gumb Prijava
Potem bi moral videti možnost odjave
Datoteka Stepdef
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 } }
Tu so različne vrste poročil, ki jih ustvari kumara:
Poročilo HTML
Lepa
Junit
Zaključek
Kot odprtokodno orodje se kumara pogosto uporablja v BDD. To je zelo enostavno razumeti in ima veliko področja uporabe glede novih funkcij in praktično je mogoče integrirati Kumaro s selenom ali drugimi orodji / kozarci drugih proizvajalcev itd.
Ker ima aktivne skupine / člane za pomoč, postane resnično lahko za vsakogar, ki se je šele začel učiti kumar ali za tiste, ki imajo vmesno znanje iz kumar / BDD.
Kumara nadalje podpira integracijo z Excelovim listom in Jenkinsom.
Priporočeno branje
- Vadnica za kumare selena: Integracija kumar Java Selenium WebDriver
- Vadnica Python DateTime s primeri
- Testiranje REST API s kumaricami z uporabo pristopa BDD
- Avtomatizirano preizkušanje z uporabo orodij za kumare in selen - vaja št. 30
- Vadnica za kumarice s kumaricami: Avtomatizirano testiranje z uporabo kumaric
- Vadnica za skriptiranje lupine Unix s primeri
- Vadnica za iskanje selena z besedilom z primeri
- Java 'this' ključna beseda: Vadnica s primeri kode