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 — розмова, яку часто називають «три амігос» (three amigos): представник бізнесу (product owner, аналітик), розробник і тестувальник разом розбирають конкретну історію й проговорюють приклади її поведінки. Бізнес знає, що має статися; розробник — що реально можливо; тестувальник — що піде не так і які крайові випадки всі забули. Продукт цієї розмови — спільне розуміння, а вже його побічний артефакт — записані сценарії.

    Ось ключ до всієї глави: цінність BDD створюється в розмові, а не в текстовому файлі. Якщо команда пропустила обговорення й просто написала Gherkin постфактум, «щоб було по-модному», вона заплатила повну ціну інструмента, не отримавши головного — вирівняного розуміння й ранньої ловитви непорозумінь. Формалізована техніка такої розмови — example mapping (Метт Вінн, Matt Wynne): беруть історію, виписують правила (rules), під кожне — приклади (examples), а незрозуміле складають у стос запитань (questions). Уже цей стос питань окупає зустріч: він показує діри у вимогах до того, як їх зашили в код.

    Тому коректне визначення для співбесіди: 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

    Ось де вирішується доля всієї затії. Один і той самий сценарій можна написати двома способами.

    Імперативний (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), а не сам сценарій. Він читається як вимога, переживає редизайн і не тече деталями реалізації. Правило-орієнтир: у feature-файлі — мова бізнесу й наміри; уся механіка кліків і локаторів — нижче, у коді кроків.

    Нюанс для сеньйора: занадто декларативно теж погано. Якщо весь сценарій це «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). Логіка така: сценарії водночас і опис поведінки, і виконуваний тест. Якщо поведінка системи зміниться, а сценарій — ні, тест впаде. Отже, документація не може тихо застаріти: розбіжність між нею і кодом миттєво стає червоним білдом. Це радикально відрізняється від Confluence-сторінки, яку востаннє оновлювали два релізи тому.

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

    Але «жива» вона лише за трьох умов, і кожну легко зламати:

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

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

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

    • Виглядає як «ми впровадили 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 завжди».
    • «Коли ви НЕ радите BDD?» Найпоказовіше питання: зрілий кандидат чесно каже, що для суто технічної команди без нетехнічних читачів Gherkin — накладні витрати. Незрілий вважає BDD універсальним добром.
    • «Що таке living documentation і чому вона часто не працює?» Дивляться на розуміння умов: декларативність, зелена сюїта, реальний читач; і на чесність про типовий провал.

    Джерела