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

    01 · Основи тестування

    Вимоги, user story та acceptance criteria

    Зміст

    Кожен тест відповідає на питання «а як має бути правильно?». Джерело цього «правильно» — вимоги: саме вони є основою тестування (test basis) і оракулом, з яким ти порівнюєш фактичну поведінку. Немає вимог — немає критерію, і «баг» перетворюється на «мені здається, що так не повинно бути». Тому глава про вимоги — це не про документообіг, а про фундамент будь-якої перевірки, яку ти напишеш у тест-кейсах.

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

    Функціональні і нефункціональні вимоги

    Вимога (requirement) — це умова або здатність, яку система повинна мати, щоб розвʼязати задачу користувача чи бізнесу. Вимоги ділять на два великі класи:

    • Функціональні (functional) — описують, що система робить: поведінку, функції, реакції на вхідні дані. «Користувач може відновити пароль через email», «при сумі замовлення від 1000 грн доставка безкоштовна».
    • Нефункціональні (non-functional) — описують, наскільки добре вона це робить: атрибути якості системи. Продуктивність, безпека, зручність використання, надійність, сумісність.
    АспектФункціональна вимогаНефункціональна вимога
    Відповідає на питанняЩо робить система?Наскільки добре / за яких умов?
    Приклад«Пошук повертає товари за назвою і артикулом»«Результати пошуку зʼявляються не довше ніж за 2 секунди при 1000 одночасних користувачів»
    Типова перевіркаФункціональний тест: дія → очікуваний результатСпеціалізовані види: навантажувальні, security, usability
    Типовий дефект формулюванняПропущений сценарій (а що при помилці?)Немає вимірюваного порога («має працювати швидко»)

    Практичний нюанс, який відрізняє сильного джуна: нефункціональні вимоги найчастіше страждають від нетестопридатності. «Система має бути швидкою і зручною» — це побажання, а не вимога: незрозуміло, як зафіксувати pass/fail. Завдання QA — ще на етапі обговорення спитати «скільки це — швидко? за яких умов? на якому обсязі даних?» і домогтися числа. Як класифікуються види тестування під обидва класи вимог — у главі про види тестування.

    Атрибути хороших вимог

    Стандарт ISO/IEC/IEEE 29148 (інженерія вимог, requirements engineering) описує характеристики якісних вимог — окремих та їх наборів. Найважливіші з них для щоденної роботи QA:

    АтрибутПитання-перевірка
    Однозначність (unambiguous)Чи можуть двоє людей прочитати це по-різному?
    Повнота (complete)Чи описані всі сценарії, зокрема помилкові? Чи немає «і т.д.», «тощо», «за потреби»?
    Тестопридатність (verifiable)Чи можна обʼєктивно перевірити, що вимогу виконано? Є критерій pass/fail?
    Атомарність (singular)Одна вимога — одне твердження, без «і» на пʼять функцій одразу
    Несуперечливість (consistent)Чи не конфліктує з іншими вимогами системи?
    Необхідність (necessary)Чи справді це потрібно користувачу/бізнесу, чи «про запас»?
    Здійсненність (feasible)Чи реалізовно це технічно в межах проєкту?

    Порівняй: «система має підтримувати багато користувачів» — і «система витримує 500 одночасних активних сесій із часом відповіді API до 1 секунди для 95% запитів». Перше не перевіриш ніяк, друге — прямий вхід для навантажувального тесту.

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

    User story і INVEST

    В Agile-командах вимоги найчастіше живуть у формі користувацьких історій (user story) — коротких описів потреби з погляду користувача за шаблоном:

    Як [роль], я хочу [дію/можливість], щоб [цінність]. (As a… / I want… / So that…)

    Наприклад: «Як покупець, я хочу зберігати товари у списку бажань, щоб повернутися до них пізніше, не шукаючи заново».

    Ключова відмінність від класичної вимоги-документа: story — це не повна специфікація, а обіцянка розмови. Класична формула Рона Джеффріса — три «C»: Card (картка — короткий запис), Conversation (розмова — деталі зʼясовуються в обговоренні аналітика, розробника й тестувальника), Confirmation (підтвердження — acceptance criteria, за якими зрозуміло, що story готова). QA — повноправний учасник цієї розмови: саме тестувальник найчастіше питає «а що, як користувач зробить не так?».

    Якість story оцінюють за критеріями INVEST (сформулював Білл Вейк):

    ЛітераКритерійЩо означаєНавіщо це QA
    IIndependentНезалежна від інших storyМожна протестувати й випустити окремо, без черги блокерів
    NNegotiableОбговорювана, не жорсткий контрактДеталі зʼясовуються в розмові — момент поставити питання
    VValuableНесе цінність користувачуЧастина «щоб…» — це і є критерій, чи те взагалі перевіряємо
    EEstimableКоманда може оцінити обсягЯкщо оцінити не виходить — вимога незрозуміла, це сигнал
    SSmallВміщається у спринтВеличезну story неможливо покрити тестами за ітерацію
    TTestableМожна перевіритиНемає способу перевірити — story не готова до розробки

    Антиприклад: «Зробити модуль оплати». Це не story, а епік: немає ролі й цінності, не оцінити, не вміщається у спринт, «зробити» не перевіриш. Його ріжуть на менші історії: «Як покупець, я хочу оплатити замовлення карткою, щоб не платити готівкою курʼєру» — і далі окремо про збережені картки, повернення коштів, помилки оплати.

    INVEST — не академічна вправа: на рефайнменті беклогу (див. Agile для QA) саме за цими критеріями команда вирішує, чи брати story у спринт, а «Testable» — прямо зона відповідальності тестувальника.

    Acceptance criteria: чекліст і Given/When/Then

    Критерії приймання (acceptance criteria, AC) — це умови, які мають виконуватися, щоб story вважалася завершеною. Їх формулюють до початку розробки — зазвичай власник продукту разом з командою, і QA тут не читач, а співавтор. AC — це той самий Confirmation з трьох «C» і водночас головний вхід для тест-дизайну.

    На практиці живуть два формати.

    Чекліст (rule-oriented) — список правил без привʼязки до сценарію:

    • Пароль містить щонайменше 8 символів, серед них цифра і літера.
    • При невалідному email кнопка «Зареєструватися» неактивна.
    • Після реєстрації користувач отримує лист із підтвердженням протягом 5 хвилин.
    • Email, що вже зареєстрований, показує повідомлення «Обліковий запис уже існує».

    Формат зручний для наборів правил валідації, обмежень, розрахунків.

    Сценарний формат Given/When/Then — описує поведінку через конкретний сценарій: Given — початковий стан і передумови, When — дія користувача чи подія, Then — очікуваний спостережуваний результат.

    Scenario: Успішний логін
      Given зареєстрований користувач із підтвердженим email
      When він вводить правильний email і пароль та натискає «Увійти»
      Then він потрапляє на дашборд
      And бачить своє імʼя в шапці сторінки

    Цей формат — синтаксис мови Gherkin і основа підходу BDD (behavior-driven development); механіку звʼязування таких сценаріїв із кодом автотестів розбирають розділи про стратегію та інструменти автоматизації. Але цінність Given/When/Then не в інструментах: він змушує описати стан → дію → результат, і в цій трійці одразу видно дірки («а що в Then, якщо пароль неправильний?»).

    Структура Given/When/Then напряму лягає на структуру автотесту (той самий поділ, що й Arrange–Act–Assert):

    // AC: Given зареєстрований користувач, When вводить валідні креденшили,
    // Then потрапляє на дашборд
    test('логін з валідними даними веде на дашборд', async ({ page }) => {
      await page.goto('/login');                                    // Given
      await page.getByLabel('Email').fill('user@example.com');
      await page.getByLabel('Пароль').fill('correct-password');
      await page.getByRole('button', { name: 'Увійти' }).click();   // When
      await expect(page).toHaveURL(/\/dashboard/);                  // Then
    });

    Важлива межа, яку плутають на співбесідах: AC — не тест-кейси. AC фіксують «що має бути правдою», щоб прийняти story, — це мінімальний контракт. Тест-дизайн іде ширше: до кожного критерію додаються негативні перевірки, граничні значення, комбінації. З одного AC про мінімальну довжину пароля народжується кілька перевірок: рівно 8 символів, 7 символів, порожнє поле, пробіли, unicode. AC кажуть «що приймаємо», тести відповідають «як ми в цьому переконалися».

    Хороший AC описує що, а не як: «користувач бачить повідомлення про помилку», а не «під полем зʼявляється червоний div із текстом розміром 12px». Деталі реалізації в AC привʼязують вимогу до конкретної верстки — і критерій ламається при кожному редизайні, хоча поведінка не змінилась.

    Тестування вимог

    Вимоги можна і треба тестувати — без жодного запуску коду. Це найдешевша форма тестування: рев'ю вимог — класика статичного тестування (докладно — у главі про статичне тестування і рев'ю), а «раннє тестування зберігає час і гроші» — один із семи принципів. Фаза аналізу вимог недарма стоїть першою у STLC.

    Що саме шукає QA, читаючи вимогу:

    • Неоднозначність. «Система повідомляє користувача про помилку» — як саме: на екрані, листом, пушем? Кого саме, якщо користувачів у сценарії двоє?
    • Прогалини. Описаний happy path — а що при відмові платіжки, обриві мережі, паралельному редагуванні? Що бачить користувач без прав?
    • Суперечності. Вимога 12 каже «сесія живе 30 хвилин», вимога 47 — «користувач залишається залогіненим 7 днів». Обидві не можуть бути правдою одночасно.
    • Нетестопридатність. «Інтерфейс має бути інтуїтивним» — за яким критерієм приймаємо?
    • Конфлікт із наявною поведінкою. Нова вимога мовчки ламає сценарій, який вже працює і який хтось любить.

    Кожне поставлене питання — це потенційно спійманий дефект, просто спійманий до того, як його написали в коді. Формат фіксації — коментар до story, питання на рефайнменті, тред у таск-трекері: головне, щоб відповідь стала частиною вимоги, а не залишилася в усній розмові.

    Що робити без вимог

    Ситуація «вимог немає або вони застаріли» — не екзотика, а буденність, і на співбесідах це питання люблять саме тому, що воно перевіряє зрілість, а не знання термінів. Відсутність документа не означає відсутність оракулів — їх просто треба зібрати:

    • Люди. Аналітик, власник продукту, розробник фічі, сапорт — носії знання «як має бути». Питай і фіксуй відповіді письмово.
    • Артефакти. Макети в Figma, листування, старі баг-репорти, наявні тести, документація користувача — усе це фрагменти вимог.
    • Сам застосунок. Поточна поведінка — базлайн для регресії. Але обережно: поточна поведінка не обовʼязково правильна — вона лише «так є зараз», а не «так має бути».
    • Аналоги і конвенції. Як цю задачу розвʼязують конкуренти, які конвенції в платформи (валідація email, формати дат), здоровий глузд домену.

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

    RTM: матриця трасованості

    Матриця трасованості вимог (requirements traceability matrix, RTM) — це таблиця відповідності між вимогами й тестами: кожен рядок показує, які перевірки покривають конкретну вимогу. RTM відповідає на два питання: «чи всі вимоги покриті хоч одним тестом?» і «які тести зачепить зміна цієї вимоги?». Побудова, підтримка і межі корисності RTM — окрема глава про покриття вимог і трасування в розділі «Тест-дизайн»; тут достатньо означення і місця в загальному ланцюжку:

    дефект у вимозі

    RTM: покриття

    Бізнес-потреба

    User story + AC

    Тестові умови

    Тест-кейси і чеклісти

    Результати прогону

    дефект у вимозі

    RTM: покриття

    Бізнес-потреба

    User story + AC

    Тестові умови

    Тест-кейси і чеклісти

    Результати прогону

    Ланцюжок працює в обидва боки: вниз — від потреби до перевірки, вгору — від дефекта, знайденого тестом, до вимоги, яку він порушує (або якої бракувало).

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

    • Виглядає як «у нас є вимоги», а насправді — вікі-сторінки дворічної давнини, які ніхто не оновлював після змін. Тестувати проти застарілого документа гірше, ніж без нього: оракул впевнено бреше. Перше питання до будь-якої вимоги — «вона ще актуальна?».
    • Виглядає як acceptance criteria, а насправді — тест-кейс із кроками «натиснути кнопку в правому верхньому куті». AC описують поведінку, а не реалізацію; кроки і локатори — рівень тест-кейсу.
    • Виглядає як user story, а насправді — епік «зробити оплату» без ролі, цінності й меж. Прогін за INVEST це виявляє за хвилину: не Small, не Estimable, не Testable.
    • Виглядає як «AC пройшли — фіча протестована», а насправді AC — мінімальний контракт приймання. Негативні сценарії, межі, комбінації — це тест-дизайн поверх AC, а не замість них.
    • Виглядає як «нефункціональне — не моя парафія», а насправді саме тестувальник першим має спитати «скільки це — швидко?». Нетестопридатна вимога — це дефект, і його заведення нічим не гірше за баг у коді.

    Підсумок

    • Вимоги — основа тестування й оракул: якість твоїх тестів обмежена якістю вимог, тому вимоги тестують так само, як код, — тільки раніше й дешевше.
    • Функціональні вимоги описують «що робить система», нефункціональні — «наскільки добре»; нефункціональна вимога без вимірюваного порога — нетестопридатна.
    • User story — обіцянка розмови (Card–Conversation–Confirmation), а не міні-специфікація; фільтр якості story — INVEST, і «T» у ньому — territory тестувальника.
    • Acceptance criteria пишуться до розробки, описують «що», а не «як», і є входом для тест-дизайну — але не замінюють його.
    • Без вимог тестування можливе: збери оракули (люди, артефакти, поточна поведінка, аналоги), сформулюй припущення письмово й провалідуй їх у власника продукту.

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

    • «Чим функціональні вимоги відрізняються від нефункціональних? Наведи приклади.» Чекають пару «що робить / наскільки добре» і власні приклади, а не завчені означення. Сильна відповідь додає: нефункціональні без чисел — нетестопридатні.
    • «Що таке user story і що означає INVEST?» Розшифрувати літери мало — інтервʼюер дивиться, чи розумієш ти навіщо кожен критерій. Найцінніша літера для QA — Testable: покажи це.
    • «Що таке acceptance criteria? Хто і коли їх пише?» Ключові слова: до розробки, разом із командою, критерій готовності story. Бонус — обидва формати: чекліст і Given/When/Then.
    • «Чим AC відрізняються від тест-кейсів?» Класична пастка. AC — контракт «що приймаємо», тест-кейси — ширший набір перевірок поверх нього, включно з негативними і граничними.
    • «Вимог немає. Твої дії?» Перевіряють зрілість: паніка «без вимог тестувати неможливо» — червоний прапорець. Чекають структуру: зібрати оракули → зафіксувати припущення → провалідувати → перетворити на чекліст.
    • «Як би ти протестував саму вимогу?» Чекають список: однозначність, повнота, несуперечливість, тестопридатність — з прикладом поганого формулювання і як його виправити.
    • «Що таке RTM?» Достатньо означення (таблиця вимоги × тести) і двох питань, на які вона відповідає: покриття і вплив змін.

    Джерела