bdd cucumber tutorial with examples
Овај продубљени водич за краставац расправља о БДД-у и његовим предностима, оквиру краставца, поставкама околине, стварању тест скрипте, карактеристикама краставца, извештајима итд.:
Краставац је постао веома популаран и сада се широко користи у индустрији за тестирање софтвера.
Предуслови - Примаоци којима је намењен треба да имају знање о Сцрум-у, Мавену, ТестНГ-у итд.
Шта ћете научити:
- Позадина БДД-а
- Предности развоја вођеног понашањем (БДД)
- БДД алати
- Зашто краставац?
- Како функционише краставац?
- Подешавања животне средине
- Писање тест случајева помоћу краставца
- Креирање датотека за краставац
- Краставци Карактеристике
- ТестНГ са краставцем
- Закључак
- Препоручено читање
Позадина БДД-а
У ТДД Фрамеворк оф Агиле методологији обично прво напишемо тест случајеве, а затим их извршимо. Ово је добро да се постигне покривеност тестом и осигура да је верзија спремна за производњу.
Међутим, ТДД оквир можемо побољшати увођењем понашања, карактеристика итд. У тест, а затим извршити исти. Ово побољшање ТДД-а назива се БДД (Бехавиоур Дривен Девелопмент).
Предности развоја вођеног понашањем (БДД)
Неке предности употребе БДД-а су:
# 1) Премошћује јаз између пословних актера и техничког тима кроз заједничку платформу. Стога комуникација међу тимом постаје транспарентнија.
#два) Сценарије може да напише свако, укључујући људе са стране клијента, члана пословног тима, управе итд. Стога се захтеви и сценарији покривају.
# 3) Програмери ће написати код у складу са сценаријима написаним у БДД оквиру уместо да пишу / развијају код према њиховом разумевању.
# 4) Тестирање постаје оштрије, штеди се време проведено у стварању и наредном извршавању теста, а критични недостаци, посебно они који могу утицати на пословање, могу се наћи на самом предњем крају.
# 5) Кодекс, документација која се односи на БДД лако је разумљива и одржива јер није потребан никакав други напор да би се код одржавао јер су документи и одговарајући код већ повезани. Стога ће оно што се помиње у документацији, тј. Сценарији, имати одговарајући код.
# 6) Будући да имамо врло лако разумљиве сценарије, лако их можемо логички разбити на задатке, под-задатке итд.
# 7) Тим може бити динамичнији, спретнији јер постоји јасна јасност у вези са сценаријима, критеријумима прихватања и готово тачном проценом теста.
# 8) Веома добра платформа за Нев Јоинед да се дотјера са постојећим тимом и у погледу документације и кода због своје једноставности.
# 9) Не само да помаже у валидацији сценарија (углавном корисничког интерфејса, везаног за понашање), већ помаже и у тестним случајевима на нивоу јединице.
# 10) Такође, корисно је пратити напредак тима од првог дана, јер су захтеви и сценарији јасно дефинисани (нешто што се програмери обично труде да прикупе у ТДД).
Отуда примена БДД уклања претпоставку да „крајњи клијент не размишља о важности тестирања“, „клијент не жели да се укључује у активности тестирања“ итд.
БДД алати
Постоји неколико алата за тестирање који нам омогућавају да применимо БДД приступ.
Као такав:
- Краставац
- СпецФлов
- Јбехаве
- Зелена салата
- Цонцордион
- ФитНессе
- БеанСпец
- Лако Б.
- Јдаве
- Гиввензен-флек
- ГивВенЗен
- Инстинкт
- Тумблер-стакло
- Госпецифи
- Спектакуларно
- дСпец
- Спецификације
- Шницла
- ЈССпец
Међу горе наведеним алатима, Јбехаве делује прилично слично краставцу, међутим, они се мало разликују у погледу њихове примене.
ЈБЕХАВЕ | КРАСТАВАЦ |
---|---|
Подржава спољне изворе података | Не подржава екстерне изворе података |
Подржава приче | Подржава функције |
Врло добра документација | Нема стандардне документације |
Подржава композитне кораке | Не подржава сложене кораке |
Није тако флексибилан | Флексибилни пролазни параметри |
Не подржава позадину | Подржава позадину |
Не тако опсежни извештаји | Боља флексибилност форматирања, уграђени извештаји |
Развијено коришћењем Јаве | Развијено помоћу Руби-а |
Зашто краставац?
Краставац се користи за писање свих врста тест случајева, посебно тест случајева на нивоу прихватљивости (око којих су крајњи корисници више забринути) написаних у стилу бихевиоралног развоја. Подржава употребу језичких парсера као што је Гхеркин.
Првобитно је Цуцумбер написан користећи програмски језик Руби и развијен је посебно за тестирање Руби-а. Али сада је подржавају и други програмски језици као што је Јава.
Корнишон се користи као језик на којем су тест примери написани у једноставном формату, а нетехнички корисник такође може да их чита и мења.
Поред енглеског, краставац подржава и друге језике.
Како функционише краставац?
Доласком до његовог радног механизма, прво допуштамо корисницима (техничким / нетехничким) да напишу своје жељене тестове (као карактеристике) користећи Гхеркин синтаксу, након што се то уради морамо бити сигурни да су одобрени како би могли да оду следећи ниво.
После тога треба да имплементирамо тј. Напишемо скрипте за сваки ред (користећи степдеф датотеку) како је поменуто у датотеци карактеристика. Једном када се кодови имплементирају, следећа ствар би била покретање скрипти (користећи датотеку покретача).
Подешавање окружења
Подешавање окружења за краставац је мало сложено у поређењу са радом са било којим другим алатом као што је Ецлипсе или било који други ИДЕ.
Изазови
Морамо да се побринемо да се верзије Цуцумбер теглица подударају са инсталираном Јава верзијом, као и са ИДЕ-ом у коме тренутно радимо.
Подешавања животне средине
# 1) Додатак за краставце Ецлипсе : Помаже Ецлипсеу да разуме синтаксу Гхеркин-а и истиче синтаксу датотеке својстава уместо обичног текста.
Морамо да идемо у Ецлипсе >> Помоћ >> Инсталирање новог софтвера >> Кликните на дугме Додај >> Одредите локацију као ово . Име каже „Краставац“, а затим кликните на ОК и следите поступак инсталације остатка.
Напокон поново покрените свој ИДЕ, тј. Ецлипсе.
#два) Користите Мавен да бисте имали све тегле, тј. Зависности, додатке итд., Као што је поменуто у наставку.
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) Обавезно радимо или Цтрл + с или изводимо Мавен инсталацију.
# 4) После тога обавезно изведите Мавен буилд да бисте избегли било какву грешку повезану са зависношћу како не бисмо касније имали грешку у зависности, додатку или верзији.
разлика између тестирања беле кутије и црне кутије
# 5) Једном када се заврше горњи кораци, наше окружење је спремно.
Писање тест случајева помоћу краставца
Краставац укључује следеће три датотеке:
- Датотека функције: Овде пишемо карактеристике које ће се тестирати у Гхеркин формату, тј. С обзиром на то када. Можемо чак и да покренемо датотеку функције да бисмо извршили тест скрипте написане у датотеци Степдеф.
- Степдеф датотека: Једном када је датотека Феатуре спремна, свака реченица датотеке Феатуре може се даље имплементирати преко датотеке Степдеф.
- Датотека тркача: Ово је само за извршавање стварне пробне скрипте написане преко датотеке Степдеф позивањем на датотеку карактеристика. Поред тога, има много других могућности за прилагођавање, извештавање, селективно извршавање итд.
Ево једноставног примера датотеке Руннер
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 { }
Креирање датотека за краставац
- Степдеф датотека - Срц / тест / јава >> Ново >> Остало >> Краставац >> СтепДеф класа.
- Датотека карактеристика - Пројекат >> Ново >> Датотека >> наведите име датотеке са наставком као ‘.феатуре’.
- Датотека тркача - Слично је било којој другој креацији Јава класе, али можда ће бити потребно да овде применимо неки метод.
Краставци Карактеристике
Ево неких основних карактеристика краставца које ћемо применити у нашем тестном скрипту.
# 1) Кукице краставца
То су блокови кода који се покрећу пре или после сваког сценарија. Тако да их можемо дефинисати било где у нашем пројекту. На пример, Дефиниција корака.
Према дефиницији, ово су само две напомене @Афтер и @Бефоре. У конзоли можемо видети како се блокови извршавају и дају јасне резултате. Такође можемо извршити куке за одређене ознаке.
# 2) Ознаке краставаца
Они се обично користе преко датотеке особина за класификацију сценарија над датотекама карактеристика према датом имену ознаке. Можемо имати више ознака за дати сценарио у датотеци обележја.
Ознаке су дефинисане од стране корисника и можемо им дати било које име, на пример @ Смоке, @Регрессион итд.
# 3) Биљешке краставаца
Они су уграђени у краставац. Обично су ознаке @Гивен, @Вхен, @Тхен.
Међутим, касније, ако затреба, можемо створити сопствену напомену, а затим је користити у нашем програму. Током извршавања, одговарајући код лепка, тј. Функције су записане у датотеци Степдеф која има @Гивен, @Вхен, @Тхен.
# 4) Позадина краставца
То су кораци или низови корака који су заједнички свим сценаријима у датотеци обележја.
Омогућава нам да сценаријима за функцију тамо где је дефинисана додамо неки контекст. Покреће се пре сваког сценарија за функцију у којој је дефинисана.
# 5) Табеле података о краставцима
Краставац има функцију која подржава тестирање на основу података, што нам омогућава да аутоматски покренемо тест случај више пута са различитим вредностима уноса и провере ваљаности за дату скрипту.
Краставац подржава табелу података. Први ред се сматра колоном, а редови поред њега су подаци за скрипте.
# 6) Транспозиција краставца
Ово је незнатна модификација табеле података о краставцима. Овде би се прва колона сматрала колоном, а следеће колоне као подаци за скрипте.
# 7) Више сценарија са краставцима
Краставац нам омогућава да тестирамо више сценарија у једној датотеци карактеристика.
# 8) Извештавање краставаца
За разлику од извештавања и других независних алата где морамо да извршимо одређену конфигурацију да бисмо видели извештавање.
Овде у Цуцумбер имамо уграђене додатке као што су претти, ЈСОН, ХТМЛ, КСМЛ који нам дају свеобухватан извештај о извршењу теста.
ТестНГ са краставцем
Још увек можемо да извршимо ЈУнит тест случајеве написане у Краставцу помоћу ТестНГ-а пратећи:
- Морамо додати зависности пројекту Мавен.
- Проширите класу у класи Руннер као АбстрацтТестНГЦуцумберТестс пакет тркач.
- Конвертујте мавен пројекат и додајте пакет (тамо где постоји класа тркача).
После тога, можемо покренути читав тест случаја Краставац као ТестНГ и генерисати извештаје који се односе на исти (ако имамо слушаоце).
У овом упутству ћемо размотрити 3 различита примера краставца како бисмо покрили горње концепте
Пример 1
Обухватаће куке, ознаке, напомене, позадину, више сценарија и ТестНГ са краставцем.
Једном када се постави тест окружење:
- Додајте додатак Ецлипсе Цуцумбер у Ецлипсе.
- Направите Мавен пројекат и додајте му све потребне зависности, а такође додајте зависност повезану са ТестНГ у Мавен.
- Направите нову датотеку са карактеристикама.
- Додајте потребну имплементацију за то у датотеку Степдеф.
- Сада креирајте датотеку покретача са проширењима АбстрацтТестНГЦуцумберТестс.
- Конвертујте пројекат Мавен у ТестНГ и у тестнг.кмл додајте путању пакета класе тркача краставаца.
- Покрените датотеку ТестНГ.кмл.
Датотека карактеристика
Одлика:
Као корисник
Желим да могу да додам нове клијенте у систем
Тако да могу додати рачуноводствене податке за тог клијента
Позадина:
С обзиром на то да сам на Гитхуб почетној страници
Када наведем корисничко име као „кккккккккккккккккккк“, а лозинку као „ккк“
И кликните на дугме Пријави се
@Смоке
Сценарио: Уређивање профила
С обзиром да кликнем на опцију Ваш профил
Када кликнем на дугме за уређивање профила
И отпремио нову слику
Тада бих требао да видим нову слику профила
@Регрессион @Еверитиме
Сценарио: Направите нову суштину
С обзиром да кликнем на опцију Иоур Гистс
Када наведем назив датотеке, опис
И кликните на Цреате публиц гист метход
Тада бих требао да видим нову суштину
Степдеф датотека
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 } }
Ево резултата теста ТестНГ КСМЛ
Подразумевани ТестНГ извештај изгледа као онај дат у наставку.
Пример 2
Обухватаће табеле података и транспоновати.
Једном када је окружење постављено:
- Додајте додатак Ецлипсе Цуцумбер у Ецлипсе.
- Направите Мавен пројекат и додајте му све потребне зависности.
- Направите нову датотеку са карактеристикама.
- Додајте потребну имплементацију за то у степдеф датотеку.
- Извршите директно из датотеке са карактеристикама десним кликом на датотеку >> Покрени као >> Цуцумбер.феатуре
Датотека карактеристика
Одлика: Наслов ваше функције
Желим да користим овај образац за своју датотеку карактеристика
Позадина:
С обзиром да се налазим на Гмаил страници за пријављивање
Када наведем корисничко име и лозинку
И кликните на дугме Пријави се
Сценарио: Направите нову поруку из табеле података
Када се нађем на страници нове е-поште
И прецизирам следеће детаље
|. | То1 | Предмет |
|. | Персон1@емаил.цом | Особа1 субјекат |
|. | Персон2@емаил.цом | Персон2 субјецт |
Сценарио: Направите нову поруку из транспоноване табеле података
Када се нађем на страници нове е-поште
И наводим следеће детаље из табеле за транспоновање
|. | То1 | Персон1@емаил.цом | Персон2@емаил.цом |
|. | Предмет | Особа1 субјекат | Персон2 субјецт |
Степдеф датотека
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 }
Оутпут : Дакле, горњи пример ће се пријавити на Гмаил и послати две е-поште за сваки сценарио који је за табелу података и табелу транспонованих података.
Пример 3
Обухватиће извештавање.
Једном када је окружење постављено:
- Додајте додатак Ецлипсе Цуцумбер у Ецлипсе.
- Направите Мавен пројекат и додајте му све потребне зависности.
- Направите нову датотеку са карактеристикама.
- Додајте потребну имплементацију за то у датотеку Степдеф.
- Направите класу тркача и извршите класу тркача.
- Погледајте све врсте извештаја.
Датотека карактеристика
Одлика: Наслов ваше функције
Желим да користим овај образац за своју датотеку карактеристика
@ таг1
Сценарио: Наслов вашег сценарија
С обзиром на то да сам на Гитхуб почетној страници
Када наведем корисничко име и лозинку
И кликните на дугме Пријави се
Тада бих требао да видим опцију одјаве
Степдеф датотека
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 } }
Ево различитих типова извештаја које генерише краставац:
ХТМЛ извештај
Прилично
Јунит
Закључак
Као алат отвореног кода, краставац се широко користи у БДД-у. И то је врло лако разумети и има пуно домета с обзиром на нове функције и практично је могуће интегрисати Краставац са селеном или било којим другим алаткама / теглицама треће стране итд.
Будући да има активне групе за помоћ / чланове, заиста постаје лако свима који су тек почели да уче краставац или онима који имају средње знање о краставцу / БДД.
Краставац даље подржава интеграцију са екцел листом и Јенкинс-ом.
Препоручено читање
- Водич за краставац селенијум: Интеграција Јава Селениум ВебДривер краставца
- Питхон ДатеТиме Водич са примерима
- РЕСТ АПИ тестирање са краставцем применом БДД приступа
- Испитивање аутоматизације помоћу алата за краставце и селена - Туториал бр. 30
- Водич за краставце краставце: краставац, испитивање аутоматизације
- Водич за скрипте за Уник Схелл са примерима
- Водич за текст помоћу примера за проналажење елемента селена
- Јава 'тхис' кључна реч: Водич са примерима кода