tdd vs bdd analyze differences with examples
Цей посібник пояснює різницю між TDD та BDD на прикладах:
TDD або Test Driven Development та BDD або Behavioure Driven Development - це дві техніки розробки програмного забезпечення.
Перш ніж заглибитися глибше в різницю між цими двома, давайте спочатку зрозуміємо, що вони означають окремо і як вони використовуються?
Давайте розпочнемо!!
Запитання та відповіді на інтерв’ю .net
Що ви дізнаєтесь:
Що таке TDD?
TDD розшифровується як Test Driven Development. У цій техніці розробки програмного забезпечення ми спочатку створюємо тестові кейси, а потім пишемо код, що лежить в основі цих тестових кейсів. Хоча TDD - це техніка розробки, вона також може бути використана для розробки тестів автоматизації.
Командам, які впроваджують TDD, потрібно більше часу на розробку, однак вони, як правило, виявляють дуже мало дефектів. TDD призводить до поліпшення якості коду та коду, який є більш багаторазовим та гнучким.
TDD також допомагає досягти високого рівня покриття тесту приблизно 90-100%. Найбільш складним завданням для розробників після TDD є написання тестових кейсів перед написанням коду.
Пропоноване читання => Кращий посібник для написання чудових тестових справ
Процес TDD
Методологія TDD виконує дуже простий 6-етапний процес:
1) Напишіть тест-кейс: На основі вимог напишіть автоматизований тест.
2) Запустіть усі тести: Запустіть ці автоматизовані тестові приклади на розробленому в даний час коді.
3) Розробіть код для тестових випадків: Якщо тест не вдався, напишіть код, щоб цей тест працював належним чином.
4) Знову запустіть тестові кейси: Знову запустіть тестові кейси та перевірте, чи реалізовані всі розроблені на сьогодні тестові кейси.
5) Переробіть свій код: Це необов’язковий крок. Однак важливо переформатувати свій код, щоб зробити його більш читабельним та багаторазовим.
6) Повторіть кроки 1–5 для нових тестів: Повторюйте цикл для інших тестів, поки не будуть реалізовані всі тести.
Приклад реалізації тестового кейсу в TDD
Припустимо, що ми маємо вимогу розробити функцію входу для програми, яка має поля імені користувача та пароля та кнопку подати.
Крок 1: Створіть тест.
@Test Public void checkLogin(){ LoginPage.enterUserName('UserName'); LoginPage.enterPassword('Password'); HomePage homePage = LoginPage.submit(); Assert.assertNotNull(homePage); }
Крок 2: Запустіть цей тестовий кейс, і ми отримаємо повідомлення про помилку, що сторінка входу не визначена, і немає методів з іменами enterUserName, enterPassword і submit.
Крок 3: Розробіть код для цього тесту. Давайте напишемо базовий код, який введе ім’я користувача та пароль і отримає об’єкт домашньої сторінки, коли вони будуть правильними.
public class LoginPage{ String username; String password; //store username public void enterUserName(String username){ this.username = username; } //store password public void enterPassword(String password){ this.password = password; } //match username and passowrd in db and return home page public HomePage submit(){ if(username.existsInDB()){ String dbPassword = getPasswordFromDB(username); if(dbPassword.equals(password){ Return new HomePage(); } } }
Крок 4: Запустіть тест знову, і ми отримаємо екземпляр домашньої сторінки.
Крок 5: Давайте рефакторуємо код, щоб дати правильні повідомлення про помилки, якщо умови if у методі подання не відповідають дійсності.
//match username and passowrd in db and return home page public HomePage submit(){ if(username.existsInDB()){ String dbPassword = getPasswordFromDB(username); if(dbPassword.equals(password){ Return new HomePage(); } else{ System.out.println('Please provide correct password'); return; } } else{ System.out.println('Please provide correct username'); }
Крок 6: Тепер напишемо новий тестовий приклад із порожніми іменем користувача та паролем.
@Test Public void checkLogin(){ LoginPage.enterUserName(''); LoginPage.enterPassword(''); HomePage homePage = LoginPage.submit(); Assert.assertNotNull(homePage); }
Тепер, якщо ви спробуєте запустити цей тест, він не вдасться. Повторіть кроки 1–5 для цього тестового випадку, а потім додайте функціональність для обробки порожніх рядків імені користувача та пароля.
Що таке BDD?
BDD розшифровується як поведінковий розвиток. BDD - це розширення TDD, де замість того, щоб писати тестові кейси, ми починаємо з написання поведінки. Пізніше ми розробляємо код, який необхідний нашій програмі для виконання поведінки.
Сценарій, визначений у підході BDD, дозволяє розробникам, тестувальникам та бізнес-користувачам легко співпрацювати.
BDD вважається найкращою практикою в тому, що стосується автоматизоване тестування оскільки він фокусується на поведінці програми, а не на думках про реалізацію коду.
Поведінка програми є центром уваги в BDD, і вона змушує розробників та тестувальників входити у взуття замовника.
Процес BDD
Процес, задіяний у методології BDD, також складається з 6 етапів і дуже схожий на процес TDD.
1) Напишіть поведінку програми: Поведінка програми написана простою англійською мовою, як-от мова, власником продукту, бізнес-аналітиками чи службами контролю якості.
2) Напишіть автоматизовані сценарії: Потім ця проста англійська мова, як мова, перетворюється на тести програмування.
3) Впровадити функціональний код: Потім реалізується функціональний код, що лежить в основі поведінки.
4) Перевірте, чи поведінка успішна: Запустіть поведінку та перевірте, чи вона успішна. У разі успіху перейдіть до наступної поведінки, інакше виправте помилки у функціональному коді, щоб досягти поведінки програми.
5) Рефакторіть або впорядкуйте код: Переробіть або впорядкуйте свій код, щоб зробити його більш читабельним та повторним.
6) Повторіть кроки 1-5 для нової поведінки: Повторіть кроки, щоб застосувати більше поведінки у своєму додатку.
Також прочитайте => Як тестувальники залучаються до методів TDD, BDD та ATDD
Приклад реалізації поведінки в BDD
Припустимо, що ми маємо вимогу розробити функцію входу для програми, яка має поля імені користувача та пароля та кнопку подати.
Крок 1: Напишіть поведінку програми для введення імені користувача та пароля.
Scenario: Login check Given I am on the login page When I enter 'username' username And I enter 'Password' password And I click on the 'Login' button Then I am able to login successfully.
Крок 2: Напишіть сценарій автоматизованого тесту для цієї поведінки, як показано нижче.
@RunWith(Cucumber.class) public class MyStepDefinitions { @Steps LoginPage loginPage; @Steps HomePage hp; @Given('^I am on the login page $') public void i_am_on_the_login_page(){ loginPage.gotoLoginPage(); } @When('^I enter '((^')*)' username$') public void i_enter_something_username(String username) { loginPage.enterUserName(username); } @When('^I enter '((^')*)' password$') public void i_enter_something_password(String password) { loginPage.enterPassword(password); } @When('^I click on the '((^')*)' button$') public void i_click_on_the_submit_button(String strArg1) { hp = loginPage.submit(); } @Then('^I am able to login successfully.$') public void i_am_able_to_login_successfully() { Assert.assertNotNull(hp); } }
Крок 3: Впровадити функціональний код (Це схоже на функціональний код у прикладі TDD, крок 3).
public class LoginPage{ String username = ''; String password = ''; //store username public void enterUserName(String username){ this.username = username; } //store password public void enterPassword(String password){ this.password = password; } //match username and passowrd in db and return home page public HomePage submit(){ if(username.existsInDB()){ String dbPassword = getPasswordFromDB(username); if(dbPassword.equals(password){ Return new HomePage(); } } }
Крок 4: Запустіть таку поведінку та перевірте, чи вона успішна. Якщо це вдало, перейдіть до кроку 5, інакше налагодьте функціональну реалізацію та запустіть її знову.
Крок 5: Рефакторинг реалізації є необов’язковим кроком, і в цьому випадку ми можемо рефакторингувати код у методі подання, щоб надрукувати повідомлення про помилки, як показано на кроці 5 для прикладу TDD.
//match username and passowrd in db and return home page public HomePage submit(){ if(username.existsInDB()){ String dbPassword = getPasswordFromDB(username); if(dbPassword.equals(password){ Return new HomePage(); } else{ System.out.println('Please provide correct password'); return; } } else{ System.out.println('Please provide correct username'); }
Крок 6: Напишіть іншу поведінку та виконайте кроки 1–5 для цієї нової поведінки.
Ми можемо написати нову поведінку, щоб перевірити, чи не з’являється помилка за невведення імені користувача, як показано нижче:
Scenario: Login check Given I am on the login page And I click on the 'Login' button Then I get an error to enter username.
TDD проти BDD - ключові відмінності
TDD | BDD |
---|---|
Може бути кращим підходом для проектів, що включають API та сторонні інструменти. | Це може бути кращим підходом для проектів, які керуються діями користувача. Наприклад, веб-сайт електронної комерції, система додатків тощо. |
Стенди для тестової розробки. | Стенди розвитку поведінки. |
Процес починається з написання тестового кейсу. | Процес починається з написання сценарію відповідно до очікуваної поведінки. |
TDD фокусується на тому, як реалізована функціональність. | BDD фокусується на поведінці програми для кінцевого користувача. |
Тестові кейси написані мовою програмування. | Сценарії легше читати в порівнянні з TDD, оскільки вони написані в простому англійському форматі. |
Зміни в тому, як функції програми впливають на тестові випадки в TDD. | Зміни функціональних можливостей не сильно впливають на сценарії BDD. |
Співпраця потрібна лише між розробниками. | Потрібна співпраця між усіма зацікавленими сторонами. |
Деякі інструменти, які підтримують TDD, це: JUnit, TestNG, NUnit тощо. | Деякі інструменти, що підтримують BDD, - це SpecFlow, Cucumber, MSpec тощо. |
Тести з TDD можуть зрозуміти лише люди, які знають програмування, | Тести з BDD може зрозуміти будь-яка особа, включаючи тих, хто не знає програмування. |
TDD зменшує ймовірність помилок у ваших тестах. | Помилки в тестах важко відстежити в порівнянні з TDD. |
Висновок
Вибір між TDD проти BDD може бути дуже складним. Деякі можуть стверджувати, що BDD найкраще підходить для пошуку помилок, тоді як інші можуть просто сказати, що TDD забезпечує вищий рівень охоплення коду.
Жодна методологія не є кращою за іншу. Від людини та команди проекту залежить, яку методологію використовувати.
Ми сподіваємось, ця стаття зняла ваші сумніви щодо TDD проти BDD !!
Рекомендована література
- 180+ Приклади тестування веб-додатків (приклади контрольного списку)
- Як перевести випадки тестування вручну в сценарії автоматизації? - Покрокове керівництво з прикладом
- Тестові кейси Запитання для інтерв’ю: Напишіть тестові кейси на основі сценарію
- Як залучають тестери до методів TDD, BDD та ATDD
- Тестове покриття при тестуванні програмного забезпечення (поради щодо максимального охоплення тестуванням)
- 8 інструментів та механізмів тестування, що керуються найкращою поведінкою (BDD)
- Підручник із Specflow: Остаточний посібник із BDD Tool
- Як писати тестові справи: Остаточне керівництво з прикладами