Недавно я прочитал несколько статей о BDD
, чтобы понять, о чем идет речь. Теперь я получаю базовое понимание, но все еще не понимаю весь процесс.
Вот что я думаю сделать в процессе BDD:
Все заинтересованные стороны (BA, клиент, Dev, QA) собираются вместе, чтобы обсудить требования и написать согласованные функции на карточках историй. Здесь я беру в качестве примера функцию «регистрации пользователя»:
As a user, I want to register on the system, so that I can use its services
Создайте несколько сценариев в формате
Given/When/Then
, и вот один из них:Scenario: user successfully register Given an register page And an un-registered user When the user fills username "Jeff" and password "123456" And click on "Register" Then the user can see a "Success" message And the user "Jeff" is created in the system
Реализуйте этот сценарий с помощью какой-нибудь среды тестирования BDD, скажем, cucumber-jvm, например:
import cucumber.api.java.en.Given; public class Stepdefs { @Given("an register page") public void an_register_page throws Throwable { // ... } @Given("an un-registered user") public void an_register_page throws Throwable { // ... } // ... }
для шагов один за другим.
Но вскоре я оказываюсь в беде: есть страницы, модели, может быть, базы данных нужны для этого сценария, кажется, много чего нужно сделать.
Что мне теперь делать?
Что мне теперь делать? Нужно ли мне обсуждать этот сценарий со всеми заинтересованными сторонами? Что касается BA/Customer/QA
, я не думаю, что они действительно заботятся о реализации, не стоит ли обсудить это с другими разработчиками?
Предположим, после того, как я обсужу это с некоторыми другими разработчиками, мы договоримся разделить его на несколько небольших частей. Можем ли мы сделать эти небольшие части как «сценарии» с форматом Scenario/Given/When/Then
, как мы только что сделали с огурцом-jvm, или мы можем использовать JUnit, как мы обычно делаем в TDD?
1. If choose "cucumber-jvm", it seems a little heavy for small part
2. If choose JUnit, we need to involve more than one testing framework in a project
3. Is it the best if there is a single testing framework to do both things (not sure if there is)
Предположим, я выбираю вариант 2
, используя JUnit для небольших задач.
Вот что я буду делать после этого решения:
Теперь мы создаем новые небольшие тесты для управления реализациями, такими как создание пользователя в базе данных, как мы обычно делаем в TDD. (красный->зеленый->рефакторинг). И нас пока не волнует тест на огурец
Scenario: user successfully register
(который провален), просто оставьте его там. Правильно?Мы разрабатываем больше небольших тестов с помощью JUnit, сделали их красными -> зелеными -> отрефакторили. (И неполный тест на огурец всегда проваливается)
Пока не пройдены все маленькие тесты, переходим к тесту на огурец
Scenario: user successfully register
. Завершите его и убедитесь, что он наконец стал зеленым.Теперь разработаем другой сценарий, если несложно, то можем реализовать просто с огурцом, иначе придется его разбивать и писать несколько jUnit-тестов
Определенно есть много недоразумений, даже самых элементарных. Потому что я не вижу особой пользы от BDD, за исключением части «обсудить со всеми заинтересованными сторонами».
Где моя ошибка? Признателен за любые предложения!