Связь между BDD и TDD

30

Какое отношение имеет BDD и TDD?

Из того, что я понял, BDD добавляет две основные вещи над TDD: тестирование имен (обязательно / должно) и приемочные тесты. Должен ли я следовать TDD во время разработки BDD? Если да, то должны ли мои модульные тесты TDD называться в том же стиле, что и должны?

SiberianGuy
источник
1
BDD - это набор хорошо документированных TDD (Unitests)
DD
Кто-нибудь хочет добавить ответ из лагеря Behavior Driven Design ? С моей точки зрения, эти ответы все о первых итерациях BDD. Успешные приложения BDD в наши дни часто ближе к дизайну и могут даже полностью исключить автоматическое тестирование, когда это необходимо.
Пол Хикс
Разница между BDD и TDD подобна разнице между макроэкономикой и микроэкономикой. BDD = построение понимания требований с использованием примеров и, при желании, может использоваться для проведения автоматических тестов макросов. (agilenoir.biz/en/am-i-behavioral-or-not), TDD = написание микротестов для управления написанием кода. Подкаст Agile Мысли покрывает и эти различия: agilenoir.biz/ru/agile сбоку/test-automation-pyramid-series
Lance Kind

Ответы:

37

BDD добавляет цикл вокруг цикла TDD.

Итак, вы начинаете с поведения и позволяете этому управлять вашими тестами, а затем позволяете тестам управлять разработкой. В идеале BDD управляется каким-то приемочным тестом, но это не обязательно на 100%. Пока вы определили ожидаемое поведение, вы в порядке.

Итак, допустим, что вы пишете страницу входа.

Начните с счастливого пути:

Given that I am on the login page
When I enter valid details
Then I should be logged into the site
And shown my default page

Этот синтаксис «дано, и когда, и тогда, и» является обычным в поведенческой разработке. Одним из преимуществ этого является то, что он может быть прочитан (и, с обучением, написан) не разработчиками - то есть, ваши заинтересованные стороны могут просматривать список поведений, которые вы определили для успешного завершения задачи, и посмотреть, если это соответствует их ожиданиям задолго до того, как вы выпустите неполный продукт.

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

Во всяком случае, вернемся к поведению. Ваше текущее приложение еще не делает этого (если оно делает то, почему кто-то запрашивает изменение?), Поэтому вы проваливаете этот тест, используете ли вы тестовый прогон или просто тестируете вручную.

Теперь пришло время переключиться на цикл TDD, чтобы обеспечить эту функциональность.

Пишете ли вы BDD или нет, ваши тесты должны иметь общий синтаксис. Одним из наиболее распространенных является синтаксис «следует», который вы описали.

Написать тест: ShouldAcceptValidDetails. Пройдите цикл Red-Green-Refactor, пока не будете довольны им. Пройдем ли мы сейчас тест на поведение? Если нет, напишите еще один тест: ShouldRedirectToUserDefaultPage. Red-Green-Refactor, пока ты счастлив. Стирайте, ополаскивайте, повторяйте, пока не выполните критерии, изложенные в поведении.

И затем мы переходим к следующему поведению.

Given that I am on the login page
When I enter an incorrect password
Then I should be returned to the login page
And shown the error "Incorrect Password"

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

И так до тех пор, пока у вас не будет вашей страницы.

Настоятельно рекомендуем книгу Rspec для получения дополнительной информации о BDD и TDD, даже если вы не являетесь разработчиком Ruby.

прецизионный самописец
источник
Вы можете просто оставить комментарии? Я до сих пор не понимаю ...
Дорогая,
4

Мое понимание этого:

  • BDD начинался как ребрендинг TDD, чтобы сделать акцент на поведении понятнее.
  • Он предоставляет более формальную поддержку (DSL и инструментарий) для сосредоточения на поведении и исполняемых спецификациях.
  • BDD теперь можно рассматривать как надмножество TDD. Со временем он вырос, чтобы охватить больше аспектов, связанных с выявлением требований, но, тем не менее, сторона процесса разработки является его ключевой частью.

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


Я думаю, что BDD делает немного более явным, чем TDD, или, по крайней мере, формализует и обеспечивает поддержку инструмента, это подход с двумя циклами / двойным циклом / уменьшением / уменьшением масштаба. Сначала вы описываете ожидаемое поведение функции (внешний цикл), затем увеличиваете масштаб внутреннего цикла, чтобы справиться с низкоуровневыми спецификациями.

Doubleloop TDD С http://www.metesreau.com/ncraft-workshop/

Gherkin в сочетании с такими инструментами, как Cucumber и SpecFlow, предоставляют способ написания этих высокоуровневых спецификаций функций, а затем связывают их с кодом, который выполняет код приложения. Я бы сказал, что именно здесь BDD может «чувствовать» себя иначе, чем TDD, но на самом деле он все еще делает то же самое, только с некоторой добавленной поддержкой инструментов и DSL. Несколько ближе к «традиционному» TDD используются такие инструменты, как rspec, nspec, spock. Это немного больше похоже на тот же процесс, который вы выполняете в «традиционном» TDD, но с более ориентированным на поведение языком.

В книге BDD in Action Джона Фергюсона Смарта (настоятельно рекомендуется) он выступает за подход с двойным циклом, начиная с чего-то вроде jBehave с исполняемыми спецификациями внешнего уровня, а затем переходя к инструменту типа Spock для низкоуровневых спецификаций.


BDD приближает концепцию, основанную на тестировании, к заинтересованным сторонам бизнеса. Gherkin разработан для удобства чтения бизнесом, и идея «живой документации», то есть автоматически создаваемых отчетов о ходе выполнения ваших исполняемых спецификаций, заключается в предоставлении обратной связи заинтересованным сторонам.

Другая часть BDD сейчас, где она действительно становится чем-то, что включает TDD как часть более крупного процесса, - это кусочки, требующие выявления требований. Такие идеи, как внедрение функций, сопоставление воздействий и реальные параметры, являются частью этой стороны.

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

НГМ
источник
2

Какое отношение имеет BDD и TDD?

Это одно и то же.

Из того, что я понял, BDD добавляет две основные вещи над TDD: тестирование имен (обязательно / должно)

Это не то, что BDD «добавляет». Это просто другое соглашение, призванное облегчить обучение и понимание TDD.

Все люди, создавшие BDD, учили TDD, и они заметили, что самое сложное для понимания - это то, что TDD не имеет абсолютно никакого отношения к тестированию. Как только студенты преодолели это препятствие, им стало намного легче. Но очень трудно оторваться от мыслей о тестировании , когда слово «тест» (или связанная с ним терминология, такая как «утверждать») встречается практически везде . Итак, они поменяли несколько слов.

Но это только слова! Там нет нет фактической разницы между TDD и BDD.

и приемочные испытания.

Приемочные испытания являются такой же важной частью TDD, как и BDD. Снова: нет никакой разницы между TDD и BDD: TDD, выполненный правильно, является BDD, BDD является TDD, сделанным правильно.

Йорг Миттаг
источник
Каким образом приемочные испытания являются важной частью TDD?
SiberianGuy
@Idsa: они важны тем, что ваш код должен проходить не те тесты, которые, по вашему мнению, должны пройти, а те, которые код должен выполнять. Я думаю, что слишком многих людей смущает это, что большинство модульных тестов являются низкоуровневыми и, таким образом, избегают трудной проблемы тестирования того, что система была написана для общего выполнения.
gbjbaanb
@Idsa: Точно так же, как они важны для BDD, конечно, так как они одно и то же ! Приемочные тесты управляют внешним циклом TDD, касающимся функций и пользователей, в отличие от более детального внутреннего цикла, который касается API и протоколов и тому подобного. Я думаю, что Кент Бек называет это «Увеличить / Уменьшить». Например, вы можете легко увидеть это в наборе тестов JUnit, который содержит, по крайней мере, столько же приемочных тестов, сколько содержит модульные тесты.
Йорг W Mittag
Приемочные испытания являются важной частью TDD и BDD. Но сказать, что BDD равен TDD, все равно, что сказать, что TDD равен тесту в первую очередь. Если вы не позволяете тестам управлять вашим кодом, вы не делаете TDD (раньше я знал кого-то, кто был рад написать тесты заранее, но утверждал, что код всегда должен быть написан так, как если бы вы не писали модуль тесты и что тесты должны быть написаны соответственно). Точно так же, если вы не позволяете поведению управлять вашими тестами, вы не выполняете BDD.
фунтовые
1
@Idsa: Обратите внимание, что существует много неправильных описаний TDD, которые не включают приемочные тесты. Это - к сожалению, довольно популярное и довольно широко преподаваемое - неправильное описание - одна из причин, почему люди из BDD думали, что было бы хорошей идеей переименовать TDD под другим именем, чтобы избежать путаницы. Тем не менее, и это не может повторяться достаточно часто, TDD и BDD - это одно и то же .
Йорг Миттаг