bdd cucumber tutorial with examples
Ten szczegółowy samouczek dotyczący ogórków omawia BDD i jego zalety, ramy ogórków, ustawienia środowiskowe, tworzenie skryptów testowych, funkcje ogórka, raporty itp .:
Ogórek stał się bardzo popularny i obecnie jest szeroko stosowany w branży testowania oprogramowania.
Wymagania wstępne - Docelowi odbiorcy powinni mieć wiedzę na temat Scruma, Mavena, TestNG itp.
Czego się nauczysz:
- Tło BDD
- Korzyści z rozwoju opartego na zachowaniu (BDD)
- Narzędzia BDD
- Dlaczego ogórek?
- Jak działa ogórek?
- Ustawienia środowiskowe
- Pisanie przypadków testowych przy użyciu ogórka
- Tworzenie plików dla ogórka
- Funkcje ogórka
- TestNG Z Ogórkiem
- Wniosek
- rekomendowane lektury
Tło BDD
W metodologii TDD Framework of Agile zazwyczaj najpierw piszemy przypadki testowe, a następnie je wykonujemy. Jest to dobre rozwiązanie, aby uzyskać pokrycie testowe i upewnić się, że kompilacja jest gotowa do produkcji.
Możemy jednak ulepszyć strukturę TDD, wprowadzając do testu zachowania, funkcje itp., A następnie wykonujemy to samo. To ulepszenie TDD jest określane jako BDD (Behavior Driven Development).
Korzyści z rozwoju opartego na zachowaniu (BDD)
Niektóre korzyści z używania BDD to:
# 1) Wypełnia lukę między interesariuszami biznesowymi a zespołem technicznym dzięki wspólnej platformie. Dzięki temu komunikacja między zespołem staje się bardziej przejrzysta.
#dwa) Scenariusze mogą być pisane przez każdego, w tym przez osoby po stronie klienta, członka zespołu biznesowego, kierownictwo itp. W związku z tym wymagania, scenariusze są uwzględniane.
# 3) Programiści będą pisać kod zgodny ze scenariuszami napisanymi w frameworku BDD zamiast pisać / rozwijać kod zgodnie z ich zrozumieniem.
# 4) Testowanie staje się ostrzejsze, czas spędzony na tworzeniu i późniejszym wykonywaniu testu zostaje zaoszczędzony, krytyczne defekty, zwłaszcza te, które mogą mieć wpływ na biznes, można znaleźć w samym interfejsie użytkownika.
# 5) Kod, dokumentacja związana z BDD jest łatwo zrozumiała i łatwa do utrzymania, ponieważ utrzymanie kodu nie wymaga żadnych innych wysiłków, ponieważ dokumenty i odpowiadający im kod są już powiązane. Stąd to, co jest wspomniane w dokumentacji, czyli scenariusze, będzie miało swój odpowiedni kod.
# 6) Ponieważ mamy bardzo łatwe do zrozumienia scenariusze, możemy łatwo podzielić je na zadania, podzadania itp. W logiczny sposób.
# 7) Zespół może być bardziej dynamiczny, zwinny, ponieważ z góry ma jasność co do scenariuszy, kryteriów akceptacji i prawie dokładnego oszacowania testu.
# 8) Bardzo dobra platforma dla New Joined do przygotowania istniejącego zespołu zarówno pod względem dokumentacji, jak i kodu ze względu na swoją prostotę.
# 9) Nie tylko pomaga w walidacji scenariuszy (głównie interfejsu użytkownika, związanych z zachowaniem), ale także pomaga w przypadkach testowych na poziomie jednostki.
# 10) Przydatne jest także śledzenie postępów zespołu od pierwszego dnia, ponieważ wymagania i scenariusze są jasno zdefiniowane (coś, co programiści zwykle mają trudności z zebraniem w TDD).
Dlatego wdrożenie BDD usuwa założenie, że „klient końcowy nie myśli o znaczeniu testowania”, „klient nie chce angażować się w czynności testowe” itp.
Narzędzia BDD
Istnieje kilka narzędzi testowych, które umożliwiają nam wdrożenie podejścia BDD.
Jak na przykład:
- Ogórek
- SpecFlow
- Jbehave
- Sałata
- Concordion
- FitNesse
- BeanSpec
- Łatwy B
- Jdave
- Givwenzen-flex
- GivWenZen
- Instynkt
- Szklanka do szklanki
- Ewangelizuj
- Spektakularny
- dSpec
- Okular
- stek
- JSSpec
Wśród powyższych narzędzi Jbehave działa dość podobnie do Cucumber, jednak różnią się one nieco implementacją.
JBEHAVE | OGÓREK |
---|---|
Obsługuje zewnętrzne źródła danych | Nie obsługuje zewnętrznych źródeł danych |
Obsługuje historie | Obsługuje funkcje |
Bardzo dobra dokumentacja | Brak standardowej dokumentacji |
Obsługuje stopnie złożone | Nie obsługuje stopni złożonych |
Nie tak elastyczny | Elastyczny w przekazywaniu parametrów |
Nie obsługuje tła | Obsługuje tło |
Niezbyt obszerne raporty | Lepsza elastyczność formatowania, wbudowane raporty |
Opracowany przy użyciu języka Java | Opracowany przy użyciu Rubiego |
Dlaczego ogórek?
Ogórek jest używany do pisania wszelkiego rodzaju przypadków testowych, zwłaszcza przypadków testowych na poziomie akceptacji (którymi użytkownicy końcowi są bardziej zaniepokojeni) napisanych w stylu behawioralnego rozwoju. Obsługuje parsery języka, takie jak Gherkin.
Pierwotnie Cucumber został napisany przy użyciu języka programowania Ruby i został opracowany specjalnie do testowania Ruby. Ale teraz jest obsługiwany przez inne języki programowania, takie jak Java.
Korniszon jest używany jako język, w którym przypadki testowe są pisane w prostym formacie, a także mogą być odczytywane i modyfikowane przez nietechnicznych użytkowników.
Oprócz angielskiego, Cucumber obsługuje również inne języki.
Jak działa ogórek?
Przechodząc do jego mechanizmu roboczego, najpierw pozwalamy użytkownikom (technicznym / nietechnicznym) pisać pożądane przypadki testowe (jako funkcje) przy użyciu składni Gherkin, po zakończeniu musimy upewnić się, że są zatwierdzeni, aby mogli przejść do Następny poziom.
Następnie musimy zaimplementować, tj. Napisać skrypty dla każdej linii (używając pliku stepdef), jak wspomniano w pliku funkcji. Po wdrożeniu kodów następną rzeczą byłoby uruchomienie skryptów (przy użyciu pliku runner).
Konfiguracja środowiska
Konfiguracja środowiska dla Cucumber jest nieco złożona w porównaniu z pracą z jakimkolwiek innym narzędziem, takim jak Eclipse lub jakimkolwiek innym IDE.
Wyzwania
Musimy się upewnić, że wersje słoików Cucumber są zgodne z zainstalowaną wersją Javy, a także IDE, w którym aktualnie pracujemy.
Ustawienia środowiskowe
# 1) Wtyczka Eclipse Cucumber : Pomaga Eclipse zrozumieć składnię Gherkina i podkreśla składnię pliku funkcji zamiast zwykłego tekstu.
Musimy iść do Eclipse >> Pomoc >> Zainstaluj nowe oprogramowanie >> Kliknij przycisk Dodaj >> Określ lokalizację tak jak to . Nazwa mówi „Ogórek”, a następnie kliknij OK i wykonaj resztę procesu instalacji.
W końcu zrestartuj IDE, czyli Eclipse.
#dwa) Użyj Mavena, aby mieć wszystkie pliki jar, tj. Zależności, wtyczki itp., Jak wspomniano poniżej.
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) Upewnij się, że wykonujemy Ctrl + s lub wykonujemy instalację Maven.
# 4) Następnie upewnij się, że wykonujesz kompilację Maven, aby uniknąć błędów związanych z zależnościami, aby później nie było żadnych błędów związanych z zależnościami, wtyczkami i wersjami.
Salesforce testowanie pytań i odpowiedzi do rozmowy kwalifikacyjnej pdf
# 5) Po wykonaniu powyższych czynności nasze środowisko jest gotowe.
Pisanie przypadków testowych przy użyciu ogórka
Ogórek zawiera następujące trzy pliki:
- Plik funkcji: Tutaj piszemy funkcje do przetestowania w formacie korniszona, tj. Dane kiedy wtedy. Możemy nawet uruchomić plik funkcji, aby wykonać skrypty testowe zapisane w pliku Stepdef.
- Plik Stepdef: Gdy plik Feature jest gotowy, każde zdanie z pliku Feature może być dalej implementowane w pliku Stepdef.
- Plik Runner: Ma to na celu wykonanie rzeczywistego skryptu testowego napisanego w pliku Stepdef, odwołując się do pliku funkcji. Oprócz tego ma wiele innych opcji dostosowywania, raportowania, selektywnego wykonywania itp.
Oto prosty przykład pliku 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 { }
Tworzenie plików dla ogórka
- Plik Stepdef - Src / test / java >> New >> Inne >> Ogórek >> Klasa StepDef.
- Plik funkcji - Projekt >> Nowy >> Plik >> podaj nazwę pliku z rozszerzeniem „.feature”.
- Plik Runner - Jest podobny do każdego innego tworzenia klas Javy, ale możemy wymagać zaimplementowania tutaj jakiejś metody.
Funkcje ogórka
Oto kilka podstawowych funkcji Ogórka, które zaimplementujemy w naszym skrypcie testowym.
# 1) Haczyki do ogórków
Są to bloki kodu uruchamianego przed lub po każdym scenariuszu. Abyśmy mogli je zdefiniować w dowolnym miejscu naszego projektu. Na przykład, Definicja kroku.
Zgodnie z definicją to tylko dwie adnotacje @After i @Before. W konsoli możemy zobaczyć, jak bloki są wykonywane i dają wyraźny wynik. Możemy również wykonać hooki dla określonych tagów.
# 2) Tagi ogórków
Są one zwykle używane w pliku funkcji do klasyfikowania scenariuszy w plikach funkcji zgodnie z podaną nazwą znacznika. W pliku funkcji możemy mieć wiele tagów dla danego scenariusza.
Tagi są definiowane przez użytkownika i możemy nadać im dowolną nazwę, na przykład @Smoke, @Regression itp.
# 3) Adnotacje ogórkowe
Są wbudowane w Ogórek. Zwykle tagi to @Given, @When, @Then.
Jednak później, jeśli zajdzie taka potrzeba, możemy stworzyć własną adnotację, a następnie użyć jej w naszym programie. Podczas wykonywania dopasowany kod kleju, tj. Funkcje są zapisywane w pliku Stepdef mającym @Given, @When, @Then zostaną wykonane.
# 4) Tło ogórka
Są to kroki lub seria kroków, które są wspólne dla wszystkich scenariuszy w pliku funkcji.
Pozwala nam na dodanie kontekstu do scenariuszy funkcji, w których jest zdefiniowana. Działa przed każdym scenariuszem funkcji, w której jest zdefiniowany.
# 5) Tabele danych ogórków
Cucumber ma funkcję obsługi testowania opartego na danych, co pozwala nam automatycznie wielokrotnie uruchamiać przypadek testowy z różnymi wartościami wejściowymi i walidacyjnymi dla danego skryptu.
Ogórek obsługuje tabelę danych. Pierwszy wiersz jest traktowany jako kolumna, a wiersze obok niego to dane dla skryptów.
# 6) Transpozycja ogórka
Jest to niewielka modyfikacja tabeli danych Ogórek. W tym przypadku pierwsza kolumna byłaby traktowana jako kolumna, a kolumny następne są traktowane jako dane dla skryptów.
# 7) Scenariusze wielu ogórków
Cucumber umożliwia nam testowanie wielu scenariuszy w jednym pliku funkcji.
# 8) Raportowanie ogórków
W przeciwieństwie do raportów i innych narzędzi innych firm, w przypadku których musimy dokonać konfiguracji, aby wyświetlić raporty.
W Cucumber mamy wbudowane wtyczki, takie jak pretty, JSON, HTML, XML, które dają nam kompleksowy raport z wykonania testów.
TestNG Z Ogórkiem
Nadal możemy wykonywać przypadki testowe JUnit napisane w Cucumber przy użyciu TestNG wykonując następujące czynności:
- Musimy dodać zależności do projektu Maven.
- Rozszerz klasę w klasie Runner jako moduł uruchamiający pakiet AbstractTestNGCucumberTests.
- Przekonwertuj projekt maven i dodaj pakiet (tam, gdzie istnieje klasa uruchamiająca).
Następnie możemy uruchomić cały przypadek testowy Cucumber jako TestNG i wygenerować raporty dotyczące tego samego (jeśli mamy słuchaczy).
W tym samouczku omówimy 3 różne przykłady ogórków, aby objąć powyższe koncepcje
Przykład 1
Obejmie haczyki, tagi, adnotacje, tło, wiele scenariuszy i TestNG z ogórkiem.
Po skonfigurowaniu środowiska testowego:
- Dodaj wtyczkę Eclipse Cucumber w Eclipse.
- Utwórz projekt Maven i dodaj do niego wszystkie wymagane zależności, a także dodaj zależność powiązaną z TestNG w Maven.
- Utwórz nowy plik funkcji.
- Dodaj wymaganą implementację w pliku Stepdef.
- Teraz utwórz plik runner z extends AbstractTestNGCucumberTests.
- Przekonwertuj projekt Maven na TestNG iw pliku testng.xml dodaj ścieżkę pakietu klasy Cucumber runner.
- Uruchom plik TestNG.xml.
Plik funkcji
Funkcja:
Jako użytkownik
Chcę mieć możliwość dodawania nowych klientów do systemu
Aby móc dodać dane księgowe dla tego klienta
Tło:
Biorąc pod uwagę, że jestem na stronie głównej Github
Kiedy określę nazwę użytkownika jako „xxxxxxxxxxxxxxxxxxxx” i hasło jako „xxx”
I kliknij przycisk Zaloguj się
@Palić
Scenariusz: Edycja profilu
Biorąc pod uwagę, że kliknąłem opcję Twój profil
Kiedy klikam przycisk edycji profilu
I przesłał nowe zdjęcie
Wtedy powinienem zobaczyć nowe zdjęcie profilowe
@Regression @Everytime
Scenariusz: Utwórz nową treść
Biorąc pod uwagę, że klikam opcję Your Gists
Kiedy podam nazwę pliku, opis
I kliknij Create public gist method
Wtedy powinienem zobaczyć nowy sens
Plik 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 } }
Oto wynik testu TestNG XML
Domyślny raport TestNG wygląda jak ten podany poniżej.
Przykład 2
Obejmie tabele danych i transpozycję.
Po skonfigurowaniu środowiska:
- Dodaj wtyczkę Eclipse Cucumber w Eclipse.
- Utwórz projekt Maven i dodaj do niego wszystkie wymagane zależności.
- Utwórz nowy plik funkcji.
- Dodaj wymaganą implementację w pliku stepdef.
- Wykonaj bezpośrednio z pliku funkcji, klikając prawym przyciskiem myszy plik >> Uruchom jako >> Cucumber.feature
Plik funkcji
Funkcja: Tytuł Twojej funkcji
Chcę użyć tego szablonu dla mojego pliku funkcji
Tło:
Biorąc pod uwagę, że jestem na stronie logowania do Gmaila
Kiedy określę nazwę użytkownika i hasło
I kliknij przycisk Zaloguj się
Scenariusz: Utwórz nową wiadomość z tabeli danych
Kiedy jestem na nowej stronie e-mail
I podaję następujące szczegóły
| To1 | Temat |
| Person1@email.com | Osoba1 temat |
| Person2@email.com | Temat osoby2 |
Scenariusz: Utwórz nową wiadomość z transponowanej tabeli danych
Kiedy jestem na nowej stronie e-mail
I podaję następujące szczegóły z tabeli transpozycji
| To1 | Person1@email.com | Person2@email.com |
| Temat | Osoba1 temat | Temat osoby2 |
Plik 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 }
Wynik : Tak więc powyższy przykład powinien zalogować się do Gmaila i wysłać dwa e-maile dla każdego scenariusza, który dotyczy tabeli danych i tabeli danych transponowanych.
Przykład 3
Obejmie raportowanie.
Po skonfigurowaniu środowiska:
- Dodaj wtyczkę Eclipse Cucumber w Eclipse.
- Utwórz projekt Maven i dodaj do niego wszystkie wymagane zależności.
- Utwórz nowy plik funkcji.
- Dodaj wymaganą implementację w pliku Stepdef.
- Utwórz klasę runner i wykonaj klasę runner.
- Wyświetl wszystkie rodzaje raportów.
Plik funkcji
Funkcja: Tytuł Twojej funkcji
Chcę użyć tego szablonu dla mojego pliku funkcji
@ tag1
Scenariusz: Tytuł twojego scenariusza
Biorąc pod uwagę, że jestem na stronie głównej Github
Kiedy określę nazwę użytkownika i hasło
I kliknij przycisk Zaloguj się
Wtedy powinienem być w stanie zobaczyć opcję wylogowania
Plik 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 } }
Oto różne typy raportów generowanych przez Cucumber:
Raport HTML
Ładny
Junit
Wniosek
Będąc narzędziem typu open source, Cucumber jest szeroko stosowany w BDD. Jest bardzo łatwy do zrozumienia i ma duży zakres w odniesieniu do nowych funkcji i praktycznie można zintegrować Cucumber z Selenium lub innymi narzędziami / słoikami stron trzecich itp.
Ponieważ ma aktywne grupy pomocy / członków, staje się naprawdę łatwe dla każdego, kto dopiero zaczął uczyć się ogórka lub dla tych, którzy mają średniozaawansowaną wiedzę w zakresie ogórka / BDD.
Cucumber dodatkowo wspiera integrację z arkuszem Excela i Jenkinsem.
rekomendowane lektury
- Cucumber Selenium Tutorial: Cucumber Java Selenium Integracja WebDriver
- Python DateTime Tutorial z przykładami
- Testowanie REST API z ogórkiem przy użyciu metody BDD
- Testowanie automatyzacji przy użyciu narzędzia Cucumber i selenu - samouczek dotyczący selenu nr 30
- Cucumber Gherkin Tutorial: Automatyzacja testów przy użyciu Gherkin
- Samouczek dotyczący skryptów powłoki Unix z przykładami
- Selenium Find Element By Text Samouczek z przykładami
- Słowo kluczowe „this” w języku Java: samouczek z przykładami kodu