vyvchy
    Теми розділу

    06 · Автоматизація: стратегія

    BDD і Gherkin: обіцянки і реальність

    Зміст

    BDD і Gherkin продають як срібну кулю: пишете сценарії людською мовою «Given… When… Then», бізнес їх читає, тестувальник автоматизує, і в команди зʼявляється єдина , яка ніколи не бреше. На практиці ж чимало команд отримують зайвий шар над UI-тестами: ті самі крихкі кліки, тільки тепер загорнуті в англійські речення, які ніхто, крім AQA, не відкриває. Обіцянка й реальність розходяться не тому, що інструмент поганий, а тому, що плутають дві різні речі — практику й формат запису.

    Пастка тут проста: на питання «Що таке BDD?» слабкий кандидат відповідає «це коли пишемо тести на Gherkin через Cucumber». Сильний почне з того, що BDD — це передусім розмова, а Gherkin — лише спосіб її зафіксувати. Ця глава — про те, де межа між обіцянкою і реальністю, і як не платити за синтаксис, не отримавши вигоди.

    BDD — це практика співпраці, а не синтаксис

    BDD (Behavior-Driven Development, розробка через поведінку) виросла з TDD у середині 2000-х як спроба Дена Норта (Dan North) прибрати з TDD слово «тест», яке збивало новачків з пантелику. Ідея: описувати не тести, а очікувану поведінку системи прикладами, і робити це разом — до написання коду.

    Центральний ритуал BDD — розмова, яку офіційна дока Cucumber називає «три амігос» (The Three Amigos): це зустріч, що перетворює історію користувача на сценарії Gherkin, і голосів у ній «щонайменше три». Дока розписує роли поіменно: представник бізнесу (product owner) відповідає за і вирішує, що в нього входить; тестувальник генерує сценарії й граничні випадки та питає «як це зламається»; розробник додає кроки й думає про механіку виконання. Число «три» й одноразовість зустрічі дока прямо називає не обмеженням: «there is no reason to limit these meetings to three people—or to hold only one such meeting at the beginning of the project».

    Ось ключ до всієї глави: цінність BDD створюється в розмові, а не в текстовому файлі. Це не наша інтерпретація — дока Cucumber ставить документацію й автотести на місце «nice side-effects», а справжньою метою називає робоче ПО, до якого швидше за все веде розмова. Якщо команда пропустила обговорення й просто написала Gherkin постфактум, «щоб було по-модному», вона заплатила повну ціну інструмента, не отримавши головного — вирівняного розуміння й ранньої ловитви непорозумінь. Формалізована техніка такої розмови — : беруть історію (жовта картка), виписують правила (rules, сині), під кожне — приклади (examples, зелені), а незрозуміле складають у стос запитань (questions, червоні), «so we can move on with the conversation». За деталями офіційна дока посилається на блог Метта Вінна (Matt Wynne) — авторства техніки вона при цьому не приписує нікому.

    Одне уточнення, щоб не переказувати чуже своїми словами: теза «стос питань окупає зустріч» — наш висновок, а не твердження доки. Дока каже лише, що питання фіксують, щоб не блокувати розмову. Найближче до нашої тези вона підходить в іншому місці, і про discovery загалом: структурована розмова «may also reveal gaps in our understanding, where we need more information before we know what to do».

    Тому коректне визначення для співбесіди: BDD — це практика співпраці навколо конкретних прикладів поведінки; Gherkin, Cucumber, feature-файли — лише інструменти, які цю практику підтримують, але не замінюють.

    новий приклад

    Три амігос:
    розмова про приклади

    Приклади поведінки
    example mapping

    Формулювання:
    Gherkin feature-файл

    Автоматизація:
    кроки у коді

    Жива документація
    + зелена сюїта

    новий приклад

    Три амігос:
    розмова про приклади

    Приклади поведінки
    example mapping

    Формулювання:
    Gherkin feature-файл

    Автоматизація:
    кроки у коді

    Жива документація
    + зелена сюїта

    Діаграма показує головне непорозуміння: Gherkin (крок C) — лише один вузол циклу. Команди, що впроваджують «BDD», часто стартують одразу з C, пропустивши A і B, — і дивуються, чому вигоди немає.

    Given–When–Then: анатомія сценарію

    Gherkin — це структурована майже-природна мова для запису прикладів. Її кістяк — три ключові слова:

    • Given — контекст, стан світу до події (). «Given користувач залогінений».
    • When — подія або дія, що запускає поведінку. В ідеалі одна. «When він додає товар у кошик».
    • Then — очікуваний спостережуваний результат. «Then у кошику один товар».

    Кроки зчіплюють словами And і But. Спільний для всіх сценаріїв контекст виносять у Background. Приклад feature-файлу:

    Feature: Кошик
    
      Background:
        Given користувач залогінений
    
      Scenario: Додавання товару в порожній кошик
        Given кошик порожній
        When користувач додає товар "Клавіатура"
        Then у кошику 1 товар
        And сума кошика дорівнює ціні "Клавіатури"

    Структура невипадкова: Given–When–Then один в один лягає на Arrange–Act–Assert з глави «Анатомія автотесту». Given — це підготовка стану, When — дія, Then — перевірка. Звідси й дисципліна, яку перевіряють на рев'ю: у Given не роблять , у Then не тиснуть кнопок. Один сценарій — одна поведінка, а не десять кліків «за компанію».

    Для параметризації є Scenario Outline з таблицею Examples — це той самий data-driven тест (див. главу про тест-дані):

    Scenario Outline: Валідація пароля при реєстрації
      When користувач реєструється з паролем "<password>"
      Then система показує "<result>"
    
      Examples:
        | password    | result             |
        | short       | Пароль закороткий  |
        | goodpass123 | Реєстрація успішна |

    Одне застереження термінології: Gherkin — це синтаксис і мова; Cucumber, SpecFlow, Behave, вбудований BDD у CodeceptJS — це інструменти, які цю мову виконують. Given–When–Then можна вживати як формат (acceptance criteria) навіть без жодного інструмента — просто в тікеті Jira.

    Imperative проти declarative

    Ось де вирішується доля всієї затії. Обидва слова — терміни офіційної доки Cucumber, і правило вона формулює одним рядком: сценарій описує задуману поведінку системи, а не реалізацію — «it should describe what, not how». Один і той самий сценарій можна написати двома способами.

    Імперативний (imperative) — описує кроки інтерфейсу:

    Scenario: Логін (імперативно)
      Given користувач на сторінці "/login"
      When він вводить "user@test.io" у поле "email"
      And вводить "Qwerty123" у поле "password"
      And натискає кнопку "Увійти"
      Then він бачить заголовок "Мій профіль"

    Декларативний (declarative) — описує намір, а «як» ховає в код кроків:

    Scenario: Логін (декларативно)
      Given зареєстрований користувач
      When він входить у систему
      Then він потрапляє у свій профіль

    Різниця не косметична. крихкий: перейменували поле, змінили верстку форми — і треба правити текст, який мав би читати бізнес. Він багатослівний і фактично дублює page object у прозі. Головне — він нечитабельний для нетехнічного читача: продакт-менеджер не хоче знати про поле «email», він хоче знати, що «користувач входить у систему».

    стабільний: зміна UI зачіпає лише (step definition), а не сам сценарій. Так це формулює й дока: «when the implementation of a feature changes, you'll only need to change the process steps behind the scenes». Він читається як вимога, переживає редизайн і не тече деталями реалізації. Правило-орієнтир: у feature-файлі — мова бізнесу й наміри; уся механіка кліків і — нижче, у коді кроків.

    Але одразу зніміть із декларативності ореол догми — і не приписуйте догму джерелу. Дока подає імперативний стиль без осуду: «Imperative tests communicate details, and in some contexts this style of test is appropriate», і мінус називає конкретний — такі тести дорожчі в підтримці, бо привʼязані до механіки поточного UI.

    Нюанс для сеньйора — і тут ми виходимо за межі джерела, тож кажемо це прямо: застереження «занадто декларативно теж погано» — наше, у доці Cucumber його немає. Дока попереджає про протилежний надмір (забагато деталей реалізації в сценарії), а про надмір абстракції не говорить. Наше спостереження таке: якщо весь сценарій це «When усе працює / Then все добре», він нічого конкретного не перевіряє — читається гарно, а тестова цінність нульова. Баланс: один сценарій — один бізнес-намір із конкретним, але не покроковим результатом.

    Коли Gherkin виправданий, а коли це податок

    Тепер чесно про ціну. Gherkin додає (indirection): feature-файл не виконується сам — кожен рядок треба привʼязати до функції-кроку, розпарсити параметри, підтримувати цей glue-код. Дебажити стає важче: падіння в кроці «When він входить у систему» доводиться розкручувати через кілька рівнів, а не читати прямо в тесті.

    Feature-файл (Gherkin)
    мова бізнесу

    Step definitions
    glue-код

    Page Object / API-клієнт

    Застосунок

    Feature-файл (Gherkin)
    мова бізнесу

    Step definitions
    glue-код

    Page Object / API-клієнт

    Застосунок

    Кожна стрілка — місце, де може зламатися привʼязка й де губиться слід під час дебагу. Звичайний Playwright-тест має на один рівень менше: він одразу починається з рівня B.

    Ця ціна окупається за конкретних умов:

    • Є реальний нетехнічний читач. Продакт, аналітик, комплаєнс, замовник справді відкривають і читають сценарії або беруть участь у їх написанні. Це головна умова.
    • Розмова відбувається насправді. Команда практикує «три амігос» / example mapping, і feature-файли народжуються з обговорення, а не пишуться AQA наодинці.
    • Критерії приймання — спільний контракт. Given–When–Then живе у історії, а не тільки в тестовому репозиторії.

    І дзеркально — коли Gherkin стає чистим податком:

    • Технічна AQA-команда пише сценарії сама для себе, і жоден нетехнічний колега їх ніколи не відкриває. Тоді англійський прошарок над Playwright не додає нічого, крім роботи: звичайний test('користувач входить у систему') з гарною назвою — це вже документація, без витрат на парсинг Gherkin.
    • Сценарії імперативні (див. вище) — ви отримали крихкість UI-тестів плюс накладні витрати BDD і жодної читабельності натомість.

    Просте правило: якщо прибрати Gherkin і ніхто поза командою автоматизації цього не помітить — він вам не потрібен.

    Living documentation: коли документація справді жива

    Найпринадніша обіцянка BDD — жива документація (living documentation). Термін в офіційній доці є, але — важлива деталь — стоїть він там у лапках і без окремого означення: «Declarative scenarios read better as "living documentation"». Тобто дока звʼязує «живість» саме з декларативним стилем, а не проголошує окрему сутність.

    Сам механізм дока формулює в іншому місці й без лапок — у переліку трьох складових BDD: «Producing system documentation that is automatically checked against the system's behaviour». Ось звідки логіка: сценарії водночас і опис поведінки, і виконуваний тест. Якщо поведінка системи зміниться, а сценарій — ні, тест впаде. Отже, документація не може тихо застаріти: розбіжність між нею і кодом миттєво стає червоним . Це радикально відрізняється від Confluence-сторінки, яку востаннє оновлювали два релізи тому.

    Інструменти BDD генерують із прогону читабельні звіти — по суті специфікацію системи, де видно, які сценарії проходять (див. главу «Звітність» про звіт як продукт). Механіка привʼязки Gherkin-рядків до коду (step definitions, World, хуки в CucumberJS) — окрема тема інструментів, її розбирає відповідна глава розділу про інструменти автоматизації; тут важливий принцип, а не синтаксис степів.

    Але «жива» вона лише за трьох умов — і це вже наш перелік, зібраний із практики, а не цитата доки:

    1. Сценарії декларативні й читабельні — інакше це «жива» стіна кліків, яку нехтоно читати.
    2. Її хтось реально читає — документація без читача мертва за визначенням.
    3. зелена — набір, де половина сценаріїв у @skip або стабільно червоні, документує не систему, а занедбаність команди.

    Living documentation — не безкоштовний наслідок Gherkin, а результат дисципліни. Той самий (глава «Флакі-тести») у BDD-обгортці шкодить подвійно: він і ламає гейт, і підриває довіру до документа, який мав бути джерелом істини.

    Типові помилки

    • Виглядає як «ми впровадили BDD», а насправді — купили Cucumber і пишемо Gherkin постфактум наодинці. Без «трьох амігос» це не BDD, а дорожчий спосіб писати ті самі тести.
    • Виглядає як читабельний сценарій, а насправді — імперативний переказ кліків: «вводить email, натискає кнопку». Бізнес його не читатиме, а ви отримали зайвий шар над крихким UI-тестом.
    • Виглядає як жива документація, а насправді — 30% сценаріїв у @ignore і ніхто їх не відкриває місяцями. Документація, яку не читають і не тримають зеленою, мертва.
    • Виглядає як економія (один сценарій — багато кроків), а насправді — «сценарій-простирадло» з десятком When підряд: тестує все й нічого, падає з десяти причин, порушує атомарність.
    • Виглядає як переваги Gherkin, а насправді — технічна команда пише сценарії сама для себе. Прибери прошарок — і describe/it з гарними назвами дасть ту саму документацію дешевше.
    • Виглядає як повторне використання, а насправді — надто узагальнені кроки-«швейцарський ніж» на кшталт «When я натискаю "X"», з яких складають будь-що. Це не BDD-словник домену, а прихований imperative через чорний хід.

    Підсумок

    • BDD — це практика співпраці навколо прикладів поведінки; Gherkin і Cucumber — лише інструменти запису. Цінність народжується в розмові, а не у feature-файлі.
    • Given–When–Then = Arrange–Act–Assert у прозі: Given — стан, When — одна дія, Then — перевірка; асертам не місце в Given, діям — у Then.
    • Declarative (намір) перемагає imperative (кліки): стабільніший до змін UI, читабельний для бізнесу, ховає «як» у кроки коду.
    • Gherkin окупається лише за реального нетехнічного читача й живої практики «трьох амігос»; для технічної команди, що пише для себе, це податок понад звичайні тести.
    • Living documentation жива тільки поки сценарії декларативні, зелені й хтось їх читає; інакше це мертвий текст із накладними витратами. Ці три умови — наш перелік; джерельним у ньому є лише механізм «документації, що автоматично перевіряється проти поведінки».

    Можливі питання

    • «Що таке BDD?» Інтерв'юер перевіряє, чи не зводите ви BDD до інструмента. Сильна відповідь починається з «це практика співпраці, розмова про приклади поведінки до коду», і лише потім згадує Gherkin як формат запису.
    • «Навіщо Given–When–Then, чим це краще за звичайний тест?» Дивляться, чи бачите ви звʼязок з AAA і читабельність для нетехнічного читача, а не просто «так прийнято».
    • «Imperative vs declarative сценарій — у чому різниця й що краще?» Класика для middle. Очікують приклад обох і аргумент про стабільність та аудиторію, а не догму «declarative завжди» — офіційна дока її й не встановлює, вона прямо , що «in some contexts this style of test is appropriate».
    • «Коли ви НЕ радите BDD?» Найпоказовіше питання: зрілий кандидат чесно каже, що для суто технічної команди без нетехнічних читачів Gherkin — накладні витрати. Незрілий вважає BDD універсальним добром.
    • «Що таке living documentation і чому вона часто не працює?» Дивляться на розуміння умов: декларативність, зелена сюїта, реальний читач; і на чесність про типовий провал.

    Джерела

    BDD — це практика співпраці, а не синтаксис

    • Dan North — Introducing BDD — першоджерело терміна: BDD зʼявився як відповідь на проблеми навчання TDD (де почати, що тестувати, як називати тести), а не як спосіб писати тести природною мовою.
    • Cucumber Docs — Behaviour-Driven Development — три практики поіменно (Discovery, Formulation, Automation) з жорстким порядком, і пряма теза: документація й автотести — побічні ефекти BDD, а мета — робоче ПЗ через розмови.
    • Cucumber Docs — Who does what? — «три амігос» це зустріч, а не троє людей: голосів «щонайменше три» (скоуп, сценарії й межові випадки, здійсненність), і дока радить не зводити зустріч до трьох і повторювати її.
    • Cucumber Docs — Example Mapping — техніка тієї самої розмови до взяття історії в роботу: story → rules → examples → questions.
    • ISTQB® CTAL-TAE Syllabus v2.0 — пастка, названа каноном прямо: команди зводять BDD до «тестів природною мовою» й не залучають бізнес і розробників у сам підхід.

    Given–When–Then: анатомія сценарію

    • Cucumber — Gherkin Reference — нормативна механіка: кожен непорожній рядок має починатися з ключового слова, перше ключове слово документа must бути Feature, Given описує контекст і не описує взаємодію користувача, Then перевіряє спостережуваний вихід — і пряма настанова опиратися спокусі перевіряти в Then базу даних.
    • Martin Fowler — GivenWhenThen — розведення інструмента й мови (Cucumber — інструмент, Gherkin — його DSL) і те, що Given/When/Then є переформулюванням , вживаним і поза BDD-інструментами.
    • Dan North — Introducing BDD — чому фрагменти мають бути дрібними: це умова того, щоб критерій приймання став виконуваним кодом, а кроків закладене в задум від початку.

    Imperative проти declarative

    • Cucumber Docs — Writing better Gherkin — обидва терміни офіційні, різниця сформульована як «what, not how»; декларативний стиль робить сценарії легшими в підтримці й менш крихкими, бо при зміні реалізації правиться код кроків, а не сценарій. Імперативний стиль подано без осуду: «in some contexts this style of test is appropriate».
    • Cucumber — Gherkin Reference — інструменти, якими прибирають шум замість імперативних кроків: Background проти повторення однакових Given і Scenario Outline для того самого сценарію на різних комбінаціях значень.

    Коли Gherkin виправданий, а коли це податок

    • ISTQB® CTAL-TAE Syllabus v2.0 — обидві чаші терезів у формулюванні канону: вигоди (комунікація між розробниками, бізнесом і тестувальниками; сценарії як тест-кейси; застосовність на різних рівнях піраміди) і ціна — реалізація й підтримка кроків природною мовою названа складною задачею, а надто складні кроки роблять дебаг важким і дорогим; негативні сценарії й межові випадки BDD не покриває сам.
    • Cucumber Docs — Behaviour-Driven Development — і те, звідки береться віддача: без опанованого Discovery решта практик її не дають.

    Living documentation: коли документація справді жива

    • Cucumber Docs — Behaviour-Driven Development — механізм «живості» названо окремим пунктом серед трьох складових BDD: «Producing system documentation that is automatically checked against the systemʼs behaviour».
    • Cucumber Docs — Writing better Gherkin — сам термін офіційний, але поданий у лапках і без означення: «Declarative scenarios read better as "living documentation"» — тобто це радше властивість стилю, ніж окремий артефакт.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.