bdd cucumber tutorial with examples
Tato hloubková výuka okurky pojednává o BDD a jeho výhodách, okurkovém rámci, nastavení prostředí, tvorbě testovacích skriptů, funkcích okurky, zprávách atd .:
Okurka se stala velmi populární a nyní je široce používána v průmyslu testování softwaru.
Předpoklady - Zamýšlení příjemci by měli mít znalosti o Scrum, Maven, TestNG atd.
Co se naučíte:
- Pozadí BDD
- Výhody vývoje řízeného chováním (BDD)
- Nástroje BDD
- Proč okurka?
- Jak funguje okurka?
- Nastavení prostředí
- Psaní testovacích případů pomocí okurky
- Vytváření souborů pro okurku
- Vlastnosti okurky
- TestNG s okurkou
- Závěr
- Doporučené čtení
Pozadí BDD
V metodice TDD Framework of Agile normálně nejprve napíšeme testovací případy a poté je provedeme. To je dobré k dosažení pokrytí testu a ujistěte se, že je sestavení připraveno k produkci.
Můžeme však vylepšit rámec TDD zavedením chování, funkcí atd. Do testu a poté provést stejné. Toto vylepšení TDD se nazývá BDD (Behavior Driven Development).
Výhody vývoje řízeného chováním (BDD)
Některé výhody používání BDD jsou:
# 1) Překlenuje propast mezi podnikatelskými subjekty a technickým týmem prostřednictvím společné platformy. Komunikace mezi týmy se tak stává transparentnější.
#dva) Scénáře může psát kdokoli, včetně lidí z klientské strany, člena obchodního týmu, managementu atd. Požadavky, scénáře jsou proto pokryty.
# 3) Vývojáři budou psát kód v souladu se scénáři napsanými v rámci BDD namísto psaní / vývoje kódu podle jejich porozumění.
# 4) Testování se stává ostřejším, šetří se čas strávený vytvořením a následným provedením testu, kritické vady, zejména ty, které mohou ovlivnit podnikání, najdete v samotném rozhraní.
# 5) Kód, dokumentace týkající se BDD jsou snadno srozumitelné a udržovatelné, protože k údržbě kódu není nutné žádné další úsilí, protože dokumenty a odpovídající kód již spolu souvisejí. Proto to, co je uvedeno v dokumentaci, tj. Scénáře, bude mít svůj odpovídající kód.
# 6) Protože máme velmi snadno srozumitelné scénáře, můžeme je logicky snadno rozdělit na úkoly, dílčí úkoly atd.
# 7) Tým může být dynamičtější a hbitější, protože existuje jasná informace o scénářích, kritériích přijetí a téměř přesném odhadu testu.
# 8) Velmi dobrá platforma pro nové Připojil se k ženichovi se stávajícím týmem, a to jak z hlediska dokumentace, tak kódu kvůli jeho jednoduchosti.
# 9) Pomáhá nejen při ověřování scénářů (většinou uživatelského rozhraní, souvisejících s chováním), ale také pomáhá v testovacích případech na úrovni jednotky.
# 10) Je také užitečné sledovat postup týmu od prvního dne, protože požadavky a scénáře jsou jasně definovány (něco, co se vývojáři obvykle snaží shromáždit v TDD).
Implementace BDD tedy ruší předpoklad, že „koncový klient nemyslí na důležitost testování“, „klient se nechce zapojit do testovacích aktivit“ atd.
Nástroje BDD
Existuje několik testovacích nástrojů, které nám umožňují implementovat přístup BDD.
Jako:
- Okurka
- SpecFlow
- Jbehave
- Listový salát
- Harmonika
- FitNesse
- BeanSpec
- Snadné B
- Jdave
- Givwenzen-flex
- GivWenZen
- Instinkt
- Sklenice na skleničku
- Gospecify
- Okázalý
- dSpec
- brejle
- Steak
- JSSpec
Mezi výše uvedenými nástroji funguje Jbehave velmi podobně jako Cucumber, ale tyto implementace se mírně liší.
JBEHAVE | OKURKA |
---|---|
Podporuje externí zdroje dat | Nepodporuje externí zdroje dat |
Podporuje příběhy | Podporuje funkce |
Velmi dobrá dokumentace | Žádná standardní dokumentace |
Podporuje složené kroky | Nepodporuje složené kroky |
Ne tak flexibilní | Flexibilní při předávání parametrů |
Nepodporuje pozadí | Podporuje pozadí |
Ne tak rozsáhlé zprávy | Lepší flexibilita formátování, integrované zprávy |
Vyvinuto pomocí Javy | Vyvinuto pomocí Ruby |
Proč okurka?
Okurka se používá k psaní všech druhů testovacích případů, zejména testovacích případů na úrovni přijatelnosti (o které se více zajímají koncoví uživatelé) napsaných stylem Behavioral Driven Development. Podporuje použití jazykových analyzátorů, jako je Gherkin.
Cucumber byl původně napsán pomocí programovacího jazyka Ruby a byl vyvinut speciálně pro testování Ruby. Nyní je však podporován jinými programovacími jazyky, jako je Java.
Gherkin se používá jako jazyk, ve kterém jsou testovací případy psány v jednoduchém formátu a může je také číst a upravovat netechnický uživatel.
Kromě angličtiny podporuje okurka i další jazyky.
Jak funguje okurka?
Pokud jde o jeho pracovní mechanismus, nejprve necháme uživatele (technické / netechnické) napsat jejich požadované testovací případy (jako funkce) pomocí syntaxe Gherkin, jakmile je hotovo, musíme se ujistit, že jsou schváleni, aby mohli přejít na další úroveň.
Poté musíme implementovat, tj. Napsat skripty pro každý řádek (pomocí souboru stepdef), jak je uvedeno v souboru funkcí. Jakmile jsou kódy implementovány, další věcí by bylo spuštění skriptů (pomocí souboru běžce).
Nastavení prostředí
Nastavení prostředí pro Cucumber je mírně složité ve srovnání s prací s jakýmkoli jiným nástrojem, jako je Eclipse nebo jakýkoli jiný IDE.
Výzvy
Musíme se ujistit, že se verze sklenic Cucumber shodují s nainstalovanou verzí Java a IDE, ve kterém aktuálně pracujeme.
Nastavení prostředí
# 1) Eclipse Cucumber Plugin : Pomáhá Eclipse porozumět Gherkinově syntaxi a zvýrazňuje syntaxi souboru funkcí namísto prostého textu.
Musíme jít do Eclipse >> Nápověda >> Instalovat nový software >> Klikněte na tlačítko Přidat >> Upřesněte umístění tak jako tento . Název říká „Okurka“ a poté klikněte na OK a postupujte podle zbytku procesu instalace.
Nakonec restartujte IDE, tj. Eclipse.
#dva) Použijte Maven, abyste měli všechny sklenice, tj. Závislosti, pluginy atd., Jak je uvedeno níže.
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) Ujistěte se, že provádíme buď Ctrl + s nebo provádíme instalaci Maven.
# 4) Poté se ujistěte, že jste provedli sestavení Maven, abyste se vyhnuli jakékoli chybě související se závislostí, abychom později neměli žádnou chybu závislosti, pluginu, neshody verzí.
help desk podpora otázky a odpovědi
# 5) Po dokončení výše uvedených kroků je naše prostředí připraveno.
Psaní testovacích případů pomocí okurky
Okurka obsahuje následující tři soubory:
- Soubor funkcí: Zde píšeme funkce, které mají být testovány, ve formátu Gherkin, tj. Vzhledem k tomu, kdy. Můžeme dokonce spustit soubor funkcí k provedení testovacích skriptů napsaných v souboru Stepdef.
- Soubor Stepdef: Jakmile je soubor Feature připraven, lze každou větu souboru Feature dále implementovat přes soubor Stepdef.
- Soubor běžec: Jedná se pouze o provedení skutečného testovacího skriptu napsaného přes soubor Stepdef odkazem na soubor funkcí. Kromě toho má mnoho dalších možností přizpůsobení, hlášení, selektivního provádění atd.
Zde je jednoduchý příklad souboru 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 { }
Vytváření souborů pro okurku
- Soubor Stepdef - Src / test / java >> Nové >> Ostatní >> Okurka >> StepDef třída.
- Soubor funkcí - Projekt >> Nový >> Soubor >> zadejte název souboru s příponou jako „.feature“.
- Soubor běžec - Je to podobné jako při vytváření jakékoli jiné třídy Java, ale můžeme zde vyžadovat implementaci nějaké metody.
Vlastnosti okurky
Zde jsou některé ze základních funkcí okurky, které budeme implementovat do našeho testovacího skriptu.
# 1) Okurkové háčky
Jedná se o bloky kódu, který běží před nebo po každém scénáři. Abychom je mohli definovat kdekoli v našem projektu. Například, Definice kroku.
Podle definice jsou to jen dvě poznámky @After a @Before. V konzole vidíme, jak se bloky provádějí a poskytují jasný výstup. Můžeme také provést háčky pro konkrétní tagy.
# 2) Okurkové značky
Obvykle se používají nad souborem funkcí ke klasifikaci scénářů nad soubory funkcí podle jejich zadaného názvu značky. V souboru funkcí můžeme mít více značek pro daný scénář.
Značky jsou definovány uživatelem a můžeme jim dát jakékoli jméno, například @Smoke, @Regression atd.
# 3) Okurkové poznámky
Ty jsou zabudovány do okurky. Normálně jsou značky @Given, @When, @Then.
Pokud však později budeme potřebovat, můžeme si vytvořit vlastní anotaci a použít ji v našem programu. Během provádění se odpovídající kód lepidla, tj. Funkce zapisují do souboru Stepdef, který má @Given, @When, @Then bude spuštěn.
# 4) Okurkové pozadí
Jedná se o kroky nebo sérii kroků, které jsou společné pro všechny scénáře v souboru funkcí.
Umožňuje nám přidat nějaký kontext do scénářů pro funkci, kde je definována. Spustí se před každým scénářem funkce, ve které je definována.
# 5) Datové tabulky okurek
Cucumber má funkci, která podporuje testování na základě dat, což nám umožňuje automaticky spustit testovací případ několikrát s různými hodnotami vstupu a ověření pro daný skript.
Okurka podporuje datovou tabulku. První řádek je považován za sloupec a řádky vedle něj jsou data pro skripty.
# 6) Transpozice okurky
Toto je nepatrná úprava datové tabulky Okurka. Zde by se první sloupec považoval za sloupec a další sloupce se považují za data pro skripty.
# 7) Více scénářů okurky
Okurka nám umožňuje provádět testování více scénářů v rámci jednoho souboru funkcí.
# 8) Hlášení okurek
Na rozdíl od přehledů a jiných nástrojů třetích stran, kde pro zobrazení přehledů potřebujeme provést nějakou konfiguraci.
Tady v Cucumber máme vestavěné pluginy, jako jsou pretty, JSON, HTML, XML, které nám dávají komplexní zprávu o provedení testu.
TestNG s okurkou
Stále můžeme provádět testovací případy JUnit napsané v okurce pomocí TestNG podle následujícího:
- Musíme přidat závislosti do projektu Maven.
- Rozšířit třídu ve třídě Runner jako běžec balíčku AbstractTestNGCucumberTests.
- Převeďte projekt maven a přidejte balíček (kde třída běžec existuje).
Poté můžeme spustit celý testovací případ Cucumber jako TestNG a generovat zprávy týkající se stejného (pokud máme posluchače).
V tomto tutoriálu probereme 3 různé příklady okurky, které pokryjí výše uvedené koncepty
Příklad 1
Bude zahrnovat háčky, značky, anotace, pozadí, více scénářů a TestNG s okurkou.
Jakmile je testovací prostředí nastaveno:
- Přidejte do Eclipse plugin Eclipse Cucumber.
- Vytvořte projekt Maven a přidejte do něj všechny požadované závislosti a také přidejte závislost související s TestNG v Maven.
- Vytvořte nový soubor funkcí.
- Přidejte do něj požadovanou implementaci v souboru Stepdef.
- Nyní vytvořte soubor běžce s rozšířením AbstractTestNGCucumberTests.
- Převeďte projekt Maven na TestNG a v souboru testng.xml přidejte cestu k balíčku třídy Cucumber runner.
- Spusťte soubor TestNG.xml.
Soubor funkcí
Vlastnosti:
Jako uživatel
Chci mít možnost přidávat do systému nové klienty
Abych mohl pro tohoto klienta přidat účetní údaje
Pozadí:
Vzhledem k tomu, že jsem na domovské stránce Github
Když zadám uživatelské jméno jako „xxxxxxxxxxxxxxxxxxxx“ a heslo jako „xxx“
A klikněte na tlačítko Přihlásit se
@Kouř
Scénář: Úpravy profilu
Vzhledem k tomu, že kliknu na možnost Váš profil
Když kliknu na tlačítko Upravit profil
A nahrál nový obrázek
Pak bych měl vidět nový profilový obrázek
@ Regrese @Everytime
Scénář: Vytvořit novou podstatu
Vzhledem k tomu, že kliknu na možnost Vaše seznamy
Když uvedu název souboru, popis
A klikněte na Vytvořit veřejnou metodu seznamu
Pak bych měl vidět novou podstatu
Soubor 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 } }
Zde je výsledek testu TestNG XML
Výchozí zpráva TestNG vypadá jako níže uvedená zpráva.
Příklad 2
Bude pokrývat datové tabulky a transponovat.
Jakmile je prostředí nastaveno:
- Přidejte do Eclipse plugin Eclipse Cucumber.
- Vytvořte projekt Maven a přidejte do něj všechny požadované závislosti.
- Vytvořte nový soubor funkcí.
- Přidejte do něj požadovanou implementaci v souboru stepdef.
- Provádějte přímo ze souboru funkcí kliknutím pravým tlačítkem na soubor >> Spustit jako >> Cucumber.feature
Soubor funkcí
Vlastnosti: Název vaší funkce
Chci použít tuto šablonu pro svůj soubor funkcí
Pozadí:
Vzhledem k tomu, že jsem na přihlašovací stránce Gmailu
Když zadám uživatelské jméno a heslo
A klikněte na tlačítko Přihlásit se
Scénář: Vytvořit novou zprávu z datové tabulky
Když jsem na nové e-mailové stránce
A specifikuji následující podrobnosti
| To1 | Předmět |
| Person1@email.com | Osoba1 předmět |
| Person2@email.com | Osoba2 předmět |
Scénář: Vytvořte novou zprávu z tabulky převedených dat
Když jsem na nové e-mailové stránce
A specifikuji následující podrobnosti z tabulky transpozice
| To1 | Person1@email.com | Person2@email.com |
| Předmět | Osoba1 předmět | Osoba2 předmět |
Soubor 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 }
Výstup : Takže výše uvedený příklad by se měl přihlásit do Gmailu a odeslat dva e-maily pro každý scénář, který je pro tabulku dat a tabulku transponovaných dat.
Příklad 3
Bude zahrnovat hlášení.
Jakmile je prostředí nastaveno:
- Přidejte do Eclipse plugin Eclipse Cucumber.
- Vytvořte projekt Maven a přidejte do něj všechny požadované závislosti.
- Vytvořte nový soubor funkcí.
- Přidejte do něj požadovanou implementaci v souboru Stepdef.
- Vytvořte třídu běžců a spusťte třídu běžců.
- Zobrazit všechny typy zpráv.
Soubor funkcí
Vlastnosti: Název vaší funkce
Chci použít tuto šablonu pro svůj soubor funkcí
@ tag1
Scénář: Název vašeho scénáře
Vzhledem k tomu, že jsem na domovské stránce Github
Když zadám uživatelské jméno a heslo
A klikněte na tlačítko Přihlásit se
Pak bych měl vidět možnost odhlášení
Soubor 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 } }
Tady jsou různé typy zpráv, které generuje okurka:
Zpráva HTML
Pěkný
Junit
Závěr
Jako nástroj s otevřeným zdrojovým kódem je Cucumber v BDD široce používán. A je to velmi snadné pochopit a má velký rozsah s ohledem na nové funkce a je prakticky možné integrovat Cucumber se selenem nebo jinými nástroji / sklenicemi třetích stran atd.
Protože má aktivní skupiny / členy nápovědy, je to opravdu snadné pro každého, kdo se právě začal učit okurku, nebo pro ty, kteří mají středně pokročilé znalosti o okurce / BDD.
Cucumber dále podporuje integraci s listem aplikace Excel a také s Jenkinsem.
Doporučené čtení
- Cucumber Selenium Tutorial: Cucumber Java Selenium WebDriver Integration
- Výukový program Python DateTime s příklady
- Testování REST API s okurkou pomocí přístupu BDD
- Automatizační testování pomocí nástroje Cucumber Tool a Selenium - Selenium Tutorial # 30
- Cucumber Gherkin Tutorial: Automation Testing using Gherkin
- Výukový program pro skriptování prostředí Unix s příklady
- Výukový program pro vyhledání prvku selen pomocí textu s příklady
- Java „toto“ klíčové slovo: Výukový program s příklady kódu