BDD: Начало работы

9

Я начинаю с BDD, и это моя история:

Feature: Months and days to days
    In order to see months and days as days
    As a date conversion fan
    I need a webpage where users can enter
    days and months and convert them to days.

У меня есть некоторые сомнения ...

Должен ли я написать свои сценарии перед тем, как что-то кодировать, или я должен сначала написать сценарий, а затем написать код, написать сценарий снова, а затем написать код и так далее ...?

Если я должен написать свои сценарии раньше, могут ли мои шаги быть утверждены, а рабочий код все еще не выполнен?

Когда мне следует выполнить рефакторинг моего кода? После того, как функция сделана или после реализации каждого сценария?

Thom
источник
"Могут ли мои шаги быть одобрены, а производственный код все еще не выполнен?" Что это значит? Пожалуйста, объясни.
С.Лотт

Ответы:

12

Из этой истории я делаю вывод, что вы пишете код самостоятельно.

Обычно целью BDD является обеспечение диалога, особенно между бизнесом и разработчиками, чтобы команда могла быть уверена, что они достигли общего понимания. Нам также нравится включать тестеров, потому что они могут определить, когда мы пропустили сценарии.

Если вы делаете это самостоятельно, возьмите резиновую утку и объясните утке поведение вашего приложения. Приведите несколько примеров того, как это должно работать. Это будут ваши сценарии.

Для начала я бы предложил не автоматизировать эти сценарии. Вы можете записать их, если хотите. Помните, что бизнес-результаты, которыми вы поделились с уткой, находятся на подходящем уровне, чтобы сформулировать их. Теперь вы должны иметь представление о том, как работает приложение, и вы можете выполнить сценарии вручную. Мне нравится относиться ко всему, что еще не работает, как к ошибке . Я бы иногда начал с автоматизацией, но только тогда , когда я очень хорошо знаю , как работает система, я знаком с инструментами, а пользовательский интерфейс хорошо понимают. Даже тогда мне часто приходится немного переделывать, когда я пишу код.

На более низком уровне расскажите своей утке, как будет вести себя каждый класс. Приведите несколько примеров. Резиновые утки прекрасно понимают технический язык. Теперь у вас есть BDD на уровне юнитов, или юнит-тесты. Цикл красно-зеленого-рефактора происходит здесь. (Мне больше не нужно много заниматься рефакторингом, потому что я думаю об обязанностях моих классов, формулирую их на бизнес-ориентированном языке, и в любом случае это имеет тенденцию выпадать довольно красиво. Но я Я делаю это некоторое время. Это нормально, если вы делаете.)

Не рефакторинг это слишком много. Мы по-прежнему хотим получать отзывы о нашем коде, потому что всегда есть вещи, о которых мы не знаем, которых мы не знаем . Совершенство - твой враг здесь. Сделайте это достаточно хорошо, сделайте его читабельным, затем двигайтесь дальше. Если вам нужно сделать что-то совершенное, чтобы внести дальнейшие изменения, делайте это, когда вносите дополнительные изменения.

Если у вас есть возможность получить отзывы о ваших сценариях от заинтересованных сторон бизнеса, но они не находятся рядом с вами, вы можете отправить им сценарии сразу после того, как вы их написали, и до того, как автоматизировать их. Возможно, вы захотите отправить макет пользовательского интерфейса, чтобы они могли соотносить слова с действиями. Не слишком далеко впереди кодирования с этим. Работайте с предположением, что то, что вы уже сделали, неправильно , и вам нужно получить обратную связь, чтобы узнать, как это сделать.

Как последний совет, обычно не формулируйте истории с точки зрения пользователя (сценарии, да, но не истории). Это не пользовательские истории. Вероятно, следует читать что-то вроде:

In order to attract people to my website
As @thom
I want users to easily convert months and days to days.

В любом случае, вы ищете цель более высокого уровня. Это также поможет вам извлечь необходимые возможности. Удачи с этим, и извинения за очень длинный пост.

Lunivore
источник
1
Часть «резиновой утки» великолепна. Я думал, что я единственный, кто подумает об этом!
NoChance
3

Должен ли я написать свои сценарии перед тем, как что-то кодировать, или я должен сначала написать сценарий, а затем написать код, написать сценарий снова, а затем написать код и так далее ...?

Оба будут работать. Выбери один.

Это не имеет большого значения.

Чем больше сценариев у вас есть, тем больше дизайна вы можете сделать заранее.

Чем больше сценариев у вас есть, тем больше времени требуется, чтобы что-то сделать.

Когда мне следует выполнить рефакторинг моего кода? После того, как функция сделана или после реализации каждого сценария?

Нет. Вы выполняете рефакторинг, когда становится трудно разработать следующий сценарий.

С. Лотт
источник
Я задал новый вопрос ... «Если я должен написать свои сценарии раньше ...». Можете посмотреть, пожалуйста? Большое спасибо.
Thom
1
@ S.Lott Хороший ответ, но один спор: исходя из полезности цикла красно-зелёного-рефактора, я бы предложил непрерывно проводить рефакторинг во время процесса BDD, сразу после каждого зелёного теста.
Рейн Хенрикс
@ Rein Henrichs: В качестве альтернативы можно было бы отметить, что рефакторинг для завершения всех тестов для одной истории происходит как неизбежная и неизбежная часть кодирования. Даже отличный дизайн не может охватить все основы. Этот рефакторинг не стоило упоминать. Тем не менее, вы указали это красиво. Рефакторинг между историями, однако, является более серьезной и трудоемкой операцией, так как набор функций развивается с ростом историй.
S.Lott
3

Используйте описательные глаголы

Feature: CONVERT Months and days to days

Не принимайте дизайнерские решения в рассказах [«Мне нужна веб-страница» - это дизайнерское решение]

As a date conversion fan
I want to convert days and months into days

Используйте бизнес-ценности в историях

So that [some business reason]

Напишите как можно больше функций и историй, прежде чем начинать писать код; Истории сообщают друг другу , влияют на особенности, и сообщают дизайн.

Рефакторинг после каждой истории. Red-Green-Refactor.

Стивен А. Лоу
источник
+1, хороший ответ. Но не является ли «BDD-путь» для рефакторинга частью внутреннего цикла модульных испытаний, а не внешним циклом приемочных испытаний?
фунтовые
@pdr: это то, что я имел в виду, рефакторинг после каждой истории. BDD / TDD тесты масштабируются от единицы до приемки, есть только один цикл (на мой взгляд) ;-)
Стивен А. Лоу
Почему «Мне нужна веб-страница» - это дизайнерское решение? Спасибо!
Thom
@thom: пользовательские истории должны выражать то, что пользователь хочет сделать, а не то, как это будет реализовано. Другими словами, функции, истории и сценарии - это требования и функциональные спецификации. Не принимайте дизайнерских решений, пока не получите полную картину. В этом (предположительно искусственном) примере бизнес-потребности пользователя в целом могут указывать на то, что веб-страница может быть не самым удобным решением - виджет для настольного компьютера или мобильное приложение могут быть лучше, в зависимости от того, как / когда им нужно их использовать. Детали реализации загромождают истории и могут слишком рано привязать вас к конкретному дизайну.
Стивен А. Лоу