bdd cucumber tutorial with examples
Questo tutorial approfondito sui cetrioli discute BDD e i suoi vantaggi, quadro sui cetrioli, impostazioni ambientali, creazione di script di test, caratteristiche del cetriolo, rapporti, ecc .:
Il cetriolo è diventato molto popolare e ora è ampiamente utilizzato nell'industria dei test di software.
Prerequisiti - I destinatari previsti dovrebbero avere conoscenza di Scrum, Maven, TestNG, ecc.
Cosa imparerai:
- Sfondo di BDD
- Vantaggi dello sviluppo guidato dal comportamento (BDD)
- Strumenti BDD
- Perché il cetriolo?
- Come funziona il cetriolo?
- Impostazioni ambientali
- Scrittura di casi di test utilizzando il cetriolo
- Creazione di file per cetriolo
- Caratteristiche del cetriolo
- TestNG Con Cetriolo
- Conclusione
- Lettura consigliata
Sfondo di BDD
Nel Framework TDD della metodologia Agile, normalmente scriviamo prima i casi di test e poi li eseguiamo. Ciò è utile per ottenere la copertura del test e assicurarsi che la build sia pronta per la produzione.
Tuttavia, possiamo migliorare il framework TDD introducendo comportamenti, funzionalità, ecc. Al test e quindi eseguire lo stesso. Questo miglioramento di TDD è definito BDD (Behaviour Driven Development).
Vantaggi dello sviluppo guidato dal comportamento (BDD)
Alcuni vantaggi dell'utilizzo di BDD sono:
# 1) Colma il divario tra gli stakeholder aziendali e il team tecnico attraverso una piattaforma comune. Quindi, la comunicazione tra il team diventa più trasparente.
#Due) Gli scenari possono essere scritti da chiunque, comprese le persone dal lato client, un membro del team aziendale, il management, ecc. Quindi, i requisiti e gli scenari vengono coperti.
# 3) Gli sviluppatori scriveranno il codice in conformità agli scenari scritti nel framework BDD invece di scrivere / sviluppare il codice secondo la loro comprensione.
# 4) I test diventano più nitidi, si risparmia tempo per la creazione e la successiva esecuzione di un test, i difetti critici soprattutto quelli che possono avere un impatto sul business si possono trovare nel front-end stesso.
# 5) Il codice e la documentazione relativa a BDD sono facilmente comprensibili e gestibili in quanto non è richiesto alcun altro sforzo per mantenere il codice poiché i documenti e il codice corrispondente sono già correlati. Quindi ciò che è menzionato nella documentazione, cioè scenari, avrà il suo codice corrispondente.
# 6) Poiché disponiamo di scenari facilmente comprensibili, possiamo facilmente suddividerli in attività, sottoattività, ecc. In modo logico.
# 7) Il team può essere più dinamico, agile in quanto vi è una chiarezza iniziale sugli scenari, i criteri di accettazione e una stima dei test quasi accurata.
# 8) Piattaforma molto buona per un nuovo unito per collaborare con il team esistente sia in termini di documentazione che di codice a causa della sua semplicità.
# 9) Non solo aiuta a convalidare gli scenari (principalmente interfaccia utente, relativi al comportamento), ma aiuta anche nei casi di test a livello di unità.
# 10) Inoltre, è utile tenere traccia dei progressi del team fin dal primo giorno perché i requisiti e gli scenari sono chiaramente definiti [qualcosa che gli sviluppatori di solito fanno fatica a raccogliere in TDD].
Quindi l'implementazione di BDD rimuove il presupposto che 'il cliente finale non pensa all'importanza del test', 'il cliente non vuole coinvolgersi nelle attività di test', ecc.
Strumenti BDD
Esistono diversi strumenti di test che ci consentono di implementare l'approccio BDD.
Ad esempio:
- Cetriolo
- SpecFlow
- Jbehave
- Lattuga
- Concordion
- FitNesse
- BeanSpec
- Facile B
- Jdave
- Givwenzen-flex
- GivWenZen
- Istinto
- Bicchiere tumbler
- Gospecify
- Spettacolare
- dSpec
- Specifiche
- Bistecca
- JSSpec
Tra gli strumenti di cui sopra, Jbehave funziona in modo abbastanza simile a Cucumber, tuttavia, questi sono leggermente diversi in termini di implementazione.
JBEHAVE | CETRIOLO |
---|---|
Supporta origini dati esterne | Non supporta origini dati esterne |
Supporta le storie | Supporta le funzionalità |
Documentazione molto buona | Nessuna documentazione standard |
Supporta passaggi compositi | Non supporta passaggi compositi |
Non così flessibile | Flessibilità nel passaggio dei parametri |
Non supporta lo sfondo | Supporta lo sfondo |
Rapporti non così estesi | Migliore flessibilità di formattazione, report integrati |
Sviluppato utilizzando Java | Sviluppato utilizzando Ruby |
Perché il cetriolo?
Il cetriolo viene utilizzato per scrivere tutti i tipi di casi di test, in particolare casi di test di livello di accettazione (di cui gli utenti finali sono più interessati) scritti in uno stile di sviluppo guidato dal comportamento. Supporta l'utilizzo di analizzatori di linguaggio come Gherkin.
In origine, Cucumber è stato scritto utilizzando il linguaggio di programmazione Ruby ed è stato sviluppato appositamente per i test Ruby. Ma ora è supportato da altri linguaggi di programmazione come Java.
Gherkin viene utilizzato come linguaggio in cui i casi di test sono scritti in un formato semplice e possono essere letti e modificati anche da un utente non tecnico.
Oltre all'inglese, Cucumber supporta anche altre lingue.
Come funziona il cetriolo?
Venendo al suo meccanismo di funzionamento, in primo luogo, lasciamo che gli utenti (tecnici / non tecnici) scrivano i loro casi di test desiderati (come funzionalità) utilizzando la sintassi di Gherkin, una volta fatto dobbiamo assicurarci che siano approvati in modo che possano andare a il livello successivo.
Dopodiché, dobbiamo implementare, ad esempio, scrivere script per ogni riga (utilizzando un file stepdef) come menzionato nel file delle funzionalità. Una volta implementati i codici, la prossima cosa sarebbe eseguire gli script (utilizzando un file runner).
Configurazione ambientale
L'impostazione ambientale per Cucumber è leggermente complessa rispetto al lavoro con qualsiasi altro strumento come Eclipse o qualsiasi altro IDE.
Sfide
Dobbiamo assicurarci che le versioni dei barattoli di cetriolo corrispondano alla versione di Java installata e all'IDE su cui stiamo attualmente lavorando.
Impostazioni ambientali
# 1) Plugin Cetriolo Eclipse : Aiuta Eclipse a comprendere la sintassi di Gherkin ed evidenzia la sintassi del file delle caratteristiche invece di un testo normale.
Dobbiamo andare a Eclipse >> Aiuto >> Installa nuovo software >> Fare clic sul pulsante Aggiungi >> Specificare la posizione come Questo . Il nome dice 'Cucumber', quindi fare clic su OK e seguire il resto del processo di installazione.
Alla fine riavvia il tuo IDE, ad esempio Eclipse.
#Due) Usa Maven per avere tutti i jar, ad esempio dipendenze, plugin, ecc. Come indicato di seguito.
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) Assicurati di fare Ctrl + s o di eseguire l'installazione di Maven.
# 4) Dopodiché assicurati di eseguire la compilazione Maven per evitare errori relativi alle dipendenze in modo da non avere dipendenze, plug-in, errori di mancata corrispondenza della versione in seguito.
come selezionare il pulsante di opzione in selenio
# 5) Una volta completati i passaggi precedenti, il nostro ambiente è pronto.
Scrittura di casi di test utilizzando il cetriolo
Il cetriolo include i seguenti tre file:
- File delle caratteristiche: Qui scriviamo le caratteristiche da testare nel formato Gherkin, ovvero Dato quando e poi. Possiamo anche eseguire il file delle caratteristiche per eseguire gli script di test scritti nel file Stepdef.
- File Stepdef: Una volta che il file Feature è pronto, ogni frase del file Feature può essere ulteriormente implementata sul file Stepdef.
- File del corridore: Questo è solo per eseguire l'effettivo script di test scritto sul file Stepdef facendo riferimento al file delle caratteristiche. Oltre a ciò, ha molte altre opzioni per la personalizzazione, il reporting, l'esecuzione selettiva, ecc.
Ecco un semplice esempio di un file 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 { }
Creazione di file per cetriolo
- File Stepdef - Src / test / java >> Nuovo >> Altri >> Cetriolo >> Classe StepDef.
- File delle caratteristiche - Progetto >> Nuovo >> File >> specifica il nome del file con estensione '.feature'.
- File del corridore - È simile a qualsiasi altra creazione di classi Java, ma potrebbe essere necessario implementare un metodo qui.
Caratteristiche del cetriolo
Ecco alcune delle caratteristiche di base di Cucumber che implementeremo nel nostro Test Script.
# 1) Ganci per cetrioli
Questi sono i blocchi del codice che viene eseguito prima o dopo ogni scenario. In modo che possiamo definirli, ovunque nel nostro progetto. Per esempio, Definizione del passaggio.
Secondo la definizione, queste sono solo due annotazioni @After e @Before. Nella console, possiamo vedere i blocchi che vengono eseguiti e che forniscono un output chiaro. Possiamo anche eseguire gli hook per Tag specifici.
# 2) Tag di cetriolo
Questi sono normalmente usati sul file delle caratteristiche per classificare gli scenari sui file delle caratteristiche secondo il nome del tag dato. Possiamo avere più tag per un dato scenario nel file delle caratteristiche.
I tag sono definiti dall'utente e possiamo dargli qualsiasi nome come @Smoke, @Regression, ecc.
# 3) Annotazioni di cetriolo
Questi sono incorporati in Cucumber. Normalmente i tag sono @Given, @When, @Then.
Tuttavia, in seguito, se necessario, possiamo creare la nostra annotazione e quindi usarla nel nostro programma. Durante l'esecuzione, il codice glue corrispondente, ovvero le funzioni, vengono scritte in un file Stepdef con @Given, @When, @Then verrà eseguito.
# 4) Sfondo di cetriolo
Questi sono passaggi o serie di passaggi comuni a tutti gli scenari nel file di funzionalità.
Ci permette di aggiungere un po 'di contesto agli scenari per una caratteristica in cui è definita. Viene eseguito prima di ogni scenario per una funzionalità in cui è definito.
# 5) Tabelle dati cetriolo
Cucumber ha la caratteristica di supportare i test basati sui dati, che ci consente di eseguire automaticamente un test case più volte con diversi valori di input e convalida per un dato script.
Il cetriolo supporta la tabella dei dati. La prima riga è considerata come la colonna e le righe accanto ad essa sono i dati per gli script.
# 6) Trasposizione del cetriolo
Questa è una leggera modifica alla tabella dei dati del cetriolo. Qui la prima colonna verrebbe considerata come colonna e le colonne successive saranno considerate come dati per gli script.
# 7) Scenari multipli di cetriolo
Cucumber ci consente di eseguire test di più scenari in un unico file di funzionalità.
# 8) Segnalazione dei cetrioli
A differenza dei rapporti e di altri strumenti di terze parti in cui è necessario eseguire alcune configurazioni per visualizzare i rapporti.
Qui in Cucumber, abbiamo plug-in incorporati come pretty, JSON, HTML, XML che ci forniscono il rapporto completo sull'esecuzione del test.
TestNG Con Cetriolo
Possiamo ancora eseguire i casi di test JUnit scritti in Cucumber usando TestNG seguendo:
- Dobbiamo aggiungere le dipendenze al progetto Maven.
- Estendi la classe nella classe Runner come runner del pacchetto AbstractTestNGCucumberTests.
- Converti il progetto Maven e aggiungi il pacchetto (dove esiste la classe runner).
Dopodiché, possiamo eseguire l'intero test case Cucumber come TestNG e generare report relativi allo stesso (se abbiamo gli ascoltatori).
In questo tutorial, discuteremo 3 diversi esempi di cetriolo per coprire i concetti di cui sopra
Esempio 1
Coprirà hook, tag, annotazioni, sfondo, scenari multipli e TestNG con Cucumber.
Una volta configurato l'ambiente di test:
- Aggiungi il plugin Eclipse Cucumber in Eclipse.
- Crea un progetto Maven e aggiungi tutte le dipendenze richieste e aggiungi anche la dipendenza relativa a TestNG in Maven.
- Crea un nuovo file di funzionalità.
- Aggiungere l'implementazione richiesta per esso nel file Stepdef.
- Ora crea un file runner con extends AbstractTestNGCucumberTests.
- Converti il progetto Maven in TestNG e nel testng.xml aggiungi il percorso del pacchetto della classe runner Cucumber.
- Esegui il file TestNG.xml.
File delle caratteristiche
Caratteristica:
Come utente
Voglio poter aggiungere nuovi client nel sistema
Così posso aggiungere i dati contabili per quel cliente
Sfondo:
Dato che sono sulla home page di Github
Quando si specifica il nome utente come 'xxxxxxxxxxxxxxxxxxxx' e la password come 'xxx'
E fare clic sul pulsante Accedi
@Fumo
Scenario: Modifica del profilo
Dato che faccio clic sull'opzione Il tuo profilo
Quando clicco sul pulsante Modifica profilo
E caricata una nuova foto
Allora dovrei vedere la nuova immagine del profilo
@Regression @Everytime
Scenario: Crea una nuova sintesi
Dato che faccio clic sull'opzione I tuoi Gists
Quando fornisco nome file, descrizione
E fai clic su Crea metodo di sintesi pubblica
Allora dovrei vedere il nuovo succo
File 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 } }
Ecco il risultato del test di TestNG XML
Il rapporto TestNG predefinito è simile a quello fornito di seguito.
Esempio 2
Coprirà le tabelle di dati e trasporrà.
Una volta configurato l'ambiente:
- Aggiungi il plugin Eclipse Cucumber in Eclipse.
- Crea un progetto Maven e aggiungi tutte le dipendenze richieste.
- Crea un nuovo file di funzionalità.
- Aggiungere l'implementazione richiesta per esso nel file stepdef.
- Esegui direttamente dal file delle caratteristiche facendo clic con il pulsante destro del mouse sul file >> Esegui come >> Cucumber.feature
File delle caratteristiche
Caratteristica: Titolo della tua caratteristica
Voglio usare questo modello per il mio file di caratteristiche
Sfondo:
Dato che sono sulla pagina di accesso di Gmail
Quando si specifica Username e Password
E fare clic sul pulsante Accedi
Scenario: Crea nuovo messaggio dalla tabella dati
Quando sono nella nuova pagina di posta elettronica
E specifico i seguenti dettagli
| To1 | Oggetto |
| Persona1@email.com | Oggetto Persona1 |
| Person2@email.com | Soggetto Persona2 |
Scenario: Crea nuovo messaggio dalla tabella dati trasposta
Quando sono nella nuova pagina di posta elettronica
E specifico i seguenti dettagli dalla tabella di trasposizione
| To1 | Persona1@email.com | Person2@email.com |
| Oggetto | Oggetto Persona1 | Soggetto Persona2 |
File 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 }
Produzione : Quindi l'esempio precedente deve accedere a Gmail e inviare due e-mail per ogni scenario relativo alla tabella dei dati e alla tabella dei dati trasposti.
Esempio 3
Coprirà la segnalazione.
Una volta configurato l'ambiente:
- Aggiungi il plugin Eclipse Cucumber in Eclipse.
- Crea un progetto Maven e aggiungi tutte le dipendenze richieste.
- Crea un nuovo file di funzionalità.
- Aggiungere l'implementazione richiesta per esso nel file Stepdef.
- Crea una classe runner ed esegui la classe runner.
- Visualizza tutti i tipi di report.
File delle caratteristiche
Caratteristica: Titolo della tua caratteristica
Voglio usare questo modello per il mio file di caratteristiche
@ tag1
Scenario: Titolo del tuo scenario
Dato che sono sulla home page di Github
Quando si specifica Username e Password
E fare clic sul pulsante Accedi
Quindi dovrei essere in grado di vedere l'opzione di logout
File 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 } }
Ecco i vari tipi di rapporti generati da Cucumber:
Rapporto HTML
Bella
Junit
Conclusione
Essendo uno strumento open source, Cucumber è ampiamente utilizzato in BDD. Ed è molto facile da capire e ha molto spazio rispetto alle nuove funzionalità ed è praticamente possibile integrare Cucumber con Selenio o altri strumenti / barattoli di terze parti ecc.
Dato che ha gruppi / membri di aiuto attivi, diventa davvero facile per chiunque abbia appena iniziato a imparare Cucumber o per coloro che hanno una conoscenza intermedia in Cucumber / BDD.
Cucumber supporta inoltre l'integrazione con il foglio Excel e anche Jenkins.
Lettura consigliata
- Esercitazione sul selenio di cetriolo: integrazione del driver Web di selenio Java di cetriolo
- Tutorial Python DateTime con esempi
- Test API REST con cetriolo utilizzando l'approccio BDD
- Test di automazione utilizzando lo strumento Cucumber e il selenio - Tutorial sul selenio # 30
- Tutorial cetriolo cetriolo: test di automazione con cetriolino
- Tutorial sullo scripting di shell Unix con esempi
- Selenio Trova elemento per tutorial di testo con esempi
- Parola chiave Java 'questo': tutorial con esempi di codice