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

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

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

    Зміст

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

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

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

    Почнімо з означення. Тест-кейс (test case) — це набір , вхідних даних, дій (where applicable), очікуваних результатів і постумов, виведений з . Дві деталі несучі. Перша: модальність where applicable стоїть саме при діях — кейс без розписаних кроків усе одно кейс, тож кількість кроків його не визначає. Друга: вхід кейса — тестова умова (test condition), «аспект обʼєкта, який можна перевірити», а не вимога напряму.

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

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

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

    • Вибіркові прогони. збирають з атомарних кейсів під конкретний ; кейс-комбайн або тягне зайве, або лишає діру.
    • Чесна статистика. «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, чеклист

    Той самий інваріант можна записати трьома способами, і два з них означені в дослівно. Низькорівневий (low-level) кейс — кейс із конкретними значеннями передумов, вхідних даних, очікуваних результатів, постумов і з детальним описом дій. Високорівневий (high-level) — той самий склад, але значення абстрактні. Ключове: різниця не в довжині опису, а в наявності конкретики.

    Щабель вище — чеклист. Чеклист-тестування (checklist-based testing) — це техніка, у якій тести проєктують, реалізують і виконують, щоб покрити тестові умови з чеклиста, а сам чеклист будується на досвіді, знанні того, що важливо користувачеві, і розумінні, чому й як ПЗ ламається. Форма пунктів теж описана: їх часто формулюють питанням, і кожен має перевірятися окремо й безпосередньо. Названо й те, чого в чеклисті бути не повинно: автоматично перевірюваного, того, що краще працює як /виходу, і надто загального — саме сюди потрапляє класичне «перевірити, що все працює».

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

    Це не шкала «погано — краще», а компроміс, названий у джерелі прямо: за відсутності детальних кейсів чеклист дає орієнтири й певний ступінь узгодженості, а якщо чеклисти високорівневі, «some variability in the actual testing is likely to occur» — звідси «потенційно більше покриття ціною меншої повторюваності». Це один вибір, а не дві незалежні властивості: хто виконує високорівневу перевірку, той сам добирає конкретні значення, тому результат залежить від виконавця. Не дефект формату, а його ціна.

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

    Ні

    Так

    Так

    Ні

    Так

    Ні

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

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

    Низькорівневий кейс:
    конкретні значення й кроки

    Потрібна точна
    повторюваність?

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

    Чеклист

    Високорівневий кейс

    Ні

    Так

    Так

    Ні

    Так

    Ні

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

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

    Низькорівневий кейс:
    конкретні значення й кроки

    Потрібна точна
    повторюваність?

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

    Чеклист

    Високорівневий кейс

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

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

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

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

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

    Автоматизація ту саму вимогу формулює жорсткіше. Дока Playwright ставить ізоляцію базовим правилом: кожен тест має бути повністю ізольований від інших — із власними localStorage, sessionStorage, даними й кукі; ізоляція покращує відтворюваність, спрощує дебаг і запобігає каскадним падінням. Названо й три конкретні наслідки: падіння не переноситься на сусідів, один тест можна ганяти скільки завгодно, і не треба думати про порядок у паралельному прогоні та . Стратегій ізоляції дві — починати з нуля або прибирати між тестами; друга ненадійна, бо про легко забути, а дещо (відвідані посилання) прибрати взагалі неможливо.

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

    У ручних сюїтах TMS (test management system) такої огорожі немає — незалежність тримається на дисципліні автора. Правило те саме: усе, що кейсу потрібно, стоїть у його передумовах, і передумови мають бути відтворюваними. «Існує активний користувач із підпискою» — так; «виконано кейс TC-101» — ні. В автоматизації це означає готувати стан найкоротшим шляхом:

    // Передумову створюємо самі через 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();
    });

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

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

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

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

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

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

    Антипатерни

    Наша практика (не канон). Перелік нижче зібраний із того, що ми найчастіше бачили в живих сюїтах; окремого канонічного каталогу антипатернів тест-кейса джерела не дають, тож блоку джерел у цього підрозділу немає.

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

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

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

    Підсумок

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

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

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

    Джерела

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

    • ISTQB Glossary — означення тест-кейса (передумови, входи, дії where applicable, очікувані результати, постумови, виведені з тестових умов) і тестової умови.
    • ISTQB Certified Tester Foundation Level Syllabus v4.0 (копія astqb.org) — §4.5.3: неповторюваність «no two test cases should describe the same characteristics of the user story» і покриття всіх характеристик історії без виходу за неї.

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

    • ISTQB Glossary — дослівні означення обох сторін пари: high-level test case через абстрактні передумови, дані, результати й постумови, low-level test case — через конкретні значення й детальний опис дій.
    • ISTQB Certified Tester Foundation Level Syllabus v4.0 (копія astqb.org) — §4.4.3: техніка цілком — покриття тестових умов із чеклиста і три джерела наповнення, форма пункту, три заборони на вміст, компроміс «potentially greater coverage but less repeatability» і 10 евристик Нільсена як готовий приклад чеклиста.
    • Jakob Nielsen — 10 Usability Heuristics for User Interface Design — автор називає евристики широкими емпіричними правилами, а не конкретними гайдлайнами.

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

    • Playwright — Best Practices — вимога повної ізоляції кожного тесту (власні localStorage, sessionStorage, дані, кукі) і три вигоди: відтворюваність, простіший дебаг, відсутність каскадних падінь.
    • Playwright — Test Isolation (browser contexts) — три наслідки ізоляції і дві стратегії: починати з нуля або прибирати між тестами, причому дещо прибрати неможливо.
    • xUnit Test Patterns — Erratic Test — причина взаємодії тестів (спільна фікстура) і маркер: тест зелений соло й червоний у сюїті після додавання чи вилучення сусіда.
    • xUnit Test Patterns — Fresh Fixture — свіжа фікстура на кожен тест запобігає нестабільним тестам.
    • ISTQB Certified Tester Foundation Level Syllabus v4.0 (копія astqb.org) — ціна залежності для розкладу: якщо пріоритетніший кейс залежить від менш пріоритетного, першим мусить виконатися менш пріоритетний.

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

    • ISTQB Certified Tester Foundation Level Syllabus v4.0 (копія astqb.org) — §4.4.3: механізм старіння чеклистів, вимога регулярно оновлювати їх за аналізом дефектів і застереження не давати переліку розростатися; §4.5.3: неповторюваність кейсів; окремими розділами того самого силабуса — ревʼю за чеклистом як техніка і керування конфігурацією, що тримає тестові умови, кейси й скрипти конфігураційними одиницями.
    • Playwright — Best Practices — дозвіл на невелике дублювання в простих тестах, якщо воно робить їх зрозумілішими й легшими в підтримці.

    Пояснення

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

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

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