Тестове завдання
Зміст
Тестове завдання (test assignment, home task) — це етап воронки найму, де компанія перевіряє не що ти знаєш, а як ти працюєш. Технічна секція показує ерудицію під тиском; тестове показує твій робочий продукт: як ти декомпонуєш недоописану задачу, що вважаєш важливим, як оформлюєш результат, коли ніхто не стоїть над душею. Для QA це майже ідеальний фільтр, бо саме це і є щоденна робота — узяти сиру фічу, вигадати перевірки, розставити пріоритети й віддати артефакт, зрозумілий іншим.
Але тестове має два боки. Зроблене добре, воно витягує кандидата навіть після посередньої усної розмови — бо артефакт лишається й говорить сам за себе, коли емоції співбесіди вже забулись. Зроблене погано, воно з'їдає вихідні на тестування чужого продукту без жодного фідбеку. Ця глава — про те, як зробити тестове сильно й швидко, і де провести межу, за якою воно перетворюється на безкоштовну працю.
Формати тестового: що саме просять
Попри різноманіття формулювань, майже всі тестові для QA зводяться до трьох форматів. Розпізнати формат — перший крок, бо він диктує, який артефакт від тебе чекають.
Тест-кейси або чекліст для фічі. Дають опис фічі, макет у Figma, посилання на демо-застосунок чи просто словесну постановку («форма реєстрації», «сторінка кошика») — і просять спроєктувати перевірки. Очікуваний артефакт: структурований набір тест-кейсів або чекліст, часто в Google Sheets чи документі. Це найпоширеніший формат для Manual QA junior.
Пошук і оформлення багів. Дають навмисно зламаний білд, тестовий сайт або відео — і просять знайти дефекти та завести їх як багрепорти. Тут перевіряють не лише спостережливість, а й якість оформлення: чи є чіткі кроки відтворення, фактичний і очікуваний результат, severity, докази (скриншот, лог, HAR-файл із вкладки Network — див. «DevTools: вкладка Network і дебаг»).
Автотест-проєкт для AQA. Дають публічний застосунок (класика — демо-магазини на кшталт saucedemo чи публічне REST API) і просять покрити його автотестами. Очікуваний артефакт: репозиторій з кодом, який рецензент клонує й запускає. Це найважчий формат за трудомісткістю й найпоказовіший, бо показує не тільки тест-дизайн, а й інженерну культуру.
Іноді формати комбінують: спершу чекліст, потім автоматизація частини кейсів. Якщо формат із постановки неясний — це перше, що варто уточнити в рекрутера, а не вгадувати.
Що насправді оцінюють
Кандидати часто думають, що виграє той, хто написав більше кейсів або знайшов більше багів. Це хибний орієнтир. Рецензент зазвичай витрачає на одне тестове 10–20 хвилин і читає його як робочий артефакт від майбутнього колеги. Він шукає три речі.
Покриття (coverage). Не кількість, а розподіл: чи є негативні перевірки й крайові значення, а не лише happy-path; чи видно, що за кейсами стоять техніки тест-дизайну — класи еквівалентності, граничні значення, таблиці рішень — навіть якщо ти їх не називаєш уголос. Форма реєстрації, покрита лише перевіркою «ввів валідні дані — зареєструвався», — це провал, хоч би яка гарна була таблиця.
Пріоритезація (prioritization). Найважливіший і найрідший навик у junior. Порядок кейсів має говорити, що для тебе критичне: спершу критичний шлях (critical path) і сценарії з найбільшим ризиком, потім другорядне. Якщо всі 40 кейсів звалені в купу з однаковою вагою, рецензент не бачить твого мислення. Уміння сказати «ось ці 10 перевірок я пройшов би першими, якби мав годину» цінніше за 40 рівноцінних рядків.
Оформлення. Артефакт має читатись без твоїх пояснень: єдиний формат кейсу, зрозумілі назви, які описують перевірку, а не дію, консистентність. Неохайне тестове читається як сигнал, що й баг-репорти в роботі будуть такими ж.
| Критерій | Слабко | Сильно |
|---|---|---|
| Покриття | Лише happy-path | Позитивні + негативні + крайові |
| Пріоритезація | Усе в купі, рівна вага | Видно критичний шлях і ризики |
| Оформлення | Різнобій, «клік туди-сюди» | Єдиний формат, назва = перевірка |
| Припущення | Мовчазні здогади | Явно виписані на початку |
Останній рядок — про те, чого не оцінюють прямо, але що вирізняє сильного кандидата: явно зафіксовані припущення. Тестове завжди недоописане навмисно. Той, хто на початку пише «припускаю, що поле email обов'язкове й валідується за RFC, ліміт 254 символи», показує аналітичне мислення краще, ніж той, хто просто вгадав і мовчки протестував.
Скоуп і час: головна пастка тестового
Тестове недоописане не через недбалість замовника, а свідомо: невизначеність — частина перевірки. І тут ховається головна пастка. Задачу «протестуйте форму логіну» можна розкрити на пів години, а можна закопатися в неї на два дні — локалі, таймзони, unicode, конкурентні сесії, доступність. Кандидат, який намагається покрити все, або вигорає й здає із запізненням, або віддає розмите полотно без фокусу.
Тому дисципліна тут така сама, як у горящому релізі: зафіксуй скоуп сам, якщо його не зафіксували за тебе. Практично це означає почати артефакт не з кейсів, а з короткого блоку:
- Припущення (assumptions) — що ти вважаєш правдою за браку вимог.
- У скоупі / поза скоупом — що ти тестуєш, а що свідомо лишаєш (наприклад, «навантаження й безпека поза скоупом цього завдання»).
- Питання, які я б поставив — те, що в реальній роботі уточнив би в аналітика. Це показує, що ти не вигадуєш вимоги мовчки.
Далі — таймбокс (timebox). Постав собі ліміт (типово 2–4 години) і в кінці напиши, скільки часу витратив. Це не слабкість, а зрілість: рецензент бачить, що ти вмієш дати сфокусований результат у рамках, а не тонеш у переліку. Глибокий зріз одного критичного шляху майже завжди сильніший за поверхневе «все потроху». Краще п'ять продуманих кейсів логіну з негативами й межами, ніж тридцять рядків, де кожен — просто ще одна варіація happy-path.
Тестове для AQA: проєкт, який запускається однією командою
Для автотест-проєкту діє жорстке правило, про яке junior часто не здогадується: найперший фільтр — чи воно взагалі запускається. Рецензент — зайнятий інженер. Якщо він клонує репозиторій, а той не стартує, вимагає ручного налаштування бази чи падає на першій команді, він закриває вкладку, не дочитавши жодного тесту. Найелегантніший код нічого не важить, якщо до нього не дійшли.
Звідси конкретні вимоги до проєкту.
README — не формальність, а вхідні двері. Він має відповісти на чотири питання за 30 секунд: що це, як установити, як запустити, що покрито. Мінімальний, але повний README:
# QA Test Assignment — Імʼя Прізвище
## Що це
Автотести для демо-магазину на Playwright + TypeScript.
## Вимоги
- Node.js 22+
## Запуск
npm ci
npm test
## Що покрито
- Логін: валідний, заблокований юзер, порожні поля
- Кошик: додавання, зміна кількості, оформлення замовлення
## Рішення й компроміси
- Дані готую через API, не клікаю UI — швидше й стабільніше
- Оплату лишив поза скоупом: залежить від зовнішнього провайдера
## Що додав би з більшим часом
- Крос-браузерний прогін і візуальні перевірки
Запуск однією командою. Ідеал — npm ci && npm test. У package.json пропиши скрипт, щоб npm test запускав npx playwright test; не змушуй читача гадати. Жодних кроків «спершу підніми Docker, потім заповни .env руками» без крайньої потреби. Якщо змінні оточення потрібні — дай .env.example зі значеннями за замовчуванням.
Структура, яку видно. Навіть у трьох тестах покажи інженерну культуру: локатори за пріоритетом (getByRole, getByLabel, data-testid), а не крихкі XPath; сторінки як page object, а не копіпаст; підготовка стану через API замість кліків; жодних waitForTimeout із магічним числом — тільки web-first очікування. Один охайний тест каже про тебе більше, ніж двадцять скопійованих.
import { test, expect } from '@playwright/test';
test('заблокований юзер бачить помилку логіну', async ({ page }) => {
await page.goto('/login');
await page.getByLabel('Username').fill('locked_out_user');
await page.getByLabel('Password').fill('secret_sauce');
await page.getByRole('button', { name: 'Login' }).click();
await expect(page.getByRole('alert')).toContainText(/locked out/i);
});
Головний принцип — маленьке й робоче замість великого й зламаного. Три-п'ять тестів, які запускаються з першого разу й покривають критичний шлях, б'ють недописаний «фреймворк» на 500 рядків, що падає на старті. Overengineering тут — не плюс, а червоний прапорець: ти вирішуєш проблеми, яких ще немає.
Подача і обґрунтування
Артефакт — лише половина. Друга половина — як ти його подаєш і захищаєш, бо тестове майже завжди має продовження: дзвінок, де питають «чому ти протестував це, а не те» і «що додав би, якби мав більше часу».
Тому до самого артефакту додай короткий супровід: припущення, що і чому ти пріоритизував, відомі прогалини, план на «якби більше часу». Для автопроєкту це секції README; для чекліста — вступний абзац. Цей супровід перетворює твої свідомі компроміси з невидимих на прочитані. Різниця величезна: «оплату не покрив, бо це залежить від зовнішнього провайдера й потребує тестових карток — виніс поза скоуп» звучить як інженерне рішення, а мовчазна відсутність оплати — як недогляд.
На захисті будь готовий обґрунтувати кожен вибір. Сильний хід — визнавати межі відкрито: «happy-path оформлення я не автоматизував свідомо, бо він найдорожчий у підтримці й найкрихкіший — я б покрив його вручну». Чесне «ось що я не встиг і чому» завжди сильніше, ніж удавана повнота, яку інтерв'юер за хвилину розколупає одним уточнювальним питанням.
Межа розумного: коли це вже безкоштовна праця
Не всяке «тестове» чесне. Частина завдань — це замаскована безкоштовна праця: тебе просять протестувати реальну продакшн-фічу компанії, скласти повну тест-стратегію їхнього продукту або написати автоматизаційний каркас, який вони потім заберуть. Junior особливо вразливий: він вкладає 15–20 годин, аби «точно взяли», а у відповідь отримує тишу.
Ознаки чесного завдання: обмежений обсяг (реально 2–4 години), синтетична або публічна ціль (демо-застосунок, тренувальне API), чіткий бриф, і компанія готова дати фідбек. Ознаки сумнівного: тестуєш їхній реальний продукт із розмитим «знайдіть у нас баги й побачимо», необмежений скоуп, прохання зробити повноцінний фреймворк, кілька раундів безоплатної роботи поспіль.
Що з цим робити — без конфронтації, але й без наївності. По-перше, таймбокс рятує в будь-якому разі: постав собі стелю годин незалежно від амбіцій завдання й віддай сфокусований зріз із поміткою «ось приблизно N годин роботи, радо обговорю решту на дзвінку». По-друге, доречно заздалегідь спитати рекрутера про очікуваний обсяг і час — адекватна компанія відповість спокійно, а роздратування у відповідь саме по собі є відповіддю. Систематичні тестові-експлуатація — це вже тема червоних прапорців процесу; докладніше — у главі «Червоні прапорці й відмови».
Типові помилки
- Тестую все підряд. Виглядає як ретельність, а насправді дає розмите полотно без пріоритетів — рецензент не бачить, що для тебе критичне.
- Проєкт не запускається / немає README. Виглядає як «код же є», а насправді рецензент закриває репозиторій, не дочитавши жодного тесту.
- Тільки happy-path. Виглядає як «основне покрито», а насправді відсутність негативних і крайових перевірок — головна ознака junior, який не володіє тест-дизайном.
- Купа кейсів без пріоритету. Виглядає як велике покриття, а насправді ховає невміння відрізнити критичне від другорядного.
- Мовчазні припущення. Виглядає як «я ж протестував», а насправді ти вгадав вимоги й не показав аналітичного мислення, яке й оцінюють.
- Overengineering фреймворку. Виглядає як сильна інженерія, а насправді — недописаний каркас на 500 рядків, що падає на старті, замість трьох робочих тестів.
- 15–20 годин на безкоштовне тестове. Виглядає як старанність, а насправді ти без таймбоксу тестуєш чужий продукт задарма, часто без гарантії навіть фідбеку.
- Скопійоване чи повністю AI-згенероване рішення без розуміння. Виглядає як готова робота, а насправді валиться на першому ж «чому тут саме так» на захисті.
Підсумок
- Тестове перевіряє не обсяг знань, а робочий продукт: як ти декомпонуєш недоописану задачу й оформлюєш результат для інших.
- Оцінюють три речі — покриття (позитив + негатив + межі), пріоритезацію (видно критичний шлях) і оформлення; кількість кейсів сама по собі не важить.
- Скоуп фіксуй сам: припущення, у скоупі/поза скоупом, питання до аналітика й таймбокс — глибокий зріз б'є поверхневе «все потроху».
- Для AQA перший фільтр — запуск однією командою з README; маленьке й робоче сильніше за велике й зламане.
- Захист не менш важливий за артефакт: обґрунтуй компроміси відкрито, а безмежне тестове в таймбокс — щоб не працювати задарма.
Що питають на співбесіді
- «Чому ви протестували саме це, а не інше?» Дивляться на пріоритезацію й ризик-орієнтоване мислення: чи можеш ти назвати критичний шлях і пояснити вибір, а не «ну, встиг стільки».
- «Що б ви додали / покрили ще, якби мали більше часу?» Дивляться, чи усвідомлюєш ти власні прогалини й чи є в тебе картина повного покриття понад зданий зріз.
- «Скільки часу ви витратили і чому зупинилися?» Дивляться на зрілість роботи зі скоупом і таймбоксом, а не на готовність працювати нескінченно.
- «Проведіть по своєму рішенню — які припущення ви зробили?» Дивляться на аналітику: чи виписав ти невизначеності явно, чи мовчки вгадав вимоги.
- (Для AQA) «Чому така структура / такі локатори / чому саме тут мок?» Дивляться, чи розумієш ти власний код і рішення, чи скопіював їх без розуміння.
Формат «протестуйте поле / форму / об'єкт», з якого часто виростає тестове, розібрано у главах «Технічна співбесіда Manual QA» і «Лайвкодинг для AQA». Де тестове стоїть у загальній воронці найму — у главі «Ринок і процес найму: від відгуку до офферу».
Джерела
- ISTQB® Certified Tester Foundation Level Syllabus v4.0 — розділ 4 «Test Analysis and Design» (техніки тест-дизайну й покриття) і розділ 5 (пріоритезація та ризики). Саме ці навички тестове й вимірює, хай і без згадки самого формату.
- Playwright — Installation & Getting Started — офіційний старт проєкту: структура, конфіг і запуск, з якого зручно почати автотест-тестове.
- npm ci — npm Docs — чому
npm ciдає відтворюване, чисте встановлення залежностей заpackage-lock.json, і чому це правильна перша команда в README тестового.
Що таке тестове завдання і що саме воно перевіряє?
Тестове (test assignment, home task) — етап воронки найму, де компанію цікавить не обсяг твоїх знань, а манера роботи наодинці з задачею. Усна технічна секція міряє ерудицію під тиском розмови; тестове віддає рецензенту готовий продукт — видно, як ти розбираєш сиру постановку на частини, що вважаєш вартим уваги і як оформлюєш результат, коли ніхто не підказує. Для QA це майже дзеркало щоденної роботи: узяти недоописану фічу, вигадати перевірки, розставити пріоритети й здати артефакт, зрозумілий колезі. Тому й фільтр показовий — усне «я володію технікою тест-дизайну» легко проговорити, а тестове показує, чи справді ти нею користуєшся.
Які основні формати тестового трапляються для QA?
Попри різні формулювання, майже все зводиться до трьох типів, і розпізнати тип — перше, що варто зробити, бо він задає очікуваний артефакт. Перший — спроєктувати перевірки для фічі за описом, макетом чи демо; на виході набір тест-кейсів або чекліст, найтиповіший варіант для manual junior. Другий — знайти дефекти в навмисно зламаному білді й оформити їх багрепортами; тут дивляться і на спостережливість, і на якість оформлення. Третій — покрити публічний застосунок автотестами, з віддачею репозиторію, який рецензент клонує й запускає; найважчий за трудомісткістю формат для AQA. Іноді типи комбінують (спершу чекліст, потім автоматизація частини), а якщо формат із постановки неясний — це перше, що варто уточнити в рекрутера, а не домислювати.
На що дивиться рецензент, коли читає тестове?
Він витрачає на одне тестове хвилин десять-двадцять і читає його як робочий артефакт майбутнього колеги, шукаючи три речі. Перше — покриття: не кількість кейсів, а їхній розподіл, чи є негативні сценарії й крайові значення поряд із happy-path, чи відчутно за ними техніки тест-дизайну. Друге — пріоритезацію: чи видно з порядку кейсів, що для тебе критичне, а що другорядне. Третє — оформлення: чи читається артефакт без твоїх усних пояснень, чи єдиний у ньому формат і чи назви описують перевірку, а не дію. Неявний четвертий сигнал — явно виписані припущення, які відрізняють аналітика від того, хто мовчки вгадав вимоги.
Чому більша кількість кейсів чи знайдених багів не робить тестове сильнішим?
Бо рецензент читає не рядки, а мислення за ними, і купа рівноцінних кейсів це мислення радше ховає. Сорок перевірок, звалених без пріоритету, з однаковою вагою, не кажуть, що для тебе критичне, а що ти дописав «щоб було» — виходить розмите полотно. П'ять продуманих кейсів логіну з негативами й межами важать більше за тридцять варіацій одного happy-path, бо демонструють вибір і тест-дизайн. Те саме з багами: десять дрібних косметичних знахідок слабші за три добре оформлені дефекти з чіткими кроками, у яких видно розуміння severity. Обсяг сам собою — не аргумент; аргумент — що саме ти вирішив покрити першим і чому.
Що таке пріоритезація в тестовому і чому її називають найрідшим навиком junior?
Пріоритезація — це коли з порядку і акцентів твого артефакту зрозуміло, які перевірки ти пройшов би першими, якби мав лише годину. Спершу критичний шлях (critical path) і сценарії з найбільшим ризиком, потім усе другорядне — така послідовність сама говорить за твоє мислення. Junior найчастіше грішить рівним списком, де все важливе однаково, бо здається, що «розставити пріоритети» — це необов'язкова прикраса; насправді саме тут видно зрілість. Уміння сказати «ось ці десять — головні, решта — за наявності часу» цінніше за повний, але пласкій перелік. Це прямий сигнал ризик-орієнтованого мислення, якого й чекають від тестувальника.
Навіщо на початку тестового явно виписувати припущення?
Тому що будь-яке тестове недоописане навмисно, і те, що ти робиш із цими прогалинами, — частина перевірки. Рядок на кшталт «припускаю, що email обов'язковий, валідується за RFC, ліміт 254 символи» показує аналітичне мислення краще, ніж мовчазний здогад, за яким рецензент не бачить, свідомий він чи випадковий. Явні припущення перетворюють невизначеність на прочитане рішення: видно, що ти помітив діру у вимогах і закрив її обґрунтовано, а не проігнорував. Це також страхує тебе на захисті — ти вже зафіксував, з якими вхідними працював, і претензія «а чому не врахував X» знімається посиланням на власний список. Дешевий за зусиллями хід, який відразу відрізняє кандидата, що думає, від того, що вгадує.
Що таке скоуп-блок і з чого він складається?
Скоуп-блок — короткий вступ, з якого починається сильний артефакт замість того, щоб одразу сипати кейсами. У ньому три частини: припущення (що ти вважаєш правдою за браку вимог), межа скоупу (що тестуєш, а що свідомо лишаєш поза, наприклад навантаження й безпеку) і питання, які поставив би аналітику в реальній роботі. Разом вони фіксують правила гри, які замовник не прописав, і показують, що ти не вигадуєш вимоги мовчки. Це та сама дисципліна, що й у горящому релізі: якщо скоуп не зафіксували за тебе — зафіксуй його сам. Без цього блоку навіть добрі кейси читаються як «протестував що встиг», а з ним — як усвідомлений зріз.
Що таке таймбокс і чому написати «витратив N годин» — не слабкість?
Таймбокс (timebox) — свідомо поставлений собі ліміт часу (типово дві-чотири години), у який ти вкладаєш роботу й про який чесно звітуєш наприкінці. Це не зізнання в лінощах, а сигнал зрілості: рецензент бачить, що ти вмієш дати сфокусований результат у рамках, а не тонеш у безкінечному переліку. Глибокий зріз одного критичного шляху майже завжди виграє в поверхневого «все потроху», бо перше показує тест-дизайн, а друге — лише витривалість. До того ж таймбокс рятує від головної пастки формату: задачу «протестуйте форму логіну» можна закопати на два дні через локалі, таймзони й конкурентні сесії, а можна дати сильний зріз за пів дня. Рамка тут — інструмент фокусу, а не виправдання.
Чому «протестувати все підряд» — програшна стратегія?
Бо вона виглядає як ретельність, а дає розмите полотно без фокусу. Тестове завжди можна розкрити нескінченно — додати локалі, unicode, доступність, конкурентні сесії, — і той, хто женеться за повнотою, або вигорає й здає із запізненням, або віддає широкий, але неглибокий перелік, де кожен кейс — ще одна варіація happy-path. Рецензент у такому полотні не бачить, що для тебе критичне, бо все подано з рівною вагою. Замість ширини виграє глибина по одному-двох напрямках: краще ретельно покрити критичний шлях із негативами й межами, ніж торкнутися всього по верхах. «Все підряд» — це не покриття, а відмова від пріоритезації, і читається саме так.
Для автотест-проєкту — чому найперший фільтр не якість коду, а те, чи він запускається?
Тому що рецензент — зайнятий інженер, і якщо клонований репозиторій не стартує, вимагає ручного налаштування бази чи падає на першій команді, він закриває вкладку, не дочитавши жодного тесту. Найелегантніший код нічого не важить, якщо до нього фізично не дійшли — оцінюють лише те, що вдалося запустити. Тому послідовність рецензування жорстка: спершу питання «чи є README з командою запуску», потім «чи тести взагалі проходять», і лише після цього — читання структури й рішень. Провал на першому кроці обнуляє все решту, хоч би яким гарним був тест-дизайн усередині. Звідси практичний висновок: перед відправкою клонуй проєкт у чисту теку й пройди сценарій рецензента сам.
Що обов'язково має бути в README тестового автопроєкту?
README — це вхідні двері, і воно мусить за пів хвилини відповісти на чотири питання: що це, як установити, як запустити, що покрито. Мінімум — назва й стек, вимоги до оточення (наприклад, версія Node.js), команда запуску в один-два рядки і список покритого функціоналу. Сильний README додає ще дві секції — «рішення й компроміси» (чому дані готуєш через API, чому оплату лишив поза скоупом) і «що додав би з більшим часом». Ці розділи перетворюють твої свідомі рішення з невидимих на прочитані: рецензент бачить інженерну логіку, а не здогадується про неї. Ідеал запуску — npm ci && npm test без кроків «спершу підніми Docker, потім заповни .env руками»; якщо змінні потрібні — поклади .env.example зі значеннями за замовчуванням.
Що навіть у трьох тестах показує рецензенту твою інженерну культуру?
Дрібниці, які видно з першого файлу. Локатори за пріоритетом — getByRole, getByLabel, data-testid замість крихких XPath, прив'язаних до розмітки. Сторінки, винесені в page object, а не скопійовані селектори в кожному тесті. Підготовка стану через API замість того, щоб клікати той самий флоу мишею перед кожною перевіркою. Жодних waitForTimeout із магічним числом — тільки web-first очікування, які самі дочікуються потрібного стану. Один охайний тест, зроблений так, каже про тебе більше, ніж двадцять скопійованих: рецензент екстраполює цю акуратність на те, як ти писатимеш увесь фреймворк у роботі.
Чому надмірна інженерія (overengineering) у тестовому — червоний прапорець, а не плюс?
Бо вона майже завжди означає недописаний каркас, що падає на старті, замість кількох робочих тестів. Junior інколи будує «фреймворк» на п'ятсот рядків з фабриками, обгортками й абстракціями під задачу, у якій три сценарії, — і не встигає довести його до зеленого прогону. Рецензент читає це не як силу, а як невміння відрізнити потрібне від передчасного: ти вирішуєш проблеми, яких у цьому обсязі ще немає. Головний принцип формату — маленьке й робоче б'є велике й зламане: три-п'ять тестів, що запускаються з першого разу й покривають критичний шлях, сильніші за амбітну архітектуру, яку не вдалося запустити. Стриманість тут читається як зрілість, а не як брак амбіцій.
Навіщо до артефакту додавати супровідний текст, якщо кейси й так є?
Бо артефакт — лише половина, а друга половина — як ти його подаєш. Супровід (для автопроєкту це секції README, для чекліста — вступний абзац) фіксує твої припущення, пояснює, що і чому ти пріоритизував, називає відомі прогалини й план «якби мав більше часу». Без нього свідомі компроміси залишаються невидимими, і мовчазна відсутність, скажімо, тесту на оплату читається як недогляд. З ним та сама відсутність звучить інженерним рішенням: «оплату виніс поза скоуп, бо вона залежить від зовнішнього провайдера й потребує тестових карток». Різниця величезна — той самий обсяг роботи сприймається або як прогалина, або як усвідомлений вибір, і супровід вирішує, як саме.
Тестове майже завжди має продовження-дзвінок. Як на ньому обґрунтовувати свої рішення?
Треба бути готовим захистити кожен вибір і робити це через відкрите визнання меж, а не через удавану повноту. Сильний хід — самому назвати, чого не покрив і чому: «happy-path оформлення я свідомо не автоматизував, бо він найдорожчий у підтримці й найкрихкіший — покрив би його вручну». Таке звучить як інженерне рішення, тоді як спроба вдавати, що ти встиг усе, розколупується інтерв'юером за одне уточнювальне питання. Найчастіше питають саме про пріоритезацію («чому це, а не те»), про прогалини («що додав би з часом»), про роботу зі скоупом («скільки витратив і чому зупинився») і — для AQA — про власний код («чому така структура, чому тут мок»). Чесне «ось межа й ось причина» завжди міцніше за фасад, який не витримує першого ж тику.
Як відрізнити чесне тестове від замаскованої безкоштовної праці?
За чотирма ознаками, які працюють у зв'язці. Чесне завдання має обмежений обсяг (реально дві-чотири години), синтетичну або публічну ціль (демо-застосунок, тренувальне API), чіткий бриф і компанію, готову дати фідбек. Сумнівне — навпаки: тебе просять тестувати їхній реальний продакшн-продукт із розмитим «пошукайте в нас баги й побачимо», скоуп нічим не обмежений, від тебе хочуть повноцінний автоматизаційний каркас, який потім заберуть, або кілька раундів безоплатної роботи поспіль. Junior особливо вразливий, бо вкладає п'ятнадцять-двадцять годин «щоб точно взяли», а у відповідь нерідко отримує тишу. Головний маркер — межа: чесна компанія рамку дає сама, експлуататор навмисно лишає її відкритою.
Що робити, якщо тестове схоже на замасковану безкоштовну працю?
Діяти без конфронтації, але й без наївності — і головний інструмент тут таймбокс. Постав собі стелю годин незалежно від амбіцій завдання й віддай сфокусований зріз із поміткою «ось приблизно N годин роботи, решту радо обговорю на дзвінку»: так ти й показуєш підхід, і не працюєш задарма нескінченно. Другий крок — заздалегідь спитати рекрутера про очікуваний обсяг і час; адекватна компанія відповість спокійно, а роздратування у відповідь саме по собі є відповіддю про процеси всередині. Реальний продукт із відкритим скоупом — привід уточнити очікування, а не мовчки вкладати вихідні. Систематична експлуатація тестовими — це вже симптом ширших проблем найму, і на такий сигнал варто зважати нарівні з іншими червоними прапорцями.
Чому «я свідомо не покрив happy-path оплати» звучить сильніше за удавану повноту?
Бо це показує, що ти керуєш скоупом, а не просто робиш усе, до чого дотягнувся. За фразою стоїть ланцюжок рішень: ти оцінив вартість підтримки цього сценарію, його крихкість і залежність від зовнішнього провайдера — і зробив обґрунтований вибір лишити його поза автоматизацією, покривши вручну. Це мова інженера, який розуміє компроміси, а не виконавця, що заповнює прогалину аби була. Удавана ж повнота крихка: варто інтерв'юеру спитати «а що буде, якщо провайдер віддасть таймаут», і фасад «я все покрив» розсипається, бо покриття було номінальним. Відкрито названа й обґрунтована межа виграє, тому що її не можна розколупати — вона вже врахована.
Три розбори, де тестове виграється або програється ще до першого кейса: як зашита скоуп-шапка перетворює «протестуйте форму логіну» на сфокусований зріз, як виглядає автопроєкт, що запускається однією командою, і як на око відрізнити чесне завдання від замаскованої безкоштовної праці.
Кейс 1. Скоуп-шапка для розмитої постановки
Постановка від рекрутера — один рядок: «Протестуйте форму логіну на нашому демо-стенді, надішліть результат до понеділка». Спокуса — одразу почати писати кейси. Сильний хід — почати з блоку, який фіксує рамку, бо саме її замовник свідомо не задав. Такий блок стає першим екраном артефакта (окремий аркуш у Google Sheets чи перший абзац документа):
ПРИПУЩЕННЯ
- email обов'язковий, валідується за форматом, ліміт 254 символи
- пароль: мінімум 8 символів, є показ/приховування
- після 5 невдалих спроб — тимчасове блокування (точний ліміт уточнити)
- мова інтерфейсу одна (en), локалі й таймзони поза скоупом
У СКОУПІ
- позитивний вхід валідними даними
- негативні: порожні поля, невалідний email, невірний пароль
- крайові: 254 символи в email, пробіли по краях, регістр email
- поведінка після кількох невдалих спроб
ПОЗА СКОУПОМ (свідомо)
- навантаження й безпека (SQL-ін'єкції, brute force на проді)
- крос-браузерність — лише Chromium у цьому зрізі
- відновлення пароля — окремий флоу, окреме завдання
ПИТАННЯ ДО АНАЛІТИКА
- який точний ліміт спроб і час блокування?
- email case-sensitive чи ні?
- чи є вимога до складності пароля понад довжину?
ТАЙМБОКС: 2.5 години. Далі — пріоритетний список того, що покрив би наступним.
Що тут працює і чому:
- Припущення знімають претензії заздалегідь. Рецензент бачить, що діри у вимогах ти помітив і закрив обґрунтовано, а не протестував навмання. На захисті рядок «я припустив ліміт 254 за RFC» звучить як аналітика, а мовчазний здогад — як вгадування.
- Явна межа «поза скоупом» читається як рішення, а не як прогалина. «Безпеку виніс поза зріз» — інженерний вибір; та сама відсутність без згадки — недогляд.
- Питання до аналітика показують реальний робочий рефлекс. У продукті ти б уточнив це в постановника; тут ти демонструєш, що не вигадуєш вимоги мовчки.
- Таймбокс перетворює обмеження на силу. «2.5 години, далі — пріоритетний список» сильніше за нескінченне полотно: видно, що ти вмієш дати сфокусований результат у рамках.
Далі йдуть самі кейси — але вже впорядковані за пріоритетом: спершу критичний вхід і головні негативи, потім крайові значення. Порядок сам говорить, що для тебе важливе.
Кейс 2. AQA-проєкт, який стартує однією командою
Найперший фільтр автотест-тестового — чи воно взагалі запускається в рецензента з чистої теки. Тому проєкт починається не з тестів, а з README й скрипта запуску. Мінімальний package.json, де npm test веде прямо в Playwright, без «спершу зроби ще щось»:
{
"name": "qa-assignment",
"scripts": {
"test": "playwright test",
"report": "playwright show-report"
},
"devDependencies": {
"@playwright/test": "^1.48.0"
}
}
Один охайний тест важить більше за двадцять скопійованих. Він показує культуру дрібницями: локатори за пріоритетом, підготовка стану без зайвих кліків, web-first очікування замість магічних пауз.
import { test, expect } from '@playwright/test';
test('заблокований користувач бачить помилку входу', async ({ page }) => {
await page.goto('/login');
await page.getByLabel('Username').fill('locked_out_user');
await page.getByLabel('Password').fill('secret_sauce');
await page.getByRole('button', { name: 'Login' }).click();
// web-first очікування само дочікується появи алерту, без waitForTimeout
await expect(page.getByRole('alert')).toContainText(/locked out/i);
});
Що дивитися і чому:
npm ci && npm test— і все. Якщо рецензент мусить піднімати Docker чи руками заповнювати.env, шанс, що він дійде до тестів, падає. Потрібні змінні — клади.env.exampleзі значеннями за замовчуванням, не змушуй гадати.getByRole/getByLabelзамість XPath. Прив'язка до ролі й підпису переживає зміну розмітки; крихкий//div[3]/span[2]ламається від першого рефакторингу верстки.- Немає
waitForTimeoutз магічним числом.expect(...).toContainText(...)сам чекає на потрібний стан; фіксована пауза або флакне на повільному CI, або марно гальмує на швидкому. - Три робочі тести б'ють недописаний «фреймворк» на 500 рядків. Абстракції під три сценарії — це overengineering і червоний прапорець: рецензент читає його як невміння відрізнити потрібне від передчасного, а не як силу.
README при цьому не формальність, а вхідні двері: назва й стек, вимоги (Node.js 20+), команда запуску, список покритого, а нижче — секції «рішення й компроміси» та «що додав би з часом». Саме вони перетворюють мовчазну відсутність тесту на оплату з недогляду на прочитане рішення.
Кейс 3. Розпізнати замасковану безкоштовну працю
Не кожне «тестове» чесне. Той самий текст листа може означати нормальне завдання або спробу отримати безоплатну роботу — вирішує сукупність ознак. Таблиця рішень, за якою зручно звіряти отриману постановку:
| Ознака | Чесне завдання | Сумнівне завдання |
|---|---|---|
| Обсяг | Обмежений, реально 2–4 години | «Скільки вважаєте за потрібне», без стелі |
| Ціль | Демо-застосунок, публічне API | Їхній реальний продакшн-продукт |
| Бриф | Чіткий, із критеріями | Розмите «пошукайте в нас баги» |
| Результат | Навчальний зріз | Повний фреймворк чи тест-стратегія, яку заберуть |
| Фідбек | Обіцяють і дають | Тиша або кілька безоплатних раундів поспіль |
Практичний сценарій. Рекрутер надсилає доступ до їхнього робочого кабінету зі словами «протестуйте, що знайдете, зробіть повну тест-стратегію продукту, обсяг на ваш розсуд». Три праві стовпці таблиці засвічуються одночасно — реальний продукт, відкритий скоуп, стратегія «на виніс». Це не привід грюкнути дверима, але привід не вкладати п'ятнадцять годин наосліп.
Що робити:
- Таймбокс рятує в будь-якому разі. Постав собі стелю (наприклад, три години), віддай сфокусований зріз одного критичного флоу з поміткою «ось приблизно N годин, решту радо обговорю на дзвінку». Так ти показуєш підхід, не працюючи задарма без меж.
- Уточни очікування заздалегідь. Питання рекрутеру про очікуваний обсяг і час — нормальне; адекватна компанія відповість спокійно, а роздратування у відповідь саме по собі є відповіддю про внутрішні процеси.
- Свідомо звужуй ціль. Замість «повної стратегії продукту» віддай стратегію одного модуля з явним «це зразок мого підходу на прикладі X» — і артефакт сильний, і межа очевидна.
Формати й розпізнавання завдання
- Розрізняю три формати тестового: чекліст/тест-кейси для фічі, пошук і оформлення багів, автотест-проєкт для AQA — і знаю, який артефакт від мене чекають у кожному.
- Розумію, що формат диктує очікуваний результат: постановка «спроєктуй перевірки» і «покрий автотестами» вимагають зовсім різного.
- Знаю, що при неясному форматі перше рішення — уточнити в рекрутера, а не домислювати мовчки.
- Можу пояснити, чому багрепорт оцінюють не за кількістю знахідок, а за якістю оформлення: кроки відтворення, фактичний і очікуваний результат, severity, докази.
Що насправді оцінюють
- Знаю три критерії рецензента — покриття (важить розподіл позитив/негатив/крайові, а не довжина списку), пріоритезація, оформлення; кількість кейсів сама по собі не важить.
- Можу пояснити, чому пріоритезація — найрідший навик junior: порядок кейсів має показувати критичний шлях і ризики, а не рівну купу.
- Розумію, чому назва кейсу має описувати перевірку, а не дію («клік туди-сюди»), і чому єдиний формат читається як сигнал охайності.
- Знаю, що явно виписані припущення відрізняють аналітика від того, хто мовчки вгадав вимоги.
Скоуп і час
- Розумію, що тестове недоописане навмисно, і робота з невизначеністю — частина перевірки.
- Можу зібрати скоуп-блок: припущення, у скоупі / поза скоупом, питання до аналітика — і зафіксувати рамку сам, якщо її не задали.
- Знаю принцип таймбоксу: поставити стелю годин (типово 2–4) і чесно вказати витрачений час як ознаку зрілості, а не слабкості.
- Можу пояснити, чому глибокий зріз одного критичного шляху б'є поверхневе «все потроху», а «тестую все підряд» — це відмова від пріоритезації, а не ретельність.
Тестове для AQA
- Знаю, що перший фільтр автопроєкту — чи він узагалі запускається (а не якість коду), і чому маленьке й робоче б'є велике й зламане, а overengineering каркасу — червоний прапорець.
- Можу написати мінімальний, але повний README: що це, як установити, як запустити, що покрито, плюс компроміси й «якби більше часу».
- Розумію ідеал запуску
npm ci && npm testбез ручного підняття Docker чи заповнення.envруками; змінні — через.env.example. - Знаю ознаки інженерної культури в коді: локатори за пріоритетом (
getByRole,getByLabel,data-testid), page object, підготовка стану через API, web-first очікування замістьwaitForTimeout.
Подача, захист і межі
- Розумію, що артефакт — лише половина: супровід (секції README чи вступний абзац) робить компроміси прочитаними, а на захисті кожен вибір обґрунтовую через відкрите визнання меж, а не удавану повноту.
- Знаю типові питання продовження: чому це, а не те; що додав би з часом; скільки витратив і чому зупинився; які припущення зробив.
- Можу відрізнити чесне тестове (обмежений обсяг, синтетична ціль, чіткий бриф, фідбек) від замаскованої безкоштовної праці (реальний продукт, відкритий скоуп, повний фреймворк, кілька безоплатних раундів).
- Знаю, що робити із сумнівним завданням: таймбокс і помітка «N годин», плюс уточнення обсягу в рекрутера заздалегідь.
Що передусім перевіряє тестове завдання на противагу усній технічній секції?
Питання
Що перевіряє тестове завдання на противагу усній секції?