bdd cucumber tutorial with examples
Aquest tutorial en profunditat sobre cogombre parla de BDD i els seus avantatges, marc de cogombre, configuració ambiental, creació de seqüències de proves, funcions de cogombre, informes, etc.:
El cogombre ha esdevingut molt popular i ara s’utilitza àmpliament a la indústria de proves de programari.
Requisits previs - Els destinataris previstos haurien de tenir coneixements de Scrum, Maven, TestNG, etc.
Què aprendreu:
- Fons de BDD
- Beneficis del desenvolupament impulsat pel comportament (BDD)
- Eines BDD
- Per què el cogombre?
- Com funciona el cogombre?
- Configuració ambiental
- Redacció de casos de prova amb cogombre
- Creació de fitxers per a cogombre
- Característiques del cogombre
- TestNG amb cogombre
- Conclusió
- Lectura recomanada
Fons de BDD
A la metodologia TDD Framework of Agile, normalment escrivim primer els casos de prova i després els executem. Això és bo per assolir la cobertura de la prova i assegurar-se que la versió està preparada per a la producció.
Tot i això, podem millorar el marc TDD introduint Comportaments, funcions, etc. a la prova i després executem el mateix. Aquesta millora de TDD es denomina BDD (Behavior Driven Development).
Beneficis del desenvolupament impulsat pel comportament (BDD)
Alguns avantatges d’utilitzar BDD són:
# 1) Redueix la bretxa entre els grups d'interès empresarials i l'equip tècnic mitjançant una plataforma comuna. Per tant, la comunicació entre l’equip es fa més transparent.
# 2) Qualsevol persona pot escriure escenaris, incloses persones del client, un membre de l’equip empresarial, la direcció, etc. Per tant, els requisits i els escenaris es cobreixen.
# 3) Els desenvolupadors escriuran el codi d'acord amb els escenaris escrits en el marc BDD en lloc d'escriure / desenvolupar el codi segons entenguin.
# 4) Les proves es tornen més nítides, s’estalvia el temps dedicat a la creació i a la posterior execució d’una prova; els defectes crítics, especialment aquells que poden afectar l’empresa, es poden trobar a la mateixa interfície.
# 5) El codi i la documentació relacionada amb BDD són fàcilment comprensibles i mantenibles, ja que no cal cap altre esforç per mantenir el codi, ja que els documents i el seu codi corresponent ja estan relacionats. Per tant, el que s’esmenta a la documentació, és a dir, els escenaris, tindrà el seu codi corresponent.
# 6) Com que tenim escenaris molt fàcils d'entendre, podem dividir-los fàcilment en tasques, sub-tasques, etc. d'una manera lògica.
# 7) L’equip pot ser més dinàmic, àgil ja que hi ha una claredat inicial sobre els escenaris, els criteris d’acceptació i una estimació de prova gairebé precisa.
# 8) Molt bona plataforma per a un New Joined per preparar-se amb l'equip existent, tant en termes de documentació com de codi, per la seva senzillesa.
# 9) No només ajuda a validar els escenaris (principalment IU, relacionats amb el comportament), sinó que també ajuda en casos de proves a nivell d’unitat.
# 10) A més, és útil fer un seguiment del progrés de l’equip des del primer dia perquè els requisits i els escenaris estan clarament definits (cosa que els desenvolupadors solen lluitar per recollir a TDD).
Per tant, la implementació de BDD elimina la suposició que 'el client final no pensa en la importància de les proves', 'el client no vol implicar-se en les activitats de prova', etc.
Eines BDD
Hi ha diverses eines de prova que ens permeten implementar l'enfocament BDD.
Tal com:
- Cogombre
- SpecFlow
- Jbehave
- Enciam
- Concordió
- FitNesse
- BeanSpec
- Fàcil B
- Jdave
- Givwenzen-flex
- GivWenZen
- Instint
- Vidre de vidre
- Especificar
- Espectacular
- dSpec
- Especificacions
- Filet
- JSSpec
Entre les eines anteriors, Jbehave funciona bastant similar a Cucumber, però, són lleugerament diferents pel que fa a la seva implementació.
JBEHAVE | CUBUM |
---|---|
Admet fonts de dades externes | No admet fonts de dades externes |
Admet històries | Admet funcions |
Molt bona documentació | No hi ha documentació estàndard |
Admet passos compostos | No admet els passos compostos |
No és tan flexible | Paràmetres de pas flexibles |
No admet fons | Admet fons |
Informes no tan extensos | Millora de la flexibilitat de format, informes integrats |
Desenvolupat amb Java | Desenvolupat amb Ruby |
Per què el cogombre?
El cogombre s’utilitza per escriure tot tipus de casos de prova, especialment casos de proves de nivell d’acceptació (sobre els quals els usuaris finals estan més preocupats) escrits en un estil de desenvolupament impulsat pel comportament. Admet l'ús d'analitzadors d'idiomes com Gherkin.
Originalment, Cucumber es va escriure utilitzant el llenguatge de programació Ruby i es va desenvolupar especialment per a proves de Ruby. Però ara està sent compatible amb altres llenguatges de programació com Java.
Gherkin s’utilitza com a idioma en què s’escriuen els casos de prova en un format senzill i també poden ser llegits i modificats per un usuari no tècnic.
A part de l’anglès, Cucumber també admet altres idiomes.
Com funciona el cogombre?
Arribant al seu mecanisme de treball, primer, deixem als usuaris (tècnics / no tècnics) escriure els casos de prova desitjats (com a característiques) mitjançant la sintaxi de Gherkin, un cop feta, hem d’assegurar-nos que estiguin aprovats perquè puguin anar a el següent nivell.
Després d’això, hem d’implementar, és a dir, escriure scripts per a cada línia (mitjançant un fitxer stepdef) tal com s’esmenta al fitxer de funcions. Un cop s’implementin els codis, el següent seria executar els scripts (mitjançant un fitxer runner).
Configuració ambiental
La configuració ambiental de Cucumber és lleugerament complexa en comparació amb treballar amb qualsevol altra eina com Eclipse o qualsevol altre IDE.
Desafiaments
Hem d’assegurar-nos que les versions de Cucumber pots coincideixin amb la versió Java instal·lada, així com amb l’IDE en què treballem actualment.
Configuració ambiental
# 1) Complement Eclipse Cucumber : Ajuda l'Eclipse a entendre la sintaxi de Gherkin i ressalta la sintaxi del fitxer de funcions en lloc d'un text pla.
Hem d’anar-hi Eclipsi >> Ajuda >> Instal·leu programari nou >> Feu clic al botó Afegeix >> Especifiqueu la ubicació com això . El nom diu 'Cogombre' i, a continuació, feu clic a D'acord i seguiu el procés d'instal·lació restant.
Per fi, reinicieu el vostre IDE, és a dir, Eclipse.
# 2) Utilitzeu Maven per tenir tots els pots, és a dir, dependències, connectors, etc., tal com s’esmenta a continuació.
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) Assegureu-vos si fem Ctrl + s o realitzem la instal·lació de Maven.
# 4) Després d'això, assegureu-vos de realitzar la compilació de Maven per evitar qualsevol error relacionat amb la dependència, de manera que no tinguem cap error de coincidència de versions, plugins o versions.
programari per descarregar vídeo des de qualsevol lloc web
# 5) Un cop fets els passos anteriors, el nostre entorn està a punt.
Redacció de casos de prova amb cogombre
Cogombre inclou els tres fitxers següents:
- Fitxer de funcions: Aquí escrivim les funcions que es provaran en format Gherkin, és a dir, quan es donarà llavors. Fins i tot podem executar el fitxer de funcions per executar els scripts de prova escrits al fitxer Stepdef.
- Fitxer Stepdef: Un cop el fitxer Feature estigui llest, cada frase del fitxer Feature es pot implementar a través del fitxer Stepdef.
- Fitxer Runner: Això és només per executar l'script de prova real escrit al fitxer Stepdef fent referència al fitxer de funcions. A part d’això, té moltes altres opcions de personalització, informes, execució selectiva, etc.
Aquí teniu un exemple senzill d’un fitxer 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 { }
Creació de fitxers per a cogombre
- Fitxer Stepdef - Src / test / java >> Novetat >> Altres >> Cogombre >> Classe StepDef.
- Fitxer de funcions - Projecte >> Nou >> Fitxer >> especifiqueu el nom del fitxer amb l'extensió com a '.feature'.
- Fitxer Runner - És similar a qualsevol altra creació de classe Java, però és possible que necessitem implementar algun mètode aquí.
Característiques del cogombre
A continuació, es detallen algunes de les funcions bàsiques de Cucumber que implementarem al nostre script de prova.
# 1) Ganxos de cogombre
Aquests són els blocs del codi que s’executa abans o després de cada escenari. Perquè puguem definir-los en qualsevol lloc del nostre projecte. Per exemple, Definició del pas.
Segons la definició, aquestes són només dues anotacions @After i @Before. A la consola, podem veure com s’executen els blocs i donen una sortida clara. També podem executar els ganxos per a etiquetes específiques.
# 2) Etiquetes de cogombre
Normalment s’utilitzen al fitxer de funcions per classificar els escenaris dels fitxers de característiques segons el seu nom d’etiqueta donat. Podem tenir diverses etiquetes per a un escenari determinat al fitxer de funcions.
Les etiquetes estan definides per l'usuari i podem donar-li qualsevol nom, com ara @Smoke, @Regression, etc.
# 3) Anotacions de cogombre
Aquests s’incorporen a Cucumber. Normalment, les etiquetes són @Given, @When, @Then.
Tanmateix, més endavant, si ho necessitem, podem crear la nostra pròpia anotació i utilitzar-la al nostre programa. Durant l'execució, el codi de cola coincident, és a dir, les funcions s'escriuen en un fitxer Stepdef amb @Given, @When, @Then s'executarà.
# 4) Fons de cogombre
Es tracta de passos o sèries de passos que són comuns a tots els escenaris del fitxer de funcions.
Ens permet afegir context als escenaris d'una característica on es defineix. S’executa abans de tots els escenaris d’una característica en què està definida.
# 5) Taules de dades de cogombre
El cogombre té la funció de donar suport a les proves basades en dades, que ens permet executar automàticament un cas de prova diverses vegades amb valors d’entrada i validació diferents per a un script determinat.
Cogombre admet la taula de dades. La primera fila es considera la columna i les files al costat són les dades dels scripts.
# 6) Transposició de cogombre
Es tracta d’una lleugera modificació de la taula de dades de Cogombre. Aquí la primera columna es consideraria com a columna i les columnes següents es consideraran dades dels scripts.
# 7) Escenaris múltiples de cogombre
El cogombre ens permet realitzar proves de diversos escenaris en un fitxer de funcions.
# 8) Informes de cogombre
A diferència de la presentació d'informes i d'altres eines de tercers, en què hem de fer alguna configuració per visualitzar els informes.
Aquí, a Cucumber, tenim connectors incorporats, com ara pretty, JSON, HTML, XML, que ens proporcionen l’informe complet d’execució de la prova.
TestNG amb cogombre
Encara podem executar els casos de prova de JUnit escrits a Cucumber mitjançant TestNG seguint:
- Hem d’afegir les dependències al projecte Maven.
- Amplieu la classe a la classe Runner com a corredor de paquets AbstractTestNGCucumberTests.
- Convertiu el projecte maven i afegiu el paquet (on existeix la classe runner).
Després d'això, podem executar tot el cas de prova de Cucumber com a TestNG i generar informes relacionats amb el mateix (si tenim els oients).
En aquest tutorial, parlarem de 3 exemples de cogombre diferents per tractar els conceptes anteriors
Exemple 1
Cobrirà ganxos, etiquetes, anotacions, fons, escenaris múltiples i TestNG amb Cucumber.
Un cop configurat l'entorn de prova:
- Afegiu el complement Eclipse Cucumber a Eclipse.
- Creeu un projecte Maven i afegiu-hi totes les dependències necessàries i afegiu també dependències relacionades amb TestNG a Maven.
- Creeu un fitxer de funcions nou.
- Afegiu la implementació necessària al fitxer Stepdef.
- Ara creeu un fitxer corredor amb extends AbstractTestNGCucumberTests.
- Convertiu el projecte Maven a TestNG i, a testng.xml, afegiu la ruta del paquet de la classe Runner Cucumber.
- Executeu el fitxer TestNG.xml.
Fitxer de funcions
Característica:
Com a usuari
Vull poder afegir nous clients al sistema
Per poder afegir dades comptables per a aquest client
Antecedents:
Donat, estic a la pàgina principal de Github
Quan especifiqui el nom d'usuari com a 'xxxxxxxxxxxxxxxxxxxxxx' i la contrasenya com a 'xxx'
I feu clic al botó Iniciar sessió
@Fum
Escenari: S'està editant el perfil
Donat, faig clic a l'opció El vostre perfil
Quan faig clic al botó Edita perfil
I foto nova penjada
Llavors hauria de veure una foto de perfil nova
@Regression @Everytime
Escenari: Crea un nou resum
Tenint en compte que faig clic a l'opció Your Gists
Quan proporciono el nom del fitxer, la descripció
I feu clic a Crea un mètode bàsic públic
Llavors hauria d’estar veient el nou concepte
Fitxer 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 } }
Aquí teniu el resultat de la prova de TestNG XML
L’informe TestNG per defecte té l’aspecte que es mostra a continuació.
Exemple 2
Cobrirà taules de dades i es transposarà.
Un cop configurat l'entorn:
- Afegiu el complement Eclipse Cucumber a Eclipse.
- Creeu un projecte Maven i afegiu-hi totes les dependències necessàries.
- Creeu un fitxer de funcions nou.
- Afegiu la implementació necessària al fitxer stepdef.
- Executeu directament des del fitxer de funcions fent clic amb el botó dret sobre el fitxer >> Executa com >> Funció de cogombre
Fitxer de funcions
Característica: Títol de la funció
Vull utilitzar aquesta plantilla per al meu fitxer de funcions
Antecedents:
Tenint en compte que estic a la pàgina d'inici de sessió de Gmail
Quan especifiqui el nom d’usuari i la contrasenya
I feu clic al botó Iniciar sessió
Escenari: Creeu un missatge nou a partir de la taula de dades
Quan estic a la pàgina de correu electrònic nova
I especifico els detalls següents
| A1 | Assumpte |
| Person1@email.com | Persona1 subjecte |
| Person2@email.com | Persona2 subjecte |
Escenari: Creeu un missatge nou a partir de la taula de dades transposada
Quan estic a la pàgina de correu electrònic nova
I especifico els detalls següents de la taula de transposició
| A1 | Person1@email.com | Person2@email.com |
| Assumpte | Persona1 subjecte | Persona2 subjecte |
Fitxer 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 }
Sortida : Per tant, l'exemple anterior iniciarà sessió a Gmail i enviarà dos correus electrònics per a cada escenari que correspongui a la taula de dades i a la taula de dades transposades.
Exemple 3
Es tractarà d'informes.
Un cop configurat l'entorn:
- Afegiu el complement Eclipse Cucumber a Eclipse.
- Creeu un projecte Maven i afegiu-hi totes les dependències necessàries.
- Creeu un fitxer de funcions nou.
- Afegiu la implementació necessària al fitxer Stepdef.
- Creeu una classe de corredors i executeu-la.
- Consulteu tots els tipus d'informes.
Fitxer de funcions
Característica: Títol de la funció
Vull utilitzar aquesta plantilla per al meu fitxer de funcions
@ etiqueta1
Escenari: Títol del vostre escenari
Donat, estic a la pàgina principal de Github
Quan especifiqui el nom d’usuari i la contrasenya
I feu clic al botó Iniciar sessió
Llavors hauria de poder veure l’opció de tancament de sessió
Fitxer 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 } }
Aquests són els diversos tipus d’informes que genera Cucumber:
Informe HTML
bonic
Junit
Conclusió
En ser una eina de codi obert, el cogombre s’utilitza àmpliament a BDD. I és molt fàcil d’entendre, té molt d’abast respecte a les noves funcions i és pràcticament possible integrar el Cogombre amb Selenium o qualsevol altra eina / pot de tercers, etc.
Com que té grups / membres d’ajuda actius, és realment fàcil per a qualsevol persona que acaba d’iniciar el cogombre o per a aquells que tinguin coneixements intermedis en Cogombre / BDD.
El cogombre també admet la integració amb el full Excel i Jenkins.
Lectura recomanada
- Tutorial de Cogombre Selenium: Integració de Cogombre Java Selenium WebDriver
- Tutorial de Python DateTime amb exemples
- Proves de l'API REST amb cogombre mitjançant l'aproximació BDD
- Proves d'automatització mitjançant Eina de cogombre i Selenium - Tutorial Selenium # 30
- Tutorial de Cogombre Gherkin: proves d'automatització mitjançant Gherkin
- Tutorial de script Unix Shell amb exemples
- Tutorial Selenium Find Element By Text amb exemples
- Paraula clau 'aquesta' de Java: tutorial amb exemples de codi