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

    02 · Тест-дизайн

    Сценарії використання й приймальні критерії

    Зміст

    Техніки з попередніх глав — класи еквівалентності, граничні значення, таблиці рішень — відповідають на питання «як перевірити поле чи бізнес-правило». Але вимоги рідко приходять полями. У реальній команді вони приходять user story з приймальними критеріями або сценаріями використання, і перше робоче питання QA звучить інакше: «як із цього тексту зробити перевірки й нічого не загубити?»

    На співбесіді це питають майже дослівно: дають story з двома-трьома критеріями і просять розписати тести. Інтервʼюер дивиться на дві речі — чи вмієш ти систематично пройти від тексту вимоги до перевірок, і чи бачиш щось за межами щасливого шляху. Друге провалюють частіше.

    Use case: актор, потоки, винятки

    Сценарій використання (use case) — це опис взаємодії між актором і системою, яка веде актора до його цілі. Актор (actor) — не конкретна людина, а роль: «покупець», «адміністратор», а іноді й зовнішня система — платіжний шлюз теж актор, просто не людський.

    Класична структура use case:

    • Передумови (preconditions) — що має бути істинним до старту: «в кошику є товар».
    • Основний потік (basic flow) — послідовність кроків, якою актор досягає цілі, коли все йде добре. Його і називають happy path.
    • Альтернативні потоки (alternative flows) — легальні відгалуження, які теж ведуть до цілі, але іншим шляхом: оплата збереженою карткою замість нової, вхід гостем замість логіну.
    • Виняткові потоки (exception flows) — ситуації, коли ціль не досягається або досягається з відхиленням: банк відхилив платіж, сесія протухла посеред оформлення.
    • Післяумови (postconditions) — що гарантовано істинне після завершення: «замовлення створене, лист надіслано» або, для винятку, «замовлення не створене, кошик не втрачено».

    На прикладі «Оплата замовлення карткою»:

    Так

    Ні

    Так

    Ні

    Кошик: натиснути «Оплатити»

    Користувач залогінений?

    Вибір способу оплати

    Оформлення як гість

    Введення даних картки

    Банк підтвердив платіж?

    Замовлення створено,
    лист-підтвердження

    Повідомлення про відмову,
    кошик збережено

    Так

    Ні

    Так

    Ні

    Кошик: натиснути «Оплатити»

    Користувач залогінений?

    Вибір способу оплати

    Оформлення як гість

    Введення даних картки

    Банк підтвердив платіж?

    Замовлення створено,
    лист-підтвердження

    Повідомлення про відмову,
    кошик збережено

    Тут один основний потік (залогінений покупець, платіж пройшов), один альтернативний (гість) і один винятковий (відмова банку). У живому продукті гілок буде більше — таймаут 3-D Secure, обрив мережі після списання, повторне натискання «Оплатити», — і саме заради цих гілок use case і пишуть: вони змушують автора вимоги відповісти на «а що, як ні?» ще до розробки.

    Тести зі сценаріїв

    Базове правило покриття просте: кожен потік — основний, кожен альтернативний, кожен винятковий — має бути пройдений хоча б одним тестом. Це мінімум. Діаграма вище дає щонайменше три тести; якщо якийсь потік жодним тестом не проходиться — у покритті дірка, яку видно неозброєним оком.

    Але сценарій відповідає лише за маршрут. Усередині кроків живуть дані й правила, і там працюють інші техніки:

    Тобто use case — не заміна технік, а рамка, яка показує, де їх застосувати. Типова помилка джуна — пройти щасливий маршрут і вважати фічу покритою; типова помилка ретельного джуна — закопатися у 40 варіантів одного поля і не перевірити жодного альтернативного потоку. Сценарій дає карту, техніки — глибину в конкретних точках карти.

    User story і формати приймальних критеріїв

    User story — це коротке формулювання потреби у форматі «Як роль, я хочу дію, щоб цінність»: «Як покупець, я хочу зберегти картку, щоб не вводити її щоразу». Story навмисно не специфікація — це обіцянка розмови. В agile-практиці це описують як «3 C»: Card (картка — сам текст), Conversation (розмова — деталі зʼясовуються в обговоренні), Confirmation (підтвердження — приймальні критерії).

    Приймальні критерії (acceptance criteria, AC) — це і є та третя «C»: перелік умов, за яких story вважається виконаною. Для QA це головний тестовий базис у Scrum-команді: з AC виводяться перевірки, і за AC вирішується, чи приймати фічу. Атрибути вимог загалом — тема розділу «Основи тестування»; тут важливо одне: критерій, який не можна перевірити, — не критерій. «Сторінка працює швидко» — побажання; «список карток віддається не довше ніж за 2 секунди на тестовому стенді» — критерій.

    Силабус ISTQB називає два найпоширеніші формати запису AC:

    ФорматЯк виглядаєКоли зручний
    Правила (rule-oriented)Маркований список умов: «картка зберігається лише після успішного платежу», «максимум 5 збережених карток»Обмеження, валідації, поодинокі правила
    Сценарний (scenario-oriented)Given-When-Then: стан → дія → результатПоведінка з контекстом: «за якого стану що станеться»

    Формати не конкурують — їх змішують в одній story. Правило «максимум 5 карток» безглуздо розтягувати на Given-When-Then, а поведінку «що бачить гість після відмови банку» безглуздо стискати в один рядок правила.

    Given-When-Then як формат критерію

    Given-When-Then (GWT) — спосіб записати критерій як мінімальний сценарій із трьох частин:

    • Given — стан світу до дії: передумови, дані, контекст.
    • When — одна дія, яку виконує актор або система.
    • Then — спостережуваний результат, який можна перевірити.
    Given залогінений покупець із товаром у кошику на 1200 грн
    When він оплачує замовлення карткою, яку банк відхиляє
    Then він бачить повідомлення про відмову без технічних деталей
    And замовлення не створюється, кошик лишається без змін

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

    Три робочі правила гігієни GWT:

    1. Один When. Якщо дій дві — це два сценарії або погано схований е2е-флоу.
    2. Then — лише те, що можна спостерігати: текст на екрані, статус у базі, надісланий запит. «Система обробляє виняток» — не Then.
    3. Без деталей реалізації. «When натискає синю кнопку в правому куті» привʼязує критерій до верстки; критерій описує намір, а не піксель.

    Важливо не плутати рівні: GWT — це формат мислення й запису, він не вимагає жодного інструмента. Gherkin — конкретний синтаксис (файли .feature, кроки, автоматизація через Cucumber/CodeceptJS BDD), який використовує ті самі ключові слова. Команда може писати AC у GWT в Jira і ніколи не мати жодного .feature-файлу — і це нормально. Звʼязка Gherkin з кодом — тема розділу про фреймворки автоматизації.

    Наскрізні сценарії vs атомарні перевірки

    З одного use case можна зробити два принципово різні види тестів, і обидва потрібні.

    Наскрізний сценарій (end-to-end) проходить увесь потік від передумови до післяумови: гість кладе товар у кошик, оформлює, платить, бачить підтвердження, отримує лист. Його цінність — інтеграційна: він ловить баги на стиках кроків, які жоден локальний тест не побачить (кошик губиться після логіну, лист іде без номера замовлення).

    Атомарна перевірка фіксує один інваріант: «промокод зменшує підсумок на 10%», «шосту картку зберегти не можна». Її цінність — локалізація: коли вона падає, причина видна з назви тесту.

    // Атомарна перевірка: один інваріант, падіння одразу вказує на причину
    test('промокод SAVE10 зменшує підсумок на 10%', async ({ page }) => {
      await openCartWithItems(page, { total: 1000 });
      await applyPromo(page, 'SAVE10');
      await expect(page.getByTestId('cart-total')).toHaveText('900 грн');
    });
    
    // Наскрізний сценарій: ціль користувача цілком, ловить стики кроків
    test('гість оформлює замовлення карткою і бачить підтвердження', async ({ page }) => {
      await addItemToCart(page, 'item-42');
      await checkoutAsGuest(page, guestData);
      await payWithCard(page, testCard.valid);
      await expect(page.getByTestId('order-confirmation')).toBeVisible();
    });

    Чому не можна обійтись самими наскрізними: довгий сценарій падає на будь-якому з десяти кроків, і падіння каже лише «десь у флоу зламалось» — далі йде розкопування. До того ж кожен крок — це UI-очікування й мережа, тож е2е повільні та вразливі до флаку й проблем синхронізації. Чому не можна обійтись самими атомарними: сто зелених локальних перевірок не гарантують, що користувач здатен пройти флоу цілком.

    Практичний баланс: атомарних перевірок багато, наскрізних сценаріїв мало — по одному на основний потік і на критичні альтернативні/виняткові, а не по одному на кожен AC. Правило «одна перевірка — один інваріант» і рівні деталізації кейсів — тема глави про тест-кейси й чеклисти.

    Пастка happy-path-only

    Найпоширеніший системний перекіс у тестуванні за сценаріями: перевірений лише основний потік. Причина не в лінощах, а в самих артефактах: user story за побудовою описує бажану поведінку, автор AC думає про цінність фічі, а не про відмови, тож винятки в критерії потрапляють рідко й безсистемно. Тестувальник, який чесно покрив усі написані AC, автоматично успадковує цей перекіс — усі тести зелені, а продакшн ловить перший таймаут платіжки.

    Симетрична проблема: щасливий шлях — це те, що розробник і так проганяв руками під час розробки. Ймовірність знайти баг саме там зазвичай найнижча з усіх потоків. Баги живуть у гілках, про які ніхто не подумав.

    Як ламати пастку системно, а не «нюхом»:

    • До кожного When — питання «а що, як ні?». Банк підтвердив — а якщо відхилив? А якщо не відповів узагалі? Кожна відповідь — кандидат у винятковий потік.
    • До кожного AC — негативний близнюк. «Картка зберігається після успішного платежу» тягне за собою «картка НЕ зберігається після неуспішного».
    • Стандартний список зривів для будь-якого флоу: обрив мережі посеред кроку, повторне натискання кнопки-сабміту, «назад» у браузері, протухла сесія, паралельна дія в другій вкладці, недостатні права.
    • Питання про гроші й дані: що з уже списаними коштами, введеними даними, станом кошика, коли потік обірвався? Післяумова виняткового потоку — найчастіше саме те місце, де вимога мовчить, а баг коштує найдорожче.

    Хороший маркер зрілості вимог: якщо в use case розділ винятків порожній — це привід іти до аналітика з питаннями ще до початку тестування, а не заповнювати дірки здогадками під час нього.

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

    • Виглядає як «усі AC покриті — фіча протестована», а насправді AC — мінімальний контракт приймання, зазвичай зміщений у бік happy path; покриття AC — це нижня межа, а не вичерпний тест-дизайн.
    • Виглядає як «AC у Given-When-Then — це вже майже автотести», а насправді GWT — формат опису поведінки; тестом він стає лише після додавання даних, середовища й перевірюваних очікувань, а автотестом — після звʼязування з кодом кроків.
    • Виглядає як «наскрізний сценарій покриває все, атомарні тести зайві», а насправді падіння е2е не локалізує причину, а його довжина множить флак; е2е доводить прохідність маршруту, атомарні — коректність правил.
    • Виглядає як «use case і user story — синоніми», а насправді story — коротка обіцянка цінності з критеріями приймання, а use case — структурований опис взаємодії з потоками й винятками; story поміщається на стикері, use case — ні.
    • Виглядає як «додам у сценарій більше кроків — буде більше покриття», а насправді довгий сценарій ламкіший і повільніший, а перевірки всередині нього дублюють атомарні тести; покриття росте від нових потоків, а не від довших маршрутів.

    Підсумок

    • Use case = актор + потоки: основний, альтернативні, виняткові, з перед- і післяумовами. Мінімум покриття — один тест на кожен потік.
    • Сценарій дає карту маршрутів, а глибину в кожній точці дають техніки: еквівалентність і межі — полям, таблиці рішень — правилам, переходи станів — статусам.
    • AC записують правилами або сценарно (Given-When-Then); неперевірюваний критерій — не критерій. У GWT: один When, спостережуваний Then, без деталей реалізації.
    • Наскрізних сценаріїв мало (прохідність маршрутів), атомарних перевірок багато (локалізація причин). Це не конкуренти, а два шари.
    • Happy path — зазвичай найменш імовірне місце для бага. До кожного When питай «а що, як ні?», до кожного AC шукай негативного близнюка.

    Що питають на співбесіді

    • «Ось user story з трьома AC — як тестуватимеш?» Класика. Інтервʼюер чекає, що ти не кинешся перелічувати кліки, а спершу структуруєш: потоки, дані в кроках, техніки до даних — і явно назвеш винятки, яких в AC немає. Питання до вимоги («а що при відмові банку?») тут плюс, а не мінус.
    • «Що таке acceptance criteria і хто їх пише?» Дивляться на розуміння процесу: AC — спільна робота власника продукту, розробки і QA (та сама Conversation), а не документ, який QA отримує згори.
    • «Поясни Given-When-Then. Чим відрізняється від Gherkin?» Перевіряють, чи відрізняєш формат мислення від синтаксису інструмента. Бонус — назвати гігієну: один When, перевірюваний Then.
    • «Чим use case відрізняється від user story?» Хочуть почути про структуру: потоки й винятки проти короткої обіцянки цінності з критеріями.
    • «У тебе година на фічу — ганяєш один довгий е2е чи багато дрібних перевірок?» Пастка на «або-або»: сильна відповідь — про шари, пріоритет за ризиком і те, що довгий сценарій не локалізує падіння.
    • «Усі AC пройшли, а в проді баг. Як так?» Перевіряють, чи розумієш межі AC як тестового базису — і чи не звучить у відповіді «вимоги були погані» замість «мій тест-дизайн мав вийти за межі написаного».

    Джерела

    • ISTQB CTFL Syllabus v4.0 — розділ 4.5 «Collaboration-based Test Approaches»: спільне написання user story, приймальні критерії, ATDD. Тестування за use case як окрема техніка описане в попередній версії силабусу (CTFL 2018, розділ 4.2.5).
    • ISTQB Glossary — канонічні означення: use case, actor, acceptance criteria, user story.
    • Martin Fowler, GivenWhenThen — коротке канонічне пояснення формату; авторство Фаулер атрибутує Деніелу Терхорст-Норту і Крісу Маттсу (BDD).
    • Gherkin Reference — Cucumber — синтаксис Gherkin: чим інструментальний шар відрізняється від GWT-формату критеріїв.