bdd cucumber tutorial with examples
In diesem ausführlichen Tutorial zu Gurken werden BDD und seine Vorteile, das Gurken-Framework, die Umgebungseinstellungen, die Erstellung von Testskripten, Gurkenfunktionen, Berichte usw. erläutert.
Gurke ist sehr beliebt geworden und wird heute in der Software-Testbranche häufig eingesetzt.
Voraussetzungen - Die beabsichtigten Empfänger sollten Kenntnisse über Scrum, Maven, TestNG usw. haben.
Was du lernen wirst:
- Hintergrund von BDD
- Vorteile der verhaltensgesteuerten Entwicklung (BDD)
- BDD-Tools
- Warum Gurke?
- Wie funktioniert Gurke?
- Umgebungseinstellungen
- Testfälle mit Gurke schreiben
- Dateien für Gurke erstellen
- Gurkenmerkmale
- TestNG Mit Gurke
- Fazit
- Literatur-Empfehlungen
Hintergrund von BDD
In der TDD Framework of Agile-Methodik schreiben wir normalerweise zuerst die Testfälle und führen sie dann aus. Dies ist gut, um die Testabdeckung zu erreichen und sicherzustellen, dass der Build für die Produktion bereit ist.
Wir können das TDD-Framework jedoch verbessern, indem wir Verhalten, Funktionen usw. in den Test einführen und dann ausführen. Diese Verbesserung von TDD wird als BDD (Behavior Driven Development) bezeichnet.
Vorteile der verhaltensgesteuerten Entwicklung (BDD)
Einige Vorteile der Verwendung von BDD sind:
# 1) Überbrückt die Lücke zwischen Geschäftsinteressenten und dem technischen Team durch eine gemeinsame Plattform. Dadurch wird die Kommunikation zwischen den Teams transparenter.
#zwei) Szenarien können von jedem geschrieben werden, einschließlich Personen von Kundenseite, Mitglied des Geschäftsteams, Management usw. Daher werden die Anforderungen und Szenarien abgedeckt.
#3) Entwickler schreiben den Code gemäß den im BDD-Framework geschriebenen Szenarien, anstatt den Code nach ihrem Verständnis zu schreiben / zu entwickeln.
# 4) Das Testen wird schärfer, der Zeitaufwand für die Erstellung und anschließende Ausführung eines Tests wird gespart. Kritische Fehler, insbesondere solche, die sich auf das Geschäft auswirken können, befinden sich im Front-End.
# 5) Code und Dokumentation zu BDD sind leicht verständlich und wartbar, da keine weiteren Anstrengungen erforderlich sind, um den Code zu pflegen, da die Dokumente und der entsprechende Code bereits miteinander verbunden sind. Daher hat das, was in der Dokumentation erwähnt wird, d. H. Szenarien, seinen entsprechenden Code.
# 6) Da wir sehr leicht verständliche Szenarien haben, können wir sie auf logische Weise leicht in Aufgaben, Unteraufgaben usw. aufteilen.
# 7) Das Team kann dynamischer und agiler sein, da im Voraus Klarheit über die Szenarien, Akzeptanzkriterien und eine nahezu genaue Testschätzung besteht.
# 8) Sehr gute Plattform für einen New Joined, um sich aufgrund seiner Einfachheit sowohl in Bezug auf die Dokumentation als auch in Bezug auf den Code mit dem bestehenden Team zu verbinden.
# 9) Dies hilft nicht nur bei der Validierung der Szenarien (hauptsächlich Benutzeroberfläche, verhaltensbezogen), sondern auch bei Testfällen auf Einheitenebene.
# 10) Es ist auch nützlich, den Fortschritt des Teams vom ersten Tag an zu verfolgen, da die Anforderungen und Szenarien klar definiert sind (etwas, das die Entwickler normalerweise nur schwer in TDD sammeln können).
Daher wird durch die Implementierung von BDD die Annahme beseitigt, dass „der Endkunde nicht über die Bedeutung des Testens nachdenkt“, „der Kunde sich nicht an den Testaktivitäten beteiligen möchte“ usw.
BDD-Tools
Es gibt verschiedene Testtools, mit denen wir den BDD-Ansatz implementieren können.
Sowie:
- Gurke
- SpecFlow
- Jbehave
- Salat
- Konkordion
- FitNesse
- BeanSpec
- Einfach B.
- Jdave
- Givwenzen-Flex
- GivWenZen
- Instinkt
- Becherglas
- Gospecify
- Spektakulär
- dSpec
- Technische Daten
- Steak
- JSSpec
Unter den oben genannten Tools funktioniert Jbehave Cucumber sehr ähnlich, diese unterscheiden sich jedoch geringfügig in ihrer Implementierung.
JBEHAVE | GURKE |
---|---|
Unterstützt externe Datenquellen | Externe Datenquellen werden nicht unterstützt |
Unterstützt Geschichten | Unterstützt Funktionen |
Sehr gute Dokumentation | Keine Standarddokumentation |
Unterstützt zusammengesetzte Schritte | Unterstützt keine zusammengesetzten Schritte |
Nicht so flexibel | Flexibel bei der Übergabe von Parametern |
Unterstützt keinen Hintergrund | Unterstützt Hintergrund |
Nicht so umfangreiche Berichte | Bessere Formatierungsflexibilität, integrierte Berichte |
Entwickelt mit Java | Entwickelt mit Ruby |
Warum Gurke?
Gurke wird zum Schreiben aller Arten von Testfällen verwendet, insbesondere von Testfällen auf Akzeptanzstufe (über die Endbenutzer mehr betroffen sind), die in einem verhaltensgesteuerten Entwicklungsstil geschrieben wurden. Es unterstützt die Verwendung von Sprachparsern wie Gherkin.
Ursprünglich wurde Cucumber mit der Programmiersprache Ruby geschrieben und speziell für Ruby-Tests entwickelt. Aber jetzt wird es von anderen Programmiersprachen wie Java unterstützt.
Gurke wird als Sprache verwendet, in der die Testfälle in einem einfachen Format geschrieben sind und auch von einem nicht technischen Benutzer gelesen und geändert werden können.
Neben Englisch unterstützt Cucumber auch andere Sprachen.
Wie funktioniert Gurke?
Wenn wir zu seinem Arbeitsmechanismus kommen, lassen wir zuerst die Benutzer (technisch / nicht technisch) ihre gewünschten Testfälle (als Funktionen) unter Verwendung der Gurkensyntax schreiben. Sobald dies erledigt ist, müssen wir sicherstellen, dass sie genehmigt sind, damit sie zu gehen können das nächste Level.
Danach müssen wir, d. H. Schreibskripte für jede Zeile (unter Verwendung einer stepdef-Datei) implementieren, wie in der Feature-Datei erwähnt. Sobald die Codes implementiert sind, müssen Sie als Nächstes die Skripte ausführen (mithilfe einer Runner-Datei).
Umgebungs-Setup
Das Umgebungssetup für Cucumber ist im Vergleich zur Arbeit mit anderen Tools wie Eclipse oder einer anderen IDE etwas komplex.
Herausforderungen
Wir müssen sicherstellen, dass die Versionen der Gurkengläser mit der installierten Java-Version sowie der IDE übereinstimmen, in der wir gerade arbeiten.
Umgebungseinstellungen
# 1) Eclipse Cucumber Plugin : Es hilft der Eclipse, die Gherkin-Syntax zu verstehen, und hebt die Syntax der Feature-Datei anstelle eines einfachen Textes hervor.
Wir müssen gehen zu Eclipse >> Hilfe >> Neue Software installieren >> Klicken Sie auf die Schaltfläche Hinzufügen >> Geben Sie den Speicherort an wie Dies . Der Name sagt 'Gurke' und klicken Sie dann auf OK und folgen Sie dem Restinstallationsprozess.
Starten Sie zuletzt Ihre IDE neu, d. H. Eclipse.
#zwei) Verwenden Sie Maven, um alle Jars zu haben, d. H. Abhängigkeiten, Plugins usw., wie unten erwähnt.
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) Stellen Sie sicher, dass Sie entweder Strg + s ausführen oder die Maven-Installation durchführen.
# 4) Stellen Sie danach sicher, dass Sie den Maven-Build ausführen, um abhängigkeitsbezogene Fehler zu vermeiden, damit später keine Fehler in Bezug auf Abhängigkeit, Plugin oder Versionsfehlanpassung auftreten.
youtube zu mp4 schnell kostenlos online
# 5) Sobald die oben genannten Schritte abgeschlossen sind, ist unsere Umgebung bereit.
Testfälle mit Gurke schreiben
Gurke enthält die folgenden drei Dateien:
- Funktionsdatei: Hier schreiben wir die zu testenden Merkmale im Gurkenformat, d. H. Gegeben, wann dann. Wir können sogar die Feature-Datei ausführen, um die in der Stepdef-Datei geschriebenen Testskripte auszuführen.
- Stepdef-Datei: Sobald die Feature-Datei fertig ist, kann jeder Satz der Feature-Datei über die Stepdef-Datei weiter implementiert werden.
- Runner-Datei: Dies dient nur dazu, das eigentliche Testskript auszuführen, das über die Stepdef-Datei geschrieben wurde, indem auf die Feature-Datei verwiesen wird. Abgesehen davon gibt es viele andere Optionen für Anpassung, Berichterstellung, selektive Ausführung usw.
Hier ist ein einfaches Beispiel für eine Runner-Datei
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 { }
Dateien für Gurke erstellen
- Stepdef-Datei - Src / test / java >> Neu >> Andere >> Gurke >> StepDef-Klasse.
- Feature-Datei - Projekt >> Neu >> Datei >> Geben Sie den Namen für die Datei mit der Erweiterung '.feature' an.
- Runner-Datei - Es ähnelt jeder anderen Java-Klassenerstellung, es kann jedoch erforderlich sein, hier eine Methode zu implementieren.
Gurkenmerkmale
Hier sind einige der Grundfunktionen von Cucumber, die wir in unserem Testskript implementieren werden.
# 1) Gurkenhaken
Dies sind die Blöcke des Codes, der vor oder nach jedem Szenario ausgeführt wird. Damit wir diese überall in unserem Projekt definieren können. Zum Beispiel, Schritt Definition.
Gemäß der Definition sind dies nur zwei Anmerkungen @After und @Before. In der Konsole können wir sehen, wie die Blöcke ausgeführt werden und eine klare Ausgabe geben. Wir können die Hooks auch für bestimmte Tags ausführen.
# 2) Gurkenanhänger
Diese werden normalerweise über der Feature-Datei verwendet, um die Szenarien über die Feature-Dateien gemäß ihrem angegebenen Tag-Namen zu klassifizieren. Wir können mehrere Tags für ein bestimmtes Szenario in der Feature-Datei haben.
Tags sind benutzerdefiniert und können beliebig benannt werden, z. B. @Smoke, @Regression usw.
# 3) Gurkenanmerkungen
Diese sind in Gurke eingebaut. Normalerweise sind Tags @Given, @When, @Then.
Später können wir jedoch bei Bedarf eine eigene Anmerkung erstellen und diese dann in unserem Programm verwenden. Während der Ausführung wird der passende Klebercode, d. H. Funktionen, in eine Stepdef-Datei mit @Given, @When, @Then geschrieben.
# 4) Gurkenhintergrund
Dies sind Schritte oder eine Reihe von Schritten, die allen Szenarien in der Feature-Datei gemeinsam sind.
Es ermöglicht uns, den Szenarien für ein Feature, in dem es definiert ist, einen Kontext hinzuzufügen. Es wird vor jedem Szenario für ein Feature ausgeführt, in dem es definiert ist.
# 5) Gurkendatentabellen
Cucumber unterstützt datengesteuerte Tests, mit denen wir einen Testfall automatisch mehrmals mit unterschiedlichen Eingabe- und Validierungswerten für ein bestimmtes Skript ausführen können.
Gurke unterstützt die Datentabelle. Die erste Zeile wird als Spalte betrachtet und die Zeilen daneben sind die Daten für die Skripte.
# 6) Gurkentransponierung
Dies ist eine geringfügige Änderung der Gurkendatentabelle. Hier würde die erste Spalte als Spalte betrachtet und die nächsten Spalten werden als Daten für die Skripte betrachtet.
# 7) Gurken-Multi-Szenarien
Mit Cucumber können wir mehrere Szenarien unter einer Feature-Datei testen.
# 8) Gurkenberichterstattung
Im Gegensatz zu Berichten und anderen Tools von Drittanbietern, bei denen einige Konfigurationen vorgenommen werden müssen, um die Berichte anzuzeigen.
Hier in Cucumber haben wir integrierte Plugins wie Pretty, JSON, HTML, XML, die uns den umfassenden Bericht über die Testausführung geben.
TestNG Mit Gurke
Wir können die in Cucumber geschriebenen JUnit-Testfälle weiterhin mit TestNG ausführen folgend:
- Wir müssen die Abhängigkeiten zum Maven-Projekt hinzufügen.
- Erweitern Sie die Klasse in der Runner-Klasse als AbstractTestNGCucumberTests-Paketläufer.
- Konvertieren Sie das Maven-Projekt und fügen Sie das Paket hinzu (wo die Runner-Klasse vorhanden ist).
Danach können wir den gesamten Gurkentestfall als TestNG ausführen und Berichte dazu erstellen (sofern wir die Listener haben).
In diesem Tutorial werden 3 verschiedene Gurkenbeispiele erläutert, um die oben genannten Konzepte zu behandeln
Beispiel 1
Es werden Hooks, Tags, Anmerkungen, Hintergrund, mehrere Szenarien und TestNG mit Gurke behandelt.
Sobald die Testumgebung eingerichtet ist:
- Fügen Sie das Eclipse Cucumber-Plugin in Eclipse hinzu.
- Erstellen Sie ein Maven-Projekt, fügen Sie alle erforderlichen Abhängigkeiten hinzu und fügen Sie TestNG-bezogene Abhängigkeiten in Maven hinzu.
- Erstellen Sie eine neue Feature-Datei.
- Fügen Sie die dafür erforderliche Implementierung in die Stepdef-Datei ein.
- Erstellen Sie nun eine Runner-Datei mit den Erweiterungen AbstractTestNGCucumberTests.
- Konvertieren Sie das Maven-Projekt in TestNG und fügen Sie in der Datei testng.xml den Paketpfad der Cucumber-Runner-Klasse hinzu.
- Führen Sie die Datei TestNG.xml aus.
Feature-Datei
Merkmal:
Als Benutzer
Ich möchte in der Lage sein, neue Clients in das System aufzunehmen
Damit ich Buchhaltungsdaten für diesen Kunden hinzufügen kann
Hintergrund:
Vorausgesetzt, ich bin auf der Github-Homepage
Wenn ich den Benutzernamen als 'xxxxxxxxxxxxxxxxxxxxxx' und das Passwort als 'xxx' spezifiziere
Und klicken Sie auf die Schaltfläche Anmelden
@Rauch
Szenario: Profil bearbeiten
Vorausgesetzt, ich klicke auf die Option Ihr Profil
Wenn ich auf die Schaltfläche Profil bearbeiten klicke
Und neues Bild hochgeladen
Dann sollte ich ein neues Profilbild sehen
@Regression @Everytime
Szenario: Erstellen Sie einen neuen Kern
Vorausgesetzt, ich klicke auf Ihre Gists-Option
Wenn ich Dateiname, Beschreibung gebe
Und klicken Sie auf Create public gist method
Dann sollte ich den neuen Kern sehen
Stepdef-Datei
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 } }
Hier ist das Testergebnis von TestNG XML
Der Standard-TestNG-Bericht sieht wie folgt aus.
Beispiel 2
Es wird Datentabellen abdecken und transponieren.
Sobald die Umgebung eingerichtet ist:
- Fügen Sie das Eclipse Cucumber-Plugin in Eclipse hinzu.
- Erstellen Sie ein Maven-Projekt und fügen Sie ihm alle erforderlichen Abhängigkeiten hinzu.
- Erstellen Sie eine neue Feature-Datei.
- Fügen Sie die erforderliche Implementierung in die stepdef-Datei ein.
- Führen Sie die Ausführung direkt aus der Feature-Datei aus, indem Sie mit der rechten Maustaste auf die Datei >> Ausführen als >> Cucumber.feature klicken
Feature-Datei
Merkmal: Titel Ihrer Funktion
Ich möchte diese Vorlage für meine Feature-Datei verwenden
Hintergrund:
Vorausgesetzt, ich bin auf der Google Mail-Anmeldeseite
Wenn ich Benutzername und Passwort angeben
Und klicken Sie auf die Schaltfläche Anmelden
Szenario: Erstellen Sie eine neue Nachricht aus der Datentabelle
Wenn ich auf der neuen E-Mail-Seite bin
Und ich spezifiziere die folgenden Details
| To1 | Betreff |
| Person1@email.com | Person1 Betreff |
| Person2@email.com | Person2 Betreff |
Szenario: Erstellen Sie eine neue Nachricht aus der transponierten Datentabelle
Wenn ich auf der neuen E-Mail-Seite bin
Und ich spezifiziere folgende Details aus der Transponiertabelle
| To1 | Person1@email.com | Person2@email.com |
| Betreff | Person1 Betreff | Person2 Betreff |
Stepdef-Datei
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 }
Ausgabe : Das obige Beispiel muss sich bei Google Mail anmelden und zwei E-Mails für jedes Szenario senden, das für die Datentabelle und die Transponierte Datentabelle gilt.
Beispiel 3
Es wird die Berichterstattung abdecken.
Sobald die Umgebung eingerichtet ist:
- Fügen Sie das Eclipse Cucumber-Plugin in Eclipse hinzu.
- Erstellen Sie ein Maven-Projekt und fügen Sie ihm alle erforderlichen Abhängigkeiten hinzu.
- Erstellen Sie eine neue Feature-Datei.
- Fügen Sie die dafür erforderliche Implementierung in die Stepdef-Datei ein.
- Erstellen Sie eine Runner-Klasse und führen Sie die Runner-Klasse aus.
- Zeigen Sie alle Arten von Berichten an.
Feature-Datei
Merkmal: Titel Ihrer Funktion
Ich möchte diese Vorlage für meine Feature-Datei verwenden
@ tag1
Szenario: Titel Ihres Szenarios
Vorausgesetzt, ich bin auf der Github-Homepage
Wenn ich Benutzername und Passwort angeben
Und klicken Sie auf die Schaltfläche Anmelden
Dann sollte ich in der Lage sein, die Abmeldeoption zu sehen
Stepdef-Datei
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 } }
Hier sind die verschiedenen Arten von Berichten, die von Cucumber generiert werden:
HTML-Bericht
Ziemlich
Junit
Fazit
Als Open-Source-Tool ist Cucumber in BDD weit verbreitet. Und es ist sehr einfach zu verstehen und hat viel Spielraum in Bezug auf neue Funktionen und es ist praktisch möglich, Cucumber in Selenium oder andere Werkzeuge / Gläser von Drittanbietern usw. zu integrieren.
Da es aktive Hilfsgruppen / Mitglieder gibt, wird es für jeden, der gerade angefangen hat, Gurke zu lernen, oder für diejenigen, die über fortgeschrittene Kenntnisse in Gurke / BDD verfügen, wirklich einfach.
Gurke unterstützt weiterhin die Integration mit dem Excel-Blatt und Jenkins.
Literatur-Empfehlungen
- Cucumber Selenium Tutorial: Integration von Cucumber Java Selenium WebDriver
- Python DateTime Tutorial mit Beispielen
- REST-API-Test mit Gurke unter Verwendung des BDD-Ansatzes
- Automatisierungstests mit Gurkenwerkzeug und Selen - Selen-Tutorial Nr. 30
- Gurken-Gurken-Tutorial: Automatisierungstests mit Gurken
- Unix Shell Scripting Tutorial mit Beispielen
- Selenium Find Element By Text Tutorial mit Beispielen
- Java 'this' Schlüsselwort: Tutorial mit Codebeispielen