BDD — Behaviour Driven Development
Движущая сила: поведение системы, описанное на общем языке бизнеса (сценарии Given-When-Then).
Уровень применения: команда (требования) + код (автоматизация сценариев).
Статус: устоявшийся (Dan North, 2006; инструменты JBehave / Cucumber / SpecFlow).
Не путать с: TDD (инженерная микро-практика) и ATDD (критерии приёмки) — см. ниже развёрнутое разведение.
Общее
Behaviour Driven Development (BDD) — методология разработки, в которой первичной движущей силой выступает поведение системы, сформулированное на языке, одинаково понятном бизнесу и разработке. Поведение описывается в виде коротких сценариев по схеме «Дано — Когда — Тогда» (Given-When-Then); эти сценарии рождаются до написания кода, в совместном диалоге стейкхолдеров и команды, и затем исполняются как автоматические проверки. Ключевой тезис North: BDD — это не про тесты, а про понимание и согласование требований через общий язык; тесты здесь — побочный продукт, а не цель.
Подход был сформулирован Дэном Нортом (Dan North) в статье Introducing BDD (Better Software Magazine, 2006). Мотивация North была предельно конкретной: он начал применять TDD и обнаружил, что на вопрос «где начинать и что именно проверять» ответа в методе не было. Название «тестирование» сбивало с толку — нефтехнические стейкхолдеры не понимали, зачем «тесты» пишутся до кода, и отстранялись. North переименовал практику из «test-» в «behaviour-»: говорить о поведении оказалось естественно и бизнесу, и инженерам. Корни подхода — в совместной работе North с Крисом Маттсом (Chris Matts), который принёс в BDD идеи Domain-Driven Design (прежде всего — ubiquitous language) и практику feature injection — «внедрение фичи» через бизнес-цель.
Принципиальное отличие BDD от остальных «*DD» в этой серии — его движущая сила. Если в TDD дизайн направляют юнит-тесты, а в DDD — модель предметной области, то в BDD дизайн направляет диалог о поведении, зафиксированный в исполняемых сценариях. Отсюда вытекает другое: цикл работы выглядит не как «Red-Green-Refactor» (это уровень TDD), а как «соберись → опиши поведение → автоматизируй сценарий → спустись к юнитам → повтори». BDD живёт над TDD: он задаёт, какое поведение нужно реализовать, а TDD на уровне кода страхует, как это поведение устроено внутри.
BDD исторически вырос из попытки ответить на три вопроса, которые TDD оставил открытыми:
- Где начинать? TDD не объяснял, какую первую функцию проверять и откуда вообще берётся «спецификация» для юнит-теста.
- Сколько тестировать? TDD не давал критерия «достаточно»: когда останавливаться в написании проверок.
- Что именно проверять (и что не проверять)? TDD не помогал отличить важное поведение от второстепенного.
North ответил на все три одним и тем же приёмом: поведение системы диктуется бизнес-целью и сценарием её достижения, а не фантазией разработчика о «полезных проверках». Сценарий — это и отправная точка, и критерий полноты, и приоритизация.
Словарь BDD минимален и держится на одном формате — Given-When-Then, предложенном North и позже популяризированном синтаксисом Gherkin (язык описания сценариев в Cucumber и аналогах). Один Feature (фича, бизнес-возможность) содержит один или несколько Scenario (сценариев); каждый сценарий строится по схеме «Дано некоторое начальное состояние — Когда происходит событие/действие — Тогда система должна ответить так-то». Этот формат — не «технический артефакт», а компактный язык описания примеров поведения, читаемый и нетехническим участником.
Ключевые принципы
BDD — это не «писать Gherkin», а набор принципов, которые в совокупности меняют то, как требования превращаются в код. Ниже — формулировка каждого с пояснением, какую конкретную проблему он решает.
Поведение прежде тестов (behaviour over tests). В центре внимания — не «как проверить код», а «как система должна себя вести». Проблема: слово «тест» в TDD провоцировало разработчиков писать проверки реализации, а бизнес — отстраняться («это техническое»). Переключение на «поведение» возвращает фокус на observable-эффекты системы, видимые пользователем, и делает спецификацию интересной нетехническим участникам.
Общий язык (ubiquitous language) с бизнесом. Сценарии пишутся словами, которыми бизнес описывает свою предметную область. Проблема: классические требования (ТЗ на десятки страниц) и тесты (код на программистском жаргоне) живут в двух непересекающихся мирах; каждое «перевод» между ними — точка потери смысла. BDD требует, чтобы терминология сценария совпадала с разговорным языком эксперта — это тот же принцип единого языка, что и в DDD, но применённый к требованиям и примерам.
Примеры вместо абстрактных требований (specification by example). Требование формулируется не как общее правило («корректно применяет скидку»), а как конкретный пример («дано заказ на 100 ₽ и скидка 10 %, тогда итог 90 ₽»). Проблема: абстрактные требования допускают десятки трактовок; стороны расходятся в понимании, не подозревая об этом, и дефект обнаруживается только в приёмке. Конкретный пример с числами и шагами либо понятен всем однозначно, либо вскрывает неоднозначность прямо на сессии — до того, как написана строка кода.
Сценарии Given-When-Then. Структура «Дано — Когда — Тогда» фиксирует три обязательных элемента: предусловие (начальное состояние), действие (триггер) и ожидаемый результат. Проблема: без явной структуры требования смешивают «что было», «что сделали» и «что получили», и пробел в любом из трёх остаётся незамеченным. Шаблон вынуждает автора дописать недостающее.
Outside-in: от приёмочного сценария к юнитам. Разработка идёт «снаружи внутрь»: сначала пишется приёмочный BDD-сценарий (что увидит пользователь), затем — код, его удовлетворяющий, причём внутренние компоненты проектируются «по требованию» сценария, через вложенные циклы TDD на юнит-уровне. Проблема: классический bottom-up («построим компоненты, потом соединим») часто даёт систему, которая работает правильно внутри, но не решает реальной бизнес-задачи снаружи. Outside-in гарантирует, что каждый внутренний модуль существует лишь постольку, поскольку он нужен видимому поведению.
«Три амиго» (three amigos) как ритуал. Каждый сценарий рождается в совместной работе трёх ролей: продуктового аналитика/заказчика (что нужно и зачем), разработчика (как это можно реализовать и какие есть технические ограничения) и QA (как это сломается и какие случаи мы упустили). Проблема: требования, написанные аналитиком в одиночку, часто нереализуемы или неполны; код, написанный разработчиком в одиночку, часто решает не ту задачу; тесты, написанные QA постфактум, часто ловят не то поведение. Три амиго устраняют три эти «одиночки» одним ритуалом.
Живая документация (living documentation). Сценарии, прошедшие автоматизацию, превращаются в исполняемую спецификацию, которая всегда актуальна: если поведение изменилось — сценарий краснеет, если зелёный — он соответствует коду. Проблема: статичные документ и ТЗ устаревают в момент публикации и через полгода безнадёжно расходятся с реальностью. Living documentation не может устареть по построению (она либо зелёная и верная, либо красная и тревожная).
Принципы — система, а не меню. Gherkin-сценарии без three amigos превращаются в «переписанные тесты» без ценности; общий язык без outside-in не страхует от ненужного кода; outside-in без живой документации не даёт обратной связи. Частичное внедрение создаёт «BDD-theatre» — формальное наличие .feature-файлов без заявленного эффекта; полное — даёт синергию требований, кода и документации.
Как это работает
BDD оперирует минимальным, но строго структурированным набором артефактов. Покажем механику на формате Gherkin (де-факто стандарт описания сценариев в Cucumber, JBehave, SpecFlow, Behat).
Формат сценария
Каждая фича (Feature) — это бизнес-возможность, описанная кратким заголовком и одним-двумя предложениями ценности. Внутри фичи — один или несколько сценариев (Scenario), каждый из которых иллюстрирует один пример поведения по схеме Given-When-Then:
# language: ru
Функционал: Применение скидки к заказу
Как маркетолог
Я хочу применять процентную скидку к заказу
Чтобы поощрять повторные покупки
Сценарий: Корректное применение скидки к непустому заказу
Допустим заказ на сумму 100 рублей
И применена скидка 10 процентов
Когда заказ оформляется
Тогда итоговая сумма заказа равна 90 рублей
Сценарий: Скидка не делает цену отрицательной
Допустим заказ на сумму 50 рублей
И применена скидка 200 процентов
Когда заказ оформляется
Тогда итоговая сумма заказа равна 0 рублей
Части сценария соответствуют трём обязательным элементам:
| Часть | Ключевые слова | Смысл |
|---|---|---|
| Контекст | Допустим / Дано (Given), И / Но (And / But) |
Предусловие — начальное состояние мира до действия |
| Действие | Когда (When) |
Триггер — событие или действие пользователя, которое запускает поведение |
| Результат | Тогда (Then), И |
Постусловие — наблюдаемый результат: изменённое состояние, выданные данные, отправленное сообщение |
Ключевые слова локализуемы (# language: ru переключает их на русский), но скелет Given-When-Then неизменен. Важно: в строгом BDD Then описывает наблюдаемый результат, а не вызовы внутренних методов — иначе сценарий проверяет реализацию, а не поведение.
Связка Feature → Scenario → Step definitions
Gherkin-файл — это исполняемая спецификация лишь потенциально: сами по себе строки «Допустим заказ на сумму 100 рублей» ничего не проверяют. Их оживляет связующий код — так называемые step definitions (определения шагов). Каждый шаг сценария связывается регулярным выражением или шаблоном с функцией в коде:
from pytest_bdd import scenarios, given, when, then
scenarios("discount.feature")
@given("заказ на сумму 100 рублей")
def order_100():
return Order(amount=Money(100, "RUB"))
@given("применена скидка 10 процентов")
def apply_discount_10(order_100):
order_100.apply_discount(Percent(10))
@when("заказ оформляется")
def place(order_100):
order_100.place()
@then("итоговая сумма заказа равна 90 рублей")
def assert_total(order_100):
assert order_100.total() == Money(90, "RUB")
Когда раннер запускает фичу, он читает сценарий, для каждой строки находит соответствующий step definition, выполняет соответствующую функцию и сообщает результат: зелёный, если все Then прошли, красный — если хотя бы один шаг упал. Совокупность .feature-файлов и step definitions — это и есть исполняемая спецификация (executable specification).
Инструментарий
BDD-инструменты различаются языком и экосистемой, но концептуально устроены одинаково: парсер Gherkin + связывание шагов с кодом + отчёт о прохождении.
| Инструмент | Экосистема | Особенности |
|---|---|---|
| Cucumber | JVM, Ruby, JS, и др. | Самый распространённый; породил формат Gherkin как стандарт |
| JBehave | JVM | Первая реализация, написана самим North; меньше распространена ныне |
| SpecFlow | .NET | Естественный выбор для C#/.NET-проектов |
| Behat | PHP | Стандарт в Symfony-сообществе |
| pytest-bdd | Python | Интеграция Gherkin с pytest |
Выбор инструмента вторичен: дисциплина и культура важнее конкретного раннера. Команда, освоившая Cucumber, без труда перейдёт на SpecFlow; команда, не понявшая сути BDD, не спасёт ни один инструмент.
Цикл работы
В отличие от TDD с его минутным Red-Green-Refactor, цикл BDD длиннее и охватывает уровни от требований до кода:
- Соберись (Discovery). Three amigos (аналитик, разработчик, QA) обсуждают предстоящую фичу, проговаривая её на конкретных примерах. Цель — обнаружить неоднозначности и пробелы до написания чего-либо. Часто используется техника Example Mapping (Matt Wynne): фича → правила → конкретные примеры → вопросы без ответа.
- Опиши поведение (Formulation). Договорённости оформляются в Gherkin-сценарии. На этом этапе сценарии ещё не автоматизированы, но уже читаемы всеми участниками.
- Автоматизируй сценарий (Automation). Пишутся step definitions; сценарий запускается и обязательно падает — потому что кода под ним ещё нет. Это аналог фазы Red в TDD, но на уровне приёмки.
- Спустись к юнитам (Implementation). Чтобы заставить сценарий позеленеть, разработчик пишет код — и делает это через классические циклы TDD внутри: каждый компонент рождается из красного юнит-теста. Так BDD и TDD складываются в единый процесс: BDD задаёт «какое поведение», TDD — «как устроено внутри».
- Повтори. По мере прохождения сценариев список фич пополняется; живая документация растёт и остаётся зелёной.
Важное свойство цикла: обсуждение (Discovery) ценнее автоматизации. North и Adzic неоднократно подчёркивают — если на сессии three amigos команда выявила неясность требования и поправила его, BDD уже окупил себя, даже если сценарий потом не автоматизировался. Автоматизация — усиление, а не цель.
Влияние на команду и процесс
BDD часто обсуждают как «способ писать тесты на Gherkin». Это грубое сужение: устойчивый эффект возникает только тогда, когда BDD встроен в работу с требованиями и командное взаимодействие. Ниже — что именно меняется. Этот блок адресован прежде всего руководителям.
«Три амиго» как ритуал, а не разовая встреча. Самая ценная практика BDD — не Gherkin, а регулярная совместная сессия, на которой аналитик, разработчик и QA разбирают предстоящую фичу через конкретные примеры. Проблема, которую она решает: в традиционном процессе аналитик пишет ТЗ, разработчик реализует «как понял», QA проверяет «что получилось» — и каждый работает со своей версией требований. Three amigos заменяет три «одиночные версии» одной совместно согласованной. В зрелой команде эта сессия встраивается в рефайнмент бэклога и не требует отдельного формального ритуала.
Shift-left на уровень требований. Если TDD смещает обнаружение дефектов с этапа тестирования на этап кодирования, то BDD смещает его ещё левее — на этап требований. Неоднозначность, противоречие или пропуск в требовании обнаруживаются в разговоре, до любой строки кода. Это самый дешёвый класс дефекта — тот, что не написан. Подробнее о shifted-логике стоимости дефектов — в материалах о жизненном цикле разработки.
Живые спецификации (living documentation) вместо мёртвого ТЗ. Зелёный набор BDD-сценариев — это документация, которая по определению не может устареть: если поведение изменилось, сценарий краснеет и привлекает внимание; если зелёный — он соответствует коду. Это радикально снижает риск «дока vs код», который преследует классические ТЗ и регламенты. Новому участнику проще понять «что вообще делает эта фича», читая .feature-файлы, а не расшифровывая код.
Влияние на бэклог и рефайнмент. Фича считается готовой к разработке не тогда, когда «есть описание», а когда у неё есть согласованные сценарии. Это поднимает планку grooming: задача без примеров поведения просто не берётся в спринт. Для Scrum-команд это естественное усиление критериев готовности (Definition of Ready).
Связь с определением готовности (Definition of Done). BDD-сценарии органично входят в Agile-определение «готово»: фича готова, когда все её приёмочные сценарии зелёные и проходят в CI. Это превращает расплывчатое «работает как надо» в проверяемое «все Given-When-Then проходят автоматически» и снимает вечный спор между разработкой и QA на демо.
Мост между стейкхолдерами и кодом. Сценарии читаемы нетехническими участниками — продакт-менеджером, заказчиком, юристом, аудитором. Это впервые делает требования и их проверку общим достоянием, а не закрытой инженерной территорией. В регулируемых доменах это дополнительный плюс: BDD-сценарии служат аудируемым следом того, какое поведение требовалось и как именно оно проверено.
Синергия с TDD и DDD. BDD не заменяет, а надстраивается над ними. BDD-сценарий задаёт приёмочное поведение; внутри его реализации разработчик ведёт цикл Red-Green-Refactor TDD; а термины, которыми написаны сценарии и шаги, берутся из единого языка DDD. Три подхода складываются в когерентную инженерную культуру: DDD даёт язык, BDD — примеры поведения на этом языке, TDD — код, страхующий поведение по уровням.
Синергия с AI-генерацией кода. Gherkin-сценарии — это исполняемые спецификации на естественном языке, которые AI-агенты читают напрямую. В AIDD BDD-сценарии становятся особенно ценным мостом между бизнес-требованием и автоматически сгенерированным кодом: AI получает однозначное описание поведения, а тест-раннер выступает gate-ом, проверяющим соответствие сгенерированного кода спецификации.
Преимущества
Общий язык. Требование, спецификация и автоматическая проверка говорят на одном языке — языке бизнеса. Это устраняет «телефонный испорченный» перевод между стейкхолдером и кодом, где каждый пересказ теряет смысл.
Раннее выявление неоднозначности требований. Попытка записать требование в виде конкретного примера «Дано X — Когда Y — Тогда Z» немедленно обнажает пробелы: неизвестно начальное состояние, неоднозначен результат, пропущен триггер. Эти дефекты требований обнаруживаются на сессии three amigos, а не через две недели в приёмке.
Исполняемая документация. Зелёный набор сценариев — это документация, которая не может устареть. Она служит одновременно спецификацией, регрессионным тестом и средством онбординга.
Мост между стейкхолдерами и кодом. Нетехнические участники наконец-то могут читать и обсуждать «тесты» — потому что это сценарии на их языке. Это снижает пропасть между бизнесом и инженерией и возвращает заказчику контроль над тем, что именно строится.
Регрессионная страховка на уровне поведения. Однажды записанный и автоматизированный сценарий страхует видимое поведение от незаметной поломки при рефакторинге. Это дополняет TDD-юниты уровнем приёмочных проверок — место BDD в пирамиде тестирования среди более медленных, но зато ориентированных на пользователя тестов.
Снижение переработок. Дефекты требований — самые дорогие (их исправление затрагивает архитектуру и весь реализованный код). Перенос их обнаружения на этап требований экономит недели переработок в долгую; качественный вывод стабилен во множестве отчётов (Adzic, Specification by Example, 2011).
Недостатки и риски
Сценарии как «переписанные тесты». Самый частый провал: команда осваивает синтаксис Gherkin, но не осваивает суть — и начинает переписывать старые юнит- и интеграционные тесты в формате Given-When-Then. Результат: внешне «BDD», внутри — те же технические проверки, только менее читаемые и более хрупкие. Симптом: в Then проверяются вызовы внутренних методов, а в Given — состояние базы данных. Это вырождение BDD в косметику.
Накладные на поддержание step definitions. Каждое изменение поведения требует синхронной правки и .feature-файла, и step definitions, и production-кода. Если шаги спроектированы плохо (жёстко привязаны к деталям реализации), малейший рефакторинг ломает десятки сценариев. Со временем step-слой раздувается и сам становится объектом поддержки, что съедает часть выгод.
Хрупкие e2e-сценарии. BDD-сценарии часто исполняются как end-to-end-проверки через UI или API, а такие проверки медленны и хрупки: падают из-за таймингов, внешних сервисов, изменения верстки. Команда, которая автоматизировала все сценарии как e2e, получает длинный, ненадёжный набор, подрывающий доверие к «зелёному». Подробнее о соотношении слоёв — в пирамиде тестирования: BDD-сценарии — это верхний, тонкий слой, а не основа пирамиды.
Синдром «Cucumber как тестовый фреймворк для юнитов». Распространённая ошибка — пытаться описывать на Gherkin юнит-проверки уровня discount(100, 10) == 90. Это засоряет .feature-файлы техническими деталями, убивает читаемость для бизнеса и игнорирует разделение уровней: юнит-поведение — удел TDD, BDD — уровень фич и сценариев.
Иллюзия «просто писать Gherkin». Команда, начавшая с синтаксиса и пропустившая Discovery, получает аккуратные .feature-файлы, которые не отражают реальных требований (потому что их писал один разработчик, а не three amigos). Сценарии зелёные, а продукт — не тот. Это симптом пропуска главного принципа — совместного обсуждения.
Ложная уверенность. Зелёный набор сценариев не означает полноту спецификации: он означает лишь, что проверено то поведение, о котором догадались написать. Непредусмотренные случаи (о них не подумали) остаются незастрахованными. «Все сценарии проходят» ≠ «система правильная».
Стоимость входа и обучения. BDD требует развитого навыка: умения писать читаемые сценарии, вести three amigos, проектировать step-слой так, чтобы он не хрупчил. Команда без этого навыка получает формальные .feature-файлы и разочарование. Внедрение «с понедельника» в неподготовленной команде почти всегда даёт «BDD-theatre».
Когда использовать
- Сложное бизнес-поведение. Домены с запутанными правилами, множеством ветвлений, неочевидными приоритетами — главный случай для BDD. Конкретные примеры поведения здесь дают максимальную отдачу.
- Нужен мост бизнес ↔ разработка. Когда стейкхолдеры и инженеры говорят на разных языках и постоянно расходятся в понимании, BDD-сценарии дают общий носитель смысла.
- Долгоживущие продукты. Инвестиция в живую документацию окупается, если продукт развивается годами; для одноразовых скриптов — почти никогда.
- Регулируемые домены. Финтех, страхование, медицина — там, где важен аудируемый след «какое поведение требовалось и как проверено», BDD-сценарии служат прямым аргументом для аудиторов.
- Команда с устоявшейся культурой Agile / Scrum. BDD естественно ложится на короткие итерации и рефайнмент бэклога, дополняя процесс инженерной и аналитической дисциплиной.
- Вовлечённый бизнес. Если заказчик или продуктовый владелец готов выделять время на сессии three amigos — BDD работает. Это предусловие, а не пожелание.
Когда НЕ использовать
- Чисто технические и инфраструктурные задачи. Оптимизация SQL-запроса, настройка CI/CD, миграция схемы — поведение здесь техническое, стейкхолдеров-нетехнарей нет, и общий язык с бизнесом не нужен. Здесь работает TDD, а BDD избыточен.
- Визуал и эстетика UI. Раскладка, анимации, визуальное восприятие плохо описываются шагами Given-When-Then. Здесь работают визуальное регрессионное тестирование и ручное QA.
- Прототипы и исследования. Когда цель — быстро проверить гипотезу и, возможно, выбросить код, инвестиции в сценарии и step definitions преждевременны. Сначала — гипотеза, потом (если выживет) — BDD.
- Нет вовлечённого бизнеса. Если стейкхолдеры недоступны или не желают участвовать в обсуждении, BDD вырождается в монолог разработчика, пишущего Gherkin в одиночку. В этом случае ценность надстройки над TDD теряется — достаточно обычных тестов.
- Команда без навыка и без времени на обучение. Внедрение BDD «с понедельника» в команде без опыта совместной работы с требованиями даёт формальные
.feature-файлы без эффекта. Сначала — пилот на одной фиче и обучение; потом — масштабирование. - Жёсткие «горящие» дедлайны. Когда процессом управляет паника, ритуалы three amigos отбрасываются как «лишние встречи». Это симптом больного процесса; в таком режиме BDD не приживётся, пока не устранена первопричина.
Связанные подходы
BDD — не единственный «*DD» в разработке; за разными аббревиатурами стоят разные «движущие силы». Статья входит в серию материалов о driven-подходах; ниже — краткая карта, со ссылками на уже опубликованные материалы базы знаний.
| Подход | Движущая сила | Что управляет дизайном | Уровень применения |
|---|---|---|---|
| BDD | Поведение | Сценарии Given-When-Then на уровне требований | Команда и заказчик |
| TDD | Тесты | Тесты как исполняемая спецификация (Red-Green-Refactor) | Код и команда |
| DDD | Домен | Модель предметной области и единый язык | Команда и организация |
| ATDD | Критерии приёмки | Тесты приёмки как драйвер | Вся команда с заказчиком |
| FDD (в работе серии) | Фичи | Дизайн по списку функций | Команда |
Разведение TDD / ATDD / BDD
TDD, ATDD и BDD часто путают, потому что все три «пишут тесты до кода». Разница — в уровне, драйвере и главном вопросе.
- TDD — инженерная микро-практика. Цикл Red-Green-Refactor на юнит-уровне; драйвер — один разработчик; главный вопрос — «как проектировать код так, чтобы он был тестируемым и слабосвязанным». Тесты здесь управляют дизайном кода.
- ATDD (Acceptance Test Driven Development) — тесты приёмки пишутся до реализации фичи; драйвер — вся команда с заказчиком; главный вопрос — «выполнены ли критерии приёмки». Тесты здесь управляют приёмкой фичи.
- BDD (этот материал) — расширение с акцентом на общий язык и сценарии поведения; драйвер — совместный диалог three amigos; главный вопрос — «как именно система должна себя вести и понимаем ли мы это одинаково». Сценарии здесь управляют пониманием поведения через коммуникацию.
Иначе говоря, на вопрос «что драйвит?» три подхода отвечают по-разному: TDD — дизайн кода, ATDD — приёмку фичи, BDD — понимание поведения через диалог. Они не конкурируют, а дополняют друг друга по уровням: BDD задаёт приёмочное поведение сверху, TDD страхует код снизу; ATDD исторически занимает промежуточное положение и во многом слился с BDD в современной трактовке. В зрелой кодовой базе все три сосуществуют, и именно их сочетание даёт когерентную культуру «поведение → требования → код → проверка».
- TDD — Test Driven Development — родственный подход, где движущей силой выступают тесты как исполняемая спецификация. BDD и TDD дополняют друг друга: BDD задаёт поведение на уровне фичи, TDD страхует реализацию на уровне юнитов.
- DDD — Domain Driven Design — единый язык (ubiquitous language), которым написаны BDD-сценарии, берётся из модели предметной области; DDD и BDD разделяют один и тот же принцип общего языка, применённый к разным артефактам (модель vs требования).
- FDD — Feature Driven Development — организационная методология, где движущей силой выступает клиенто-ориентированная фича. Концептуально BDD ближе к требованиям и коммуникации, FDD — к процессу и масштабированию; обе методологии работают с «фичами», но понимают их по-разному (сценарий поведения vs единица доставки).
- MDD — Model Driven Development — родственный подход, где движущей силой выступает формальная модель. BDD и MDD сдвигают фокус вверх по жизненному циклу, но на разные артефакты: BDD — на требования, MDD — на архитектуру.
- AIDD — AI-Driven Development: Gherkin-сценарии как исполняемые спецификации на естественном языке, которые AI читает напрямую, а раннер исполняет как gate.
- Agile и Scrum — процессные рамки, в которые BDD встраивается через рефайнмент бэклога и Definition of Done.
- SDLC — где BDD живёт внутри жизненного цикла: прежде всего на стыке фаз требований и тестирования, выполняя shift-left обнаружения дефектов.
- Введение в тестирование и пирамида тестирования — место BDD-сценариев в общей системе контроля качества (верхний, тонкий слой).
- Политика нуля дефектов — как работать с найденными проблемами в кодовой базе, где есть живая спецификация.
Родственные driven-подходы — FDD — Feature Driven Development, MDD — Model Driven Development, а также «сатирические» варианты вроде Panic Driven Development — рассматриваются в отдельных статьях серии.
Краткий вердикт для руководителя
BDD — это инвестиция в общее понимание между бизнесом и разработкой, а не способ писать тесты модно. Эффект: раннее выявление неоднозначности требований, общий язык, исполняемая документация, мост между стейкхолдерами и кодом. Цена: время на ритуалы three amigos, поддержание step definitions, обучение команды писать читаемые сценарии. Берите, если поведение сложное, бизнес вовлечён, продукт долгоживущий, а команда готова к совместной работе с требованиями. Не берите, если задачи чисто технические, бизнеса в команде нет, горизонт короткий, или процессом управляет паника дедлайнов. Оценивать эффект BDD на горизонте одного спринта — главная ошибка внедрения; эффект проявляется на горизонте месяцев и лет, когда живая спецификация накапливается и требования перестают «расходиться» с кодом по умолчанию.
Источники и материалы
Первоисточники и ключевые публикации
- Dan North. Introducing BDD (Better Software Magazine, 2006) — фундаментальный первоисточник, формулировка перехода от «test-» к «behaviour-» и мотивации методологии.
- Dan North. What’s in a Story? (dannorth.net, 2006) — канонический шаблон BDD-истории (story) и её структуры.
- Gojko Adzic. Bridging the Communication Gap. Neuri, 2009 — систематизация роли примеров и совместной работы в требованиях.
- Gojko Adzic. Specification by Example. Manning, 2011 — отраслевое исследование десятков команд, применяющих BDD/Specification by Example; кейс-стади и шаблоны.
- Matt Wynne, Aslak Hellesøy. The Cucumber Book: Behaviour-Driven Development for Testers and Developers. Pragmatic Bookshelf — практическое руководство по Cucumber и Gherkin.
- Martin Fowler. GivenWhenThen, BDD (martinfowler.com) — аналитические статьи, разъясняющие ключевые понятия и контекст применения.
- Liz Keogh. BDD (lizkeogh.com, серия статей и докладов) — рефлексия одного из ранних адептов и популяризаторов подхода.
Связанные материалы базы знаний
- TDD — Test Driven Development — родственный driven-подход; BDD надстраивается над TDD, задавая поведение на уровне фичи.
- DDD — Domain Driven Design — общий источник принципа ubiquitous language; терминология сценариев берётся из модели предметной области.
- AIDD — BDD-сценарии как исполняемые спецификации для AI-генерации кода.
- Введение в тестирование и пирамида тестирования — место BDD-сценариев в общей системе качества.
- SDLC — BDD как инструмент shift-left на уровне требований.