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

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

    Класичні задачі співбесід: поле, форма, олівець

    Зміст

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

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

    Що насправді перевіряє задача «протестуй X»

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

    Тому оцінюється не кількість названих кейсів, а поведінка:

    • Чи уточнює кандидат контекст, перш ніж відповідати. Питання «а що це за поле і хто ним користується?» — уже плюс.
    • Чи є структура. Відповідь рухається від важливого до другорядного, кейси згруповані за технікою чи типом перевірки, а не вискакують хаотично.
    • Чи стоїть за кейсами техніка. «Перевірю 0, 1, 100 і 101» цінне тоді, коли кандидат може пояснити: це межі діапазону, баги люблять межі.
    • Чи вміє кандидат зупинитися й аргументувати, чому набір достатній. Вичерпне тестування неможливе — це один із семи принципів тестування, і задача «протестуй X» перевіряє, чи кандидат живе за ним, а не лише цитує.

    Іншими словами, «протестуй олівець» — це та сама робота, що й «протестуй нову фічу без нормальної документації», лише стиснута до хвилин. Хто має систему — той відповідає спокійно на будь-який об'єкт, від текстового поля до ліфта.

    Структура сильної відповіді: уточнення → пріоритети → техніки

    Сильна відповідь на будь-яке «протестуй X» має однаковий скелет:

    1. Уточнення
    що це, для кого, які вимоги,
    що вважати багом

    2. Пріоритети
    що зламається найболючіше:
    спершу критичний позитивний сценарій

    3. Техніки
    класи еквівалентності, межі,
    таблиці рішень, стани, досвід

    4. Межа достатності
    чому цього набору вистачає
    і що б я автоматизував

    1. Уточнення
    що це, для кого, які вимоги,
    що вважати багом

    2. Пріоритети
    що зламається найболючіше:
    спершу критичний позитивний сценарій

    3. Техніки
    класи еквівалентності, межі,
    таблиці рішень, стани, досвід

    4. Межа достатності
    чому цього набору вистачає
    і що б я автоматизував

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

    Крок 2 — пріоритети. Спершу — те, заради чого об'єкт існує: базовий позитивний сценарій. Поле приймає валідне значення і зберігає його; логін пускає користувача з правильними даними; олівець пише. Кандидат, який почав з SQL-ін'єкцій і забув перевірити, що поле взагалі працює, провалив пріоритезацію — а саме вона в реальному спринті вирішує, що встигнуть перевірити до релізу. Далі — негативні сценарії за спаданням імовірності та болючості наслідків.

    Крок 3 — техніки, названі вголос. Не «ще перевірю отаке», а «за класами еквівалентності тут три невалідні класи, з кожного беру одного представника». Саме прив'язка кейсів до технік відрізняє системну відповідь від начитаного переліку. Який арсенал до якого типу задачі — окрема тема глави «Вибір і комбінування технік».

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

    «Протестуйте поле вводу»

    Розберімо на робочому припущенні: поле «кількість товару» в кошику, ціле число від 1 до 100, обов'язкове. Далі — техніки по черзі, кожна відповідає на своє питання.

    ТехнікаНа яке питання відповідаєПриклади кейсів
    Класи еквівалентностіЯкі групи значень система обробляє однаково?валідне (42); менше за мінімум; більше за максимум; не число; порожнє
    Граничні значенняДе саме проходить межа і чи немає off-by-one?0, 1, 100, 101
    Небезпечні даніЩо ламає обробку рядка як такого?пробіли, -1, 2.5, 1e2, ведучі нулі, дуже довгий рядок, кирилиця, емодзі
    Передбачення помилокДе розробники зазвичай помиляються саме тут?вставка з буфера замість набору, зміна значення стрілками, швидке подвійне збереження

    Класи еквівалентності дають каркас: один представник з валідного класу і по одному з кожного невалідного — причому кожен невалідний окремим тестом, інакше перший спрацьований захист замаскує решту. Граничні значення уточнюють каркас там, де баги живуть найчастіше: для діапазону 1–100 це чотири точки — 0, 1, 100, 101. Класика «скільки тестів для поля 1–100» розібрана в главі «Граничні значення».

    Третій шар — дані, які ламають не бізнес-правило, а саму обробку вводу: порожній рядок проти рядка з пробілів, +1 і -1, дробові, наукова нотація 1e2, значення довжиною в тисячі символів, невидимі unicode-символи. Повний каталог такої «небезпечної класики» — у главі «Тестові дані». Сюди ж — рядки на кшталт ' OR 1=1 та <script>: на співбесіді досить сказати, що поле має нейтралізувати службові символи, а не виконувати їх; самі атаки — тема розділу про безпеку.

    Окремо — питання рівнів: валідація на фронтенді (атрибути type="number", min, max, required) не скасовує серверної, бо запит можна надіслати повз UI. Сильний кандидат промовляє це явно: «перевірю, що межі тримає не лише браузер, а й API». Це той абзац відповіді, який відрізняє middle від trainee.

    Задача про поле має пряме продовження в автоматизації: класи й межі природно лягають у параметризований тест, де кожен невалідний клас — окремий кейс з власною назвою:

    // Кожен невалідний клас — окремий тест: перший фейл не ховає решту
    const invalidQuantities = [
      { value: '0', reason: 'нижче мінімуму' },
      { value: '101', reason: 'вище максимуму' },
      { value: '', reason: 'порожнє обовʼязкове поле' },
      { value: 'abc', reason: 'не число' },
      { value: '2.5', reason: 'дробове замість цілого' },
    ];
    
    for (const { value, reason } of invalidQuantities) {
      test(`поле «кількість» відхиляє: ${reason}`, async ({ page }) => {
        await page.goto('/cart');
        await page.getByLabel('Кількість').fill(value);
        await page.getByRole('button', { name: 'Зберегти' }).click();
        await expect(page.getByRole('alert')).toContainText('від 1 до 100');
      });
    }

    «Протестуйте форму логіну»

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

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

    Стани і переходи. Логін — це машина станів: розлогінений → залогінений → сесія протухла → повторний вхід. Перевірки: куди редіректить після входу; що бачить залогінений користувач на сторінці логіну; що стається з відкритою вкладкою після логауту в сусідній; чи повертає система на сторінку, з якої вигнало по таймауту сесії. Механіка сесій і cookie розібрана в главі «Кукі, сесії та сховище браузера», техніка — у «Переходах станів».

    Безпека — оглядово, але помітно. Пароль маскується і не потрапляє в URL; повідомлення про помилку не підказує, що саме неправильне — «невірний логін чи пароль», інакше форма стає інструментом перебору імен користувачів (user enumeration); після серії невдалих спроб — обмеження частоти або блокування (чи є така вимога — питання на крок уточнення). Глибина тут не потрібна — потрібен сигнал, що кандидат знає про цей вимір; деталі живуть у розділі про безпеку.

    UX і периферія. Вхід по Enter, фокус на першому полі, коректна поведінка автозаповнення браузера, «запам'ятати мене», лінк відновлення пароля (це окремий флоу — на співбесіді досить його назвати, не розгортаючи).

    Порядок озвучення — знову за пріоритетом: спершу чотири комбінації таблиці рішень, потім стани сесії, потім безпека і UX. Це і є відповідь «за техніками», а не потік свідомості.

    Фізичні об'єкти: олівець, ліфт, банкомат

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

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

    Ліфт. Це задача на переходи станів: стоїть з відчиненими дверима → зачиняє двері → їде → відчиняє. Цікаві місця — конфліктні події: виклик під час руху, кнопка «відчинити» в момент зачинення, одночасні виклики з різних поверхів, перевантаження, аварійна зупинка, поведінка при зникненні живлення. Плюс нефункціональне: час очікування, місткість, доступність для людей на візках.

    Банкомат. Задача на таблиці рішень (картка валідна × PIN правильний × коштів достатньо × ліміт не вичерпано) плюс стани (сесія з таймаутом: що стається з карткою і грошима, якщо користувач пішов) плюс безпека (ліміт невдалих спроб PIN — класично три, повернення картки, екран не показує баланс стороннім). Гроші роблять пріоритети очевидними: спершу сценарії, де користувач може втратити кошти або картку.

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

    Скільки кейсів достатньо

    Улюблене продовження інтерв'юера: «то скільки тестів ви напишете для цього поля?» Пастка в тому, що правильна відповідь — не число, а спосіб його отримати.

    Аргументація будується так: вичерпний перебір неможливий і не потрібний — усередині класу еквівалентності всі значення рівноцінні, тож достатньо по одному представнику з кожного класу плюс точки на межах плюс кейси під конкретні ризики. Для поля 1–100 це виходить приблизно так: один валідний представник, межові 0/1/100/101 (представники валідного класу на межах і невалідних одразу за ними), по одному на кожен нечисловий клас (порожнє, текст, дробове) — разом 8–9 кейсів. Число саме по собі нічого не варте; вага у фразі «кожен кейс ловить свій клас дефектів, жоден не дублює інший».

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

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

    • Одразу сипати кейсами. Виглядає як досвід і швидкість, а насправді — відсутність системи: без уточнень кандидат тестує об'єкт, якого немає в задачі, і інтерв'юер бачить хаотичний перелік замість методу.
    • Назвати 50 кейсів без пріоритетів. Виглядає як ретельність, а насправді — нездатність відрізнити критичне від екзотики. Реальний спринт не дає часу на все; кандидата без пріоритетів доведеться пріоритезувати комусь іншому.
    • Почати з екзотики й забути happy path. Емодзі, ін'єкції, довгі рядки — а «поле приймає валідне значення і зберігає його» так і не прозвучало. Виглядає як глибина, а насправді — провалений перший пріоритет.
    • Промовляти назви технік без застосування. «Тут я б використав класи еквівалентності» — і жодного класу. Виглядає як знання теорії, а насправді — завчені слова; інтерв'юер завжди попросить показати класи, і пауза після цього питання коштує дорожче, ніж якби техніку не згадували.
    • Тестувати лише UI. Кандидат перевіряє браузерну валідацію і зупиняється, хоча запит повз UI понесе на сервер будь-що. Виглядає як повний розбір поля, а насправді — половина поверхні.
    • Мовчазні припущення. Кандидат вирішив, що поле — це пошук, інтерв'юер мав на увазі кількість товару; десять хвилин відповіді — у смітник. Озвучене припущення коштує одне речення і рятує всю відповідь.

    Підсумок

    • Задача «протестуй X» перевіряє метод, а не пам'ять: уточнення → пріоритети → техніки → аргументована межа достатності.
    • Перше питання завжди про контекст і вимоги; якщо вимог немає — припущення формулюються вголос.
    • Перший кейс — завжди базовий позитивний сценарій; негативні йдуть за спаданням ризику.
    • Кожен кейс прив'язаний до техніки й ловить власний клас дефектів; кейс, який нічого нового не ловить, — зайвий.
    • Кількість тестів не називається з повітря — вона виводиться з класів, меж і ризиків, і так само аргументовано скорочується, коли часу мало.

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

    Типові формулювання: «протестуйте це поле вводу», «як би ви тестували форму логіну?», «протестуйте олівець / ліфт / банкомат / двері», «скільки тестів потрібно для поля з діапазоном 1–100?», «а якщо у вас час лише на три перевірки?», «які техніки ви щойно застосували?».

    Інтерв'юер дивиться на порядок дій: чи прозвучали уточнювальні питання до першого кейсу; чи почалася відповідь з позитивного сценарію; чи згруповані кейси за техніками і чи може кандидат назвати техніку за власним кейсом; чи вміє він зупинитися й пояснити, чому набір достатній. Окремий сигнал сеньйорності — згадка про рівні (UI проти API), про ризик як критерій глибини і спокійна реакція на «а тепер скоротіть удвічі». Формат подачі відповіді на співбесіді загалом — тема розділу про співбесіди; тут головне, що змістовна частина відповіді будується рівно з технік цього розділу.

    Джерела