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

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

    Тест-кейси й чеклисти: рівень деталізації

    Зміст

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

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

    Атомарність: одна перевірка — один інваріант

    Атомарний тест-кейс перевіряє рівно одне твердження про поведінку системи — один інваріант. «Порожній email блокує сабміт форми» — інваріант. «Форма реєстрації працює коректно» — не інваріант, а тема на десяток кейсів.

    Чому це принципово. Результат виконання кейсу — один статус: passed або failed. Якщо кейс перевіряє одну річ, статус читається без відкривання кейсу: упав «порожній email блокує сабміт» — зламалася саме ця валідація. Якщо ж кейс на 12 кроків перевіряє шість речей і падає на третій, то про решту три перевірки після точки падіння ти не знаєш нічого: вони не failed — вони не виконані. Один статус на шість інваріантів — це втрата інформації, яку потім доводиться відновлювати руками.

    Атомарність дає й інші дивіденди:

    • Вибіркові прогони. Регресію можна зібрати з атомарних кейсів під конкретний ризик; кейс-комбайн або тягне зайве, або лишає діру.
    • Чесна статистика. «5 failed з 200» щось означає, лише коли кейси співмірні за обсягом перевірок.
    • Пряма трасованість. Атомарний кейс прив'язується до однієї тестової умови з ланцюжка «вимога → умова → кейс» (див. першу главу розділу) — це фундамент покриття вимог.

    Важливе уточнення: атомарність міряється перевіркою, а не кількістю кроків. Щоб перевірити «архівований проєкт не з'являється в пошуку», треба створити проєкт, наповнити його, заархівувати — і лише тоді перевірити. Кроків багато, інваріант один, кейс атомарний. Помилка — плутати «один кейс — одна перевірка» з «один кейс — один крок»: друге дає мікроскопічні кейси, де підготовка розмазана по сюїті.

    В автоматизації різниця видна неозброєним оком:

    // Антипатерн: тест-комбайн — падіння на кроці 3 ховає решту перевірок
    test('форма реєстрації працює', async ({ page }) => {
      // ...12 кроків, 6 expect-ів упереміш
    });
    
    // Атомарно: один інваріант, зрозуміла назва, чистий репорт
    test('порожній email блокує сабміт і показує помилку', async ({ page }) => {
      await page.goto('/signup');
      await page.getByRole('button', { name: 'Зареєструватися' }).click();
      await expect(page.getByText('Вкажіть email')).toBeVisible();
    });

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

    Назва описує перевірку

    Назва кейсу — це найчастіше читаний його рядок: у списку сюїти, у звіті прогону, у повідомленні про падіння. Тому назва має відповідати на одне питання: «що саме зламалося, якщо цей кейс упав?» Назва описує інваріант, що перевіряється, — не дію, не навігацію, не назву екрана.

    Погана назваХороша назваЩо виправлено
    Перевірка логінуЛогін з валідним паролем відкриває дашборд«Перевірка» — шум; названо очікувану поведінку
    Тест поля emailEmail без символу @ показує помилку валідаціїНазвано конкретний інваріант, а не об'єкт
    Відкрити сторінку кошика і видалити товарВидалення останнього товару показує порожній кошикДія переїхала в кроки; у назві — результат
    Негативний кейс 3Пароль коротший за 8 символів відхиляєтьсяНазву можна прочитати без відкривання кейсу

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

    Рівень деталізації: детальний, high-level, чеклист

    Той самий інваріант можна записати трьома способами. ISTQB розрізняє низькорівневі (low-level, concrete) тест-кейси — з конкретними даними й покроковими діями — і високорівневі (high-level, logical) — де зафіксовано суть перевірки без конкретних значень. Чеклист — ще один щабель угору: лише список інваріантів, «що має бути правдою», без кроків узагалі (як техніка він розібраний у главі про досвідні техніки).

    ФорматЩо фіксуєХто може виконатиЦіна підтримки
    Детальний кейсКожен крок, конкретні дані, точний очікуваний результатБудь-хто, навіть без знання продуктуВисока: старіє з кожною зміною UI
    High-level кейсЩо перевірити й суть кроків, без конкретикиТой, хто знає продуктПомірна: переживає косметичні зміни
    ЧеклистТільки інваріантДосвідчений у продуктіМінімальна

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

    Звідси критерії вибору — вони про контекст, а не про смак:

    • Виконавець. Крауд-тестування, аутсорс, новачки на онбордингу — детально. Стабільна команда, що знає продукт, — high-level або чеклист.
    • Ціна помилки і формальні вимоги. Регульовані домени (медицина, авіоніка, фінанси) вимагають відтворюваності й аудиторського сліду — там детальні кейси не обговорюються.
    • Швидкість змін. Продукт, де UI перемальовують щоспринту, з'їсть будь-яку деталізацію — кроки застаріють раніше, ніж їх виконають удруге.
    • Доля кейсу. Кандидат на автоматизацію логічно тримати high-level: конкретика все одно переїде в код і тестові дані.

    Ні: новачок, аутсорс, крауд

    Так

    Так

    Ні

    Так

    Ні

    Нова перевірка

    Виконавець знає продукт?

    Детальний кейс:
    кроки + конкретні дані

    Регуляторка, аудит,
    потрібна точна відтворюваність?

    UI і флоу змінюються часто?

    Чеклист
    або high-level

    High-level кейс

    Ні: новачок, аутсорс, крауд

    Так

    Так

    Ні

    Так

    Ні

    Нова перевірка

    Виконавець знає продукт?

    Детальний кейс:
    кроки + конкретні дані

    Регуляторка, аудит,
    потрібна точна відтворюваність?

    UI і флоу змінюються часто?

    Чеклист
    або high-level

    High-level кейс

    На практиці зріла сюїта — мікс: детальні кейси для критичних і формально регламентованих флоу, high-level для основної маси, чеклисти для смоуку і досвідних проходів. Погана ознака — не «у нас є чеклисти», а «у нас один рівень деталізації для всього, бо так заведено».

    Незалежність кейсів

    Незалежний кейс можна виконати окремо від решти, у будь-якому порядку, і результат від цього не зміниться. Кожен кейс сам описує свої передумови — а не успадковує стан, який лишив по собі попередній.

    Класичний антипатерн — прихований ланцюжок: кейс 1 створює користувача, кейс 3 редагує його профіль, кейс 7 видаляє. Поки сюїту ганяють цілком і по порядку, все зелене. Проблеми починаються одразу за межами цього сценарію: вибіркова регресія неможлива (кейс 7 окремо не запустиш), падіння кейсу 1 каскадом валить 3 і 7 — у звіті три падіння замість одного реального, а перестановка чи паралельний запуск (докладніше — у розділі про автоматизацію) ламає все мовчки. Порядок виконання став передумовою, якої ніде не записано.

    Ліки прості: усе, що кейсу потрібно, — у його передумовах, і передумови мають бути відтворюваними. «Існує активний користувач з підпискою» — так; «виконано кейс TC-101» — ні. В автоматизації те саме правило звучить як «стан готуємо найкоротшим шляхом, зазвичай через API, а не через UI-ланцюжок»:

    // Передумову створюємо самі через API — кейс самодостатній
    test('архівування проєкту ховає його зі списку', async ({ page, request }) => {
      const res = await request.post('/api/projects', { data: { name: 'tmp-archive' } });
      const { id } = await res.json();
      await page.goto(`/projects/${id}`);
      await page.getByRole('button', { name: 'Архівувати' }).click();
      await page.goto('/projects');
      await expect(page.getByText('tmp-archive')).toBeHidden();
    });

    Playwright свідомо підштовхує до цього: кожен тест отримує чистий контекст браузера, і офіційні best practices прямо формулюють ізоляцію тестів як базове правило. У ручних сюїтах TMS такої огорожі немає — незалежність тримається лише на дисципліні автора.

    Підтримуваність: дублювання, старіння, рев'ю

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

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

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

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

    Окремий важіль підтримуваності — виносити спільне. Повторюваний флоу «створити користувача з підпискою» має жити в одному місці (спільна передумова чи параметризований кейс у TMS, фікстура або хелпер у коді), а не бути скопійованим у сорок кейсів. Тоді зміна флоу — одна правка, а не сорок.

    Антипатерни

    Зведений список того, що найчастіше стріляє в ногу — і чим саме:

    • Кейс-комбайн. 30 кроків, 10 перевірок. Падає на сьомому кроці — про решту нічого не відомо, звіт бреше.
    • «Перевірити, що все працює коректно». Очікуваний результат без критерію — не оракул: два виконавці поставлять різні статуси на тому самому екрані.
    • Назва про дорогу, а не про перевірку. «Відкрити налаштування профілю» — це крок. Що має бути правдою, коли ти туди дійшов?
    • Ланцюжок залежних кейсів. Порядок виконання — прихована передумова; вибіркові прогони й паралельність померли.
    • Крихкі дані в кроках. Дата «31.12.2026», користувач test123, якого хтось видалив. Кейс протухає без жодної зміни продукту — тому дані описують властивістю («дата в майбутньому», «користувач без замовлень»), а конкретику тримають у тестових даних.
    • Клони замість параметризації. Дванадцять кейсів, що різняться одним значенням поля. Це один кейс із таблицею значень (параметри в TMS, цикл по даних у коді) — інакше кожна зміна флоу множиться на дванадцять.
    • Кейс-сирота. Не прив'язаний до жодної вимоги чи умови: незрозуміло, навіщо він, і неможливо вирішити, чи можна його видалити. Саме сироти складають баласт старих сюїт.

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

    • Виглядає як «що детальніше розписано, то професійніша робота», а насправді кожен зайвий крок — це рядок, який застаріє і який хтось муситиме правити. Надлишкова деталізація не додає якості перевірці — вона додає боргу підтримки.
    • Виглядає як «чеклист — незрілий артефакт, справжні QA пишуть повні кейси», а насправді чеклист — свідомо вибраний рівень деталізації для досвідченого виконавця, і ISTQB описує checklist-based testing як повноцінну техніку. Незрілість — це не формат, а невідповідність формату контексту.
    • Виглядає як «атомарність — це один крок на кейс», а насправді атомарність міряється кількістю інваріантів, що перевіряються, а не кроків: підготовчих дій може бути десять, перевірка — одна.
    • Виглядає як «залежні кейси економлять час — не повторюємо сетап», а насправді економія на записі обмінюється на неможливість вибіркових прогонів і каскадні падіння: один реальний баг виглядає як п'ять червоних кейсів.
    • Виглядає як «сюїта написана — робота зроблена», а насправді сюїта деградує сама собою разом зі змінами продукту: без ревізії, правил про застарілі кейси і рев'ю нових вона за рік перетворюється на шум, якому ніхто не вірить.

    Підсумок

    • Один кейс — один інваріант. Атомарність міряється перевіркою, а не кількістю кроків, і саме вона робить статуси прогону читабельними.
    • Назва кейсу відповідає на питання «що зламалося, якщо він упав». Дії та навігація — у кроках, не в назві.
    • Рівень деталізації — компроміс «відтворюваність проти вартості підтримки»; його обирають за виконавцем, ціною помилки і швидкістю змін продукту, а не за звичкою.
    • Незалежний кейс сам описує відтворювані передумови; кейс, який вимагає «спершу виконати TC-101», — це борг, що вб'є вибіркові прогони.
    • Сюїта — продукт: дублікати ловляться трасуванням до вимог, застарілий кейс лагодиться з пріоритетом дефекту, нові кейси проходять рев'ю.

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

    • «Наскільки детально треба писати тест-кейси?» Слабка відповідь — «якомога детальніше». Сильна — назвати фактори: хто виконує, ціна помилки і регуляторні вимоги, швидкість змін продукту, чи піде кейс в автоматизацію. Інтерв'юер перевіряє, чи бачиш ти деталізацію як рішення з ціною.
    • «Чеклист чи тест-кейс — що краще?» Очікують «залежить» із критеріями і розуміння компромісу відтворюваність/підтримка. Бонус — згадати, що зріла сюїта поєднує обидва формати.
    • «Що таке хороший тест-кейс?» Дивляться, чи назвеш ознаки якості (атомарність, назва за перевіркою, незалежність, очікуваний результат із критерієм), а не лише перелік полів зі структури.
    • «У вас 800 кейсів, регресія займає тиждень. Ваші дії?» Перевіряють мислення про сюїту як продукт: ревізія і видалення застарілих, злиття дублікатів через трасування, параметризація клонів, пріоритезація за ризиком, кандидати в автоматизацію.
    • «Чому кейси не повинні залежати один від одного?» Очікують конкретні наслідки: неможливість вибіркових прогонів, каскадні падіння, прихована передумова у вигляді порядку виконання — а не абстрактне «так правильно».
    • «Кейс упав, бо застарів. Що робите?» Сильна відповідь — про гігієну: полагодити або видалити одразу і чому «звичний failed» небезпечніший за відсутність кейсу — він знецінює сигнал усієї сюїти.

    Джерела

    • ISTQB CTFL 4.0 Syllabus — розділ 1.4 (тест-кейси як testware у діяльностях тестування) і 4.4.3 «Checklist-Based Testing»; глава спирається на них у частині термінології.
    • ISTQB Glossary — канонічні означення test case, high-level test case, low-level test case, test suite.
    • ISO/IEC/IEEE 29119-3 Software and systems engineering — Software testing — Part 3: Test documentation — формальний стандарт структури тестової документації, включно зі специфікацією тест-кейсів.
    • Playwright: Best Practices — офіційні рекомендації щодо ізоляції тестів, на які спирається приклад незалежності.