Какое отношение имеет BDD и TDD?
Из того, что я понял, BDD добавляет две основные вещи над TDD: тестирование имен (обязательно / должно) и приемочные тесты. Должен ли я следовать TDD во время разработки BDD? Если да, то должны ли мои модульные тесты TDD называться в том же стиле, что и должны?
Ответы:
BDD добавляет цикл вокруг цикла TDD.
Итак, вы начинаете с поведения и позволяете этому управлять вашими тестами, а затем позволяете тестам управлять разработкой. В идеале BDD управляется каким-то приемочным тестом, но это не обязательно на 100%. Пока вы определили ожидаемое поведение, вы в порядке.
Итак, допустим, что вы пишете страницу входа.
Начните с счастливого пути:
Этот синтаксис «дано, и когда, и тогда, и» является обычным в поведенческой разработке. Одним из преимуществ этого является то, что он может быть прочитан (и, с обучением, написан) не разработчиками - то есть, ваши заинтересованные стороны могут просматривать список поведений, которые вы определили для успешного завершения задачи, и посмотреть, если это соответствует их ожиданиям задолго до того, как вы выпустите неполный продукт.
Существует язык сценариев, известный как Gherkin, который очень похож на приведенный выше и позволяет вам писать тестовый код за предложениями в этих режимах. Вам следует искать переводчика на основе Gherkin для вашей обычной среды разработки. Это выходит за рамки этого ответа.
Во всяком случае, вернемся к поведению. Ваше текущее приложение еще не делает этого (если оно делает то, почему кто-то запрашивает изменение?), Поэтому вы проваливаете этот тест, используете ли вы тестовый прогон или просто тестируете вручную.
Теперь пришло время переключиться на цикл TDD, чтобы обеспечить эту функциональность.
Пишете ли вы BDD или нет, ваши тесты должны иметь общий синтаксис. Одним из наиболее распространенных является синтаксис «следует», который вы описали.
Написать тест: ShouldAcceptValidDetails. Пройдите цикл Red-Green-Refactor, пока не будете довольны им. Пройдем ли мы сейчас тест на поведение? Если нет, напишите еще один тест: ShouldRedirectToUserDefaultPage. Red-Green-Refactor, пока ты счастлив. Стирайте, ополаскивайте, повторяйте, пока не выполните критерии, изложенные в поведении.
И затем мы переходим к следующему поведению.
Теперь вы не должны были выгружать это, чтобы передать свое прежнее поведение. Вы должны провалить этот тест на данный момент. Так что возвращайтесь к своему циклу TDD.
И так до тех пор, пока у вас не будет вашей страницы.
Настоятельно рекомендуем книгу Rspec для получения дополнительной информации о BDD и TDD, даже если вы не являетесь разработчиком Ruby.
источник
Мое понимание этого:
Так что по решению TDD сделано правильная часть BDD. BDD начинался как смена языка TDD, чтобы прояснить намерение процесса. Во вступительной статье Дэна Норта о BDD объясняется, почему сосредоточение внимания на поведении слова, а не на тестировании, полезно - это помогает подтвердить, что вы не просто создаете правильное программное обеспечение, вы также создаете правильное программное обеспечение. Это всегда было частью хорошего подхода TDD, но Дэн немного кодифицировал его в BDD.
Я думаю, что BDD делает немного более явным, чем 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 является его частью.
источник
Это одно и то же.
Это не то, что BDD «добавляет». Это просто другое соглашение, призванное облегчить обучение и понимание TDD.
Все люди, создавшие BDD, учили TDD, и они заметили, что самое сложное для понимания - это то, что TDD не имеет абсолютно никакого отношения к тестированию. Как только студенты преодолели это препятствие, им стало намного легче. Но очень трудно оторваться от мыслей о тестировании , когда слово «тест» (или связанная с ним терминология, такая как «утверждать») встречается практически везде . Итак, они поменяли несколько слов.
Но это только слова! Там нет нет фактической разницы между TDD и BDD.
Приемочные испытания являются такой же важной частью TDD, как и BDD. Снова: нет никакой разницы между TDD и BDD: TDD, выполненный правильно, является BDD, BDD является TDD, сделанным правильно.
источник