bdd cucumber tutorial with examples
Цей поглиблений підручник з огірків обговорює BDD та його переваги, основу огірка, налаштування навколишнього середовища, створення тестового сценарію, особливості огірка, звіти тощо:
Огірок став дуже популярним, і зараз він широко використовується у галузі тестування програмного забезпечення.
Передумови - Призначені одержувачі повинні мати знання Scrum, Maven, TestNG тощо.
Що ви дізнаєтесь:
- Передумови BDD
- Переваги поведінкового розвитку (BDD)
- Інструменти BDD
- Чому огірок?
- Як працює огірок?
- Налаштування навколишнього середовища
- Написання тестових справ із використанням огірка
- Створення файлів для огірка
- Особливості огірка
- ТестNG з огірком
- Висновок
- Рекомендована література
Передумови BDD
У методології TDD Framework Agile ми зазвичай пишемо спочатку тестові кейси, а потім виконуємо їх. Це добре, щоб досягти випробувального покриття та переконатися, що збірка готова до виробництва.
Однак ми можемо вдосконалити структуру TDD, представивши тесту поведінку, особливості тощо, а потім виконати те саме. Це вдосконалення TDD називається BDD (Behaviour Driven Development).
Переваги поведінкового розвитку (BDD)
Деякі переваги використання BDD:
# 1) Скорочує розрив між зацікавленими сторонами бізнесу та технічною командою за допомогою спільної платформи. Отже, спілкування між колективом стає більш прозорим.
# два) Сценарії може писати кожен, включаючи людей з боку клієнта, члена бізнес-команди, керівництво тощо. Отже, вимоги та сценарії охоплюються.
# 3) Розробники напишуть код відповідно до сценаріїв, написаних у фреймворці BDD, замість того, щоб писати / розробляти код відповідно до їх розуміння.
# 4) Тестування стає чіткішим, час, витрачений на створення та подальше виконання тесту, економиться, критичні дефекти, особливо ті, які можуть вплинути на бізнес, можна знайти в самому інтерфейсі.
# 5) Кодекс, документація, що стосується BDD, є легко зрозумілою та доступною для обслуговування, оскільки для ведення коду не потрібно ніяких зусиль, оскільки документи та відповідний код вже пов'язані між собою. Отже, те, що згадується в документації, тобто сценарії, матиме відповідний код.
# 6) Оскільки у нас є дуже легкі зрозумілі сценарії, ми можемо легко їх розбити на завдання, підзавдання та ін. Логічно.
# 7) Команда може бути більш динамічною, спритною, оскільки існує чітка чіткість сценаріїв, критеріїв прийняття та майже точна оцінка тестів.
# 8) Дуже хороша платформа для New Joined, щоб підготуватися до існуючої команди як з точки зору документації, так і коду, через його простоту.
# 9) Це не тільки допомагає у валідації сценаріїв (переважно інтерфейсу користувача, пов’язаних із поведінкою), але також допомагає у тестових випадках на рівні модулів.
# 10) Крім того, корисно відстежувати прогрес команди з першого дня, оскільки вимоги та сценарії чітко визначені (те, що розробники зазвичай намагаються зібрати в TDD).
Отже, впровадження BDD виключає припущення, що «кінцевий клієнт не думає про важливість тестування», «клієнт не хоче брати участь у тестуванні» тощо.
Інструменти BDD
Існує кілька інструментів тестування, які дозволяють нам застосувати підхід BDD.
Як от:
- Огірок
- SpecFlow
- Jbehave
- Листя салату
- Злагода
- FitNesse
- BeanSpec
- Легко Б
- Джайв
- Givwenzen-flex
- GivWenZen
- Інстинкт
- Тумблер-скло
- Євангеліє
- Ефектний
- dSpec
- Характеристики
- Стейк
- JSSpec
Серед вищезазначених інструментів Jbehave працює досить схоже на Огірок, однак вони дещо відрізняються з точки зору їх реалізації.
JBEHAVE | ОГУР |
---|---|
Підтримує зовнішні джерела даних | Він не підтримує зовнішні джерела даних |
Підтримує історії | Підтримує функції |
Дуже хороша документація | Немає стандартної документації |
Підтримує складені кроки | Не підтримує складені сходинки |
Не так гнучко | Гнучкі параметри передачі |
Не підтримує фон | Підтримує фон |
Не такі обширні звіти | Краща гнучкість форматування, вбудовані звіти |
Розроблено за допомогою Java | Розроблено за допомогою Ruby |
Чому огірок?
Огірок використовується для написання всіх видів тестових кейсів, особливо тестових кейсів на рівні прийнятності (що стосується кінцевих користувачів), написаних у стилі поведінкової керованості. Він підтримує використання мовних синтаксичних аналізаторів, таких як Gherkin.
Спочатку Cucumber писався на мові програмування Ruby і був розроблений спеціально для тестування Ruby. Але зараз це підтримується іншими мовами програмування, такими як Java.
Корнішон використовується як мова, на якій тестові кейси написані у простому форматі, а також можуть бути прочитані та змінені нетехнічним користувачем.
Окрім англійської, Огірок підтримує й інші мови.
Як працює огірок?
Приступаючи до його робочого механізму, спочатку ми дозволяємо користувачам (технічним / нетехнічним) писати бажані тестові кейси (як функції), використовуючи синтаксис Геркіна, після цього нам потрібно переконатися, що вони схвалені, щоб вони могли перейти наступний рівень.
Після цього нам потрібно реалізувати, тобто написати сценарії для кожного рядка (використовуючи файл stepdef), як зазначено у файлі функцій. Після того, як коди будуть впроваджені, наступною справою буде запуск скриптів (за допомогою файлу запуску).
Налаштування навколишнього середовища
Налаштування навколишнього середовища для Огірка дещо складне порівняно з роботою з будь-яким іншим інструментом, таким як Eclipse або будь-яким іншим IDE.
Виклики
Потрібно переконатися, що версії банку Cucumber відповідають встановленій версії Java, а також IDE, в якому ми зараз працюємо.
Налаштування навколишнього середовища
# 1) Плагін огірка Eclipse : Це допомагає Eclipse зрозуміти синтаксис огірків і виділяє синтаксис файлу об’єктів замість простого тексту.
Нам потрібно піти в Eclipse >> Довідка >> Встановити нове програмне забезпечення >> Натисніть кнопку Додати >> Вкажіть місце як це . У назві написано “Огірок”, а потім натисніть кнопку ОК і дотримуйтесь решти процесу інсталяції.
Нарешті перезапустіть IDE, тобто Eclipse.
# два) Використовуйте Maven, щоб мати усі банки, тобто залежності, плагіни тощо, як зазначено нижче.
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) Переконайтеся, що ми робимо або Ctrl + s, або виконуємо встановлення Maven.
# 4) Після цього обов’язково виконайте збірку Maven, щоб уникнути помилок, пов’язаних із залежностями, щоб згодом у нас не було помилок залежностей, плагінів та невідповідностей версій.
Як відкрити SWF-файл в Chrome - -
# 5) Після виконання вищевказаних кроків наше середовище готове.
Написання тестових справ із використанням огірка
Огірок містить такі три файли:
- Файл функції: Тут ми пишемо особливості, які потрібно протестувати у форматі корнішона, тобто, коли дається тоді. Ми навіть можемо запустити файл функції для виконання тестових сценаріїв, записаних у файлі Stepdef.
- Файл Stepdef: Після того, як файл Feature готовий, кожне речення файлу Feature може бути надалі реалізовано над файлом Stepdef.
- Файл бігуна: Це просто для того, щоб виконати власне тестовий скрипт, написаний над файлом Stepdef, посилаючись на файл функції. Окрім цього, він має безліч інших варіантів налаштування, звітності, вибіркового виконання тощо.
Ось простий приклад файлу 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 { }
Створення файлів для огірка
- Файл Stepdef - Src / test / java >> Нове >> Інше >> Огірок >> Клас StepDef.
- Файл функції - Проект >> Новий >> Файл >> вкажіть ім'я файлу з розширенням як '.feature'.
- Файл бігуна - Це схоже на будь-яке інше створення класу Java, але нам може знадобитися впровадження певного методу тут.
Особливості огірка
Ось деякі основні особливості огірка, які ми будемо реалізовувати в нашому тестовому сценарії.
# 1) Огіркові гачки
Це блоки коду, який запускається до або після кожного сценарію. Щоб ми могли визначити їх у будь-якому місці нашого проекту. Наприклад, Визначення кроку.
Відповідно до визначення, це лише дві анотації @After і @Before. У консолі ми бачимо, як блоки виконуються і дають чіткі результати. Ми також можемо виконати гачки для певних тегів.
# 2) Огіркові теги
Зазвичай вони використовуються над файлом об’єктів для класифікації сценаріїв над файлами об’єктів відповідно до їх названого тегу. У файлі функції ми можемо мати кілька тегів для даного сценарію.
Теги визначаються користувачем, і ми можемо дати їм будь-яке ім'я, наприклад @Smoke, @Regression тощо.
# 3) Анотації огірків
Вони вбудовані в огірок. Зазвичай теги @Given, @When, @Then.
Однак пізніше, якщо нам потрібно, ми можемо створити власну анотацію, а потім використовувати її в нашій програмі. Під час виконання, відповідний код клею, тобто функції записуються у файл Stepdef, що має @Given, @When, @Then буде виконано.
# 4) Огірковий фон
Це кроки або низка кроків, які є загальними для всіх сценаріїв у файлі функції.
Це дозволяє нам додати деякий контекст до сценаріїв для функції, де вона визначена. Він запускається перед кожним сценарієм для функції, в якій він визначений.
# 5) Таблиці даних огірків
Огірок має функцію підтримки тестування на основі даних, що дозволяє нам автоматично запускати тест кілька разів з різними значеннями введення та перевірки для даного сценарію.
Огірок підтримує таблицю даних. Перший рядок розглядається як стовпець, а рядки поруч із ним - це дані для сценаріїв.
# 6) Транспортування огірків
Це невелика модифікація таблиці даних 'Огірок'. Тут перший стовпець буде розглядатися як стовпець, а наступні - як дані для сценаріїв.
# 7) Багато сценаріїв огірка
Огірок дозволяє нам проводити тестування декількох сценаріїв в одному файлі функцій.
# 8) Звітування щодо огірків
На відміну від звітування та інших сторонніх інструментів, де нам потрібно виконати певну конфігурацію для перегляду звітів.
Тут, у Cucumber, у нас є вбудовані плагіни, такі як досить, JSON, HTML, XML, які дають нам вичерпний звіт про виконання тесту.
ТестNG з огірком
Ми все ще можемо виконувати тестові кейси JUnit, написані на Cucumber, використовуючи TestNG наступним чином:
- Нам потрібно додати залежності до проекту Maven.
- Розширте клас у класі Runner як AbstractTestNGCucumberTests пакунок runner.
- Перетворіть проект maven і додайте пакет (там, де існує клас runner).
Після цього ми можемо запустити весь тест на Огірок як TestNG і створити звіти, що стосуються цього (якщо у нас є слухачі).
У цьому підручнику ми обговоримо 3 різні приклади огірка, щоб охопити вищезазначені поняття
Приклад 1
Він охоплюватиме гачки, мітки, анотації, фон, кілька сценаріїв та TestNG з огірком.
Після налаштування тестового середовища:
- Додайте плагін Eclipse Cucumber в Eclipse.
- Створіть проект Maven і додайте до нього всі необхідні залежності, а також додайте залежність, пов’язану з TestNG, у Maven.
- Створіть новий файл функцій.
- Додайте необхідну реалізацію для нього у файл Stepdef.
- Тепер створіть файл запуску з розширенням AbstractTestNGCucumberTests.
- Перетворіть проект Maven на TestNG і в testng.xml додайте шлях до пакету класу бігуна Cucumber.
- Запустіть файл TestNG.xml.
Файл функції
Характеристика:
Як користувач
Я хочу мати можливість додавати нових клієнтів у систему
Так що я можу додати бухгалтерські дані для цього клієнта
Передумови:
Враховуючи, що я перебуваю на домашній сторінці Github
Коли я вказую Ім'я користувача як 'xxxxxxxxxxxxxxxxxxxx', а Пароль як 'xxx'
І натисніть на кнопку Увійти
@Smoke
Сценарій: Редагування профілю
Враховуючи, що я натискаю опцію Ваш профіль
Коли я натискаю кнопку редагувати профіль
І завантажив нове зображення
Тоді я мав би бачити нове зображення профілю
@Regression @Everytime
Сценарій: Створіть новий суть
Враховуючи, що я натискаю опцію Ваші сутності
Коли я вказую ім'я файлу, опис
І натисніть на Створити загальнодоступний метод
Тоді я мав би побачити нову суть
Файл 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 } }
Ось результат тестування TestNG XML
Звіт про TestNG за замовчуванням виглядає як поданий нижче.
Приклад 2
Він буде охоплювати таблиці даних і транспонувати.
Після налаштування середовища:
- Додайте плагін Eclipse Cucumber в Eclipse.
- Створіть проект Maven і додайте до нього всі необхідні залежності.
- Створіть новий файл функцій.
- Додайте необхідну реалізацію для цього у файл stepdef.
- Виконайте безпосередньо з файлу функції, клацнувши правою кнопкою миші на файлі >> Запустити як >> Cucumber.feature
Файл функцій
Характеристика: Назва вашої функції
Я хочу використовувати цей шаблон для мого файлу функцій
Передумови:
Враховуючи, що я перебуваю на сторінці входу в Gmail
Коли я вказую ім’я користувача та пароль
І натисніть на кнопку Увійти
Сценарій: Створити нове повідомлення з таблиці даних
Коли я переходжу на сторінку нової електронної пошти
І я вказую такі деталі
| До1 | Тема |
| Person1@email.com | Особа1 суб'єкт |
| Person2@email.com | Особа2 суб'єкт |
Сценарій: Створити нове повідомлення з транспонованої таблиці даних
Коли я переходжу на сторінку нової електронної пошти
І я вказую наступні деталі з таблиці транспонування
| До1 | Person1@email.com | Person2@email.com |
| Тема | Особа1 суб'єкт | Особа2 суб'єкт |
Файл 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 }
Вихідні дані : Отже, наведений вище приклад повинен увійти в Gmail і надіслати два електронні листи для кожного сценарію, що стосується таблиці даних та таблиці транспонованих даних.
Приклад 3
Це буде охоплювати звітність.
Після налаштування середовища:
- Додайте плагін Eclipse Cucumber в Eclipse.
- Створіть проект Maven і додайте до нього всі необхідні залежності.
- Створіть новий файл функцій.
- Додайте необхідну реалізацію для нього у файл Stepdef.
- Створіть клас бігуна та запустіть клас бігуна.
- Перегляньте всі типи звітів.
Файл функції
Характеристика: Назва вашої функції
Я хочу використовувати цей шаблон для мого файлу функцій
@ тег1
Сценарій: Назва вашого сценарію
Враховуючи, що я перебуваю на домашній сторінці Github
Коли я вказую ім’я користувача та пароль
І натисніть на кнопку Увійти
Тоді я повинен бачити опцію виходу
Файл 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 } }
Ось різні типи звітів, які створює Огірок:
Звіт HTML
Гарненько
Джуніт
Висновок
Будучи інструментом з відкритим кодом, Огірок широко використовується в BDD. І це дуже легко зрозуміти, і він має багато можливостей щодо нових функцій, і практично можливо інтегрувати огірок із селеном або будь-якими іншими сторонніми інструментами / банками тощо.
Оскільки в ньому є активні довідкові групи / члени, це справді стає легким для тих, хто тільки почав вивчати огірок, або для тих, хто має середні знання з огірка / BDD.
Огірок надалі підтримує інтеграцію з Excel-листком та Jenkins.
Рекомендована література
- Підручник з огірка селену: інтеграція огірка Java Selenium WebDriver
- Підручник з Python DateTime із прикладами
- Тестування REST API на огірках із використанням підходу BDD
- Тестування автоматизації за допомогою інструменту огірок та селен - Підручник No30
- Підручник з огірків огірків: Тестування автоматизації з використанням огірка огірка
- Підручник зі створення сценаріїв Unix Shell із прикладами
- Знайти елемент селену за допомогою підручника з тексту з прикладами
- Ключове слово Java 'this': Підручник із прикладами коду