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

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

    Тест-дизайн: від вимоги до перевірки

    Зміст

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

    Без методу тестування — це «потикав, поклікав, начебто працює»: покриття випадкове, дірки невидимі, а кількість кейсів неможливо ні обґрунтувати менеджеру, ні захистити на співбесіді. Ця глава — каркас усього розділу: звідки беруться перевірки, якими вони бувають і як обрати техніку під задачу. Конкретні техніки розберемо в наступних главах — тут карта місцевості.

    Чому вичерпне тестування неможливе

    Почнімо з математики, яка руйнує наївну мрію «перевірити все». Візьмімо звичайне текстове поле на 20 символів. Навіть якщо дозволені лише малі латинські літери, варіантів вводу — 26 у 20-му степені, це приблизно 2×10^28 комбінацій. Перевіряючи мільярд значень на секунду, впораєшся за сотні мільярдів років — Всесвіт молодший.

    І це одне поле. Реальна фіча — це ще й комбінації: форма з пʼяти полів по 10 значень кожне дає 100 000 комбінацій; додай порядок дій користувача, стани системи, браузери, локалі, паралельних користувачів — простір станів вибухає далеко за межі будь-якого бюджету. Тому силабус ISTQB виносить це окремим принципом тестування (другим із семи): вичерпне тестування неможливе — окрім тривіальних випадків.

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

    Ланцюжок: test basis → тестова умова → тест-кейс

    Перевірки не беруться з повітря — вони виводяться. ISTQB описує цей шлях трьома кроками, і на співбесіді словник цих кроків варто знати точно.

    Тестова основа (test basis) — усе, на що ти спираєшся, проєктуючи перевірки: вимоги і user story, приймальні критерії, макети, специфікація API, документація, стандарти, а також знання про типові дефекти. Немає вимог — базою стає те, що є: поведінка попередньої версії, аналоги, здоровий глузд. База гірша — але вона все одно є.

    Тестова умова (test condition) — те, що можна перевірити: окрема властивість, правило, інваріант системи. Це ще не тест — це твердження, яке має виконуватись. Крок від бази до умов називають аналізом.

    Тест-кейс (test case) — конкретизація умови: як саме перевіряємо. Передумови, дані, кроки, очікуваний результат. Це крок дизайну. Далі кейси шикуються у процедури виконання або автотести — але це вже імплементація.

    аналіз: ЩО перевіряти

    дизайн: ЯК перевіряти

    імплементація

    Test basis:
    вимоги, макети,
    специфікація API

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

    Тест-кейси

    Процедури виконання
    або автотести

    аналіз: ЩО перевіряти

    дизайн: ЯК перевіряти

    імплементація

    Test basis:
    вимоги, макети,
    специфікація API

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

    Тест-кейси

    Процедури виконання
    або автотести

    На живому прикладі. Вимога: «Пароль містить від 8 до 64 символів і щонайменше одну цифру».

    • Тестові умови: пароль допустимої довжини з цифрою приймається; коротший за 8 відхиляється; довший за 64 відхиляється; без жодної цифри відхиляється.
    • Тест-кейс для однієї з умов: передумова — відкрита форма реєстрації; дані — пароль longpassword (12 символів, без цифр); крок — сабмит форми; очікуваний результат — акаунт не створено, біля поля зʼявляється повідомлення про обовʼязкову цифру.

    Зверни увагу: одна умова може породити кілька кейсів (відхилення «коротшого за 8» варто перевірити на 7 символах — це вже територія глави «Граничні значення»). ISTQB розрізняє також високорівневі кейси (без конкретних значень: «пароль коротший за мінімум») і низькорівневі (з точними даними) — рівень деталізації обирається під контекст, про це окрема глава «Тест-кейси й чеклисти: рівень деталізації».

    Навіщо проміжний крок з умовами, чому не писати кейси одразу? Бо покриття рахується саме по умовах. Список умов можна звірити з вимогою і побачити дірку («а що з довшим за 64 — ніхто не перевіряє?»); стос готових кейсів без умов — це просто купа, у якій дірок не видно. Звʼязка «вимога ↔ умова ↔ кейс» — основа трасування, до якого дійдемо у главі «Покриття вимог і трасування».

    Декомпозиція фічі на перевірки

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

    • Вхідні дані: поле email — формат, регістр, пробіли по краях, неіснуюча адреса.
    • Потоки: основний (запит листа → перехід за посиланням → новий пароль → вхід) і альтернативні (повторний запит, скасування на півдорозі).
    • Стани: посилання свіже, протерміноване, вже використане — поведінка в кожному стані своя.
    • Правила: вимоги до нового пароля, чи можна повторити старий.
    • Помилки й межі: сервіс пошти недоступний, кілька запитів поспіль.

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

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

    // Одна умова — один тест; назва описує інваріант, а не дію
    test('протерміноване посилання відхиляється з пропозицією запросити нове', async ({ page }) => {
      await page.goto(expiredResetLink);
      await expect(page.getByText('Посилання застаріло')).toBeVisible();
      await expect(page.getByRole('link', { name: 'Надіслати нове' })).toBeVisible();
    });

    Позитивні й негативні перевірки

    Кожну умову можна віднести до одного з двох таборів.

    Позитивна перевірка підтверджує, що система робить те, що обіцяно, на валідних даних і очікуваних діях: коректний email — лист прийшов. Негативна перевіряє, що на невалідних даних чи неочікуваних діях система відмовляє гідно: зрозуміле повідомлення, код 4xx на рівні API, жодних падінь, слідів у базі чи зависань.

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

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

    Три сімʼї технік

    Технік тест-дизайну багато, але класифікація проста — за тим, звідки береться інформація для виведення умов. Силабус ISTQB CTFL 4.0 називає ці групи black-box, white-box і experience-based; українською їх зазвичай називають «специфікаційними», «структурними» й «досвідними».

    СімʼяНа що спираєтьсяПриклади технік
    Специфікаційні (black-box)Вимоги й зовнішня поведінка; код бачити не требакласи еквівалентності, граничні значення, таблиці рішень, переходи станів
    Структурні (white-box)Внутрішня будова: код, гілки, шляхи виконанняпокриття інструкцій і гілок
    Досвідні (experience-based)Досвід, інтуїція, знання типових дефектівпередбачення помилок, чеклисти, дослідницьке тестування

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

    Для мануального QA і AQA робочий хліб — специфікаційні та досвідні. Структурні частіше живуть на рівні unit-тестів у розробників, але розуміти їх треба: питання «чому 100% покриття коду не гарантує якості» — класика співбесід.

    Тестопридатність вимог

    Ланцюжок «вимога → умова → кейс» працює, лише якщо перша ланка притомна. Тестопридатна (testable) вимога — та, з якої можна вивести обʼєктивний критерій pass/fail. Порівняй:

    • «Пошук має працювати швидко» — нетестопридатна: швидко — це скільки? На яких даних? Тест на таку вимогу не напишеш, а результат не захистиш.
    • «Пошук повертає першу сторінку результатів не довше ніж за 2 секунди при каталозі на 100 000 товарів» — тут є число, умови й вимірюваний критерій.

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

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

    Перший орієнтир: яку техніку брати

    Повний розбір вибору й комбінування — у главі «Вибір і комбінування технік», але груба карта потрібна вже зараз: техніку підказує тип логіки у фічі.

    Яка логіка домінує у фічі?

    Діапазони, формати,
    обмеження вводу

    Бізнес-правила:
    комбінації умов

    Обʼєкт живе
    за статусами

    Багато конфігурацій
    і параметрів

    Еквівалентність + межі

    Таблиця рішень

    Переходи станів

    Pairwise

    Специфікації немає
    або час стиснутий

    Досвідні техніки +
    дослідницьке тестування

    Яка логіка домінує у фічі?

    Діапазони, формати,
    обмеження вводу

    Бізнес-правила:
    комбінації умов

    Обʼєкт живе
    за статусами

    Багато конфігурацій
    і параметрів

    Еквівалентність + межі

    Таблиця рішень

    Переходи станів

    Pairwise

    Специфікації немає
    або час стиснутий

    Досвідні техніки +
    дослідницьке тестування

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

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

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

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

    Підсумок

    • Вичерпне тестування неможливе, тому будь-яке тестування — вибірка; тест-дизайн робить її свідомою: максимум знайдених дефектів на мінімум перевірок.
    • Перевірки виводяться ланцюжком: test basis → тестова умова (що перевіряти) → тест-кейс (як саме); покриття і трасування рахуються по умовах.
    • Негативний тест — це перевірка гідної відмови з чітким очікуваним результатом, і таких перевірок зазвичай більше, ніж позитивних.
    • Техніки діляться на специфікаційні, структурні й досвідні — за джерелом інформації; вони доповнюють одна одну, а не конкурують.
    • Нетестопридатна вимога — це дефект, і знайти його на ревʼю дешевше, ніж його наслідки в проді.

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

    • «Протестуйте поле / форму логіну / олівець» — питання №1 у професії. Сильна відповідь починається не з перевірок, а з уточнення вимог і пріоритетів, далі — техніки пошарово. Повний розбір формату — у главі «Класичні задачі співбесід».
    • «Чому не можна протестувати все? І що тоді робити?» — чекають принцип вичерпного тестування + вихід через техніки і ризик, а не «тестуємо скільки встигнемо».
    • «Що таке тест-дизайн? Які техніки знаєте, коли яку застосувати?» — інтервʼюер слухає класифікацію (три сімʼї) і мапінг «тип логіки → техніка», а не завчений перелік назв.
    • «Чим тестова умова відрізняється від тест-кейсу? А тест-кейс від чеклиста?» — перевірка словника: рівень абстракції, наявність конкретних даних і кроків.
    • «Вимога незрозуміла — ваші дії?» — правильний рух: питання аналітику, фіксація припущень, дефект на вимогу; червоний прапорець для інтервʼюера — «придумаю сам, як має бути».

    Наскрізь інтервʼюер оцінює одне: чи є за відповідями система. Кандидат, який назве 10 перевірок хаотично, програє тому, хто назве 8, але згрупує їх за техніками й пояснить, чому саме ці.

    Джерела

    • ISTQB CTFL Syllabus v4.0 — ця глава покриває розділ 1.3 (принципи тестування, зокрема «вичерпне тестування неможливе») і вступ до розділу 4 «Test Analysis and Design» (класифікація технік, тестові умови).
    • ISTQB Glossary — канонічні означення термінів: test basis, test condition, test case, test design, testability.
    • ISO/IEC/IEEE 29119-4:2021 «Software and systems engineering — Software testing — Part 4: Test techniques» — міжнародний стандарт, що формалізує специфікаційні, структурні й досвідні техніки (текст платний).