Технічна співбесіда AQA
Зміст
Технічна співбесіда на позицію automation QA (AQA) відрізняється від співбесіди мануального QA не темами, а глибиною, з якою в них копають. Мануальний технічний скринінг перевіряє, чи ти розумієш тестування (структура — у розділі «Технічна співбесіда Manual QA»). AQA-співбесіда перевіряє інше: чи ти вмієш будувати і підтримувати код, який тестує застосунок, і чи розумієш, чому саме так, а не інакше. Тому головний матеріал тут — не визначення, а твій власний досвід: інтервʼюер бере твій проєкт як полігон і свердлить його питаннями «а чому», доки не впреться в межу твого реального розуміння.
Ця глава — не підручник з автоматизації (зміст відповідей живе у профільних розділах vyvchy: автоматизація, інструменти, JS/TS, API, Git/CI). Це мапа тем, які тебе чекають, і тактика: як говорити про свій фреймворк, як відповідати на сигнатурні питання на кшталт флакі-тестів чи «чому Playwright», і як не провалитися на завчених визначеннях, які розсипаються від першого уточнення.
Як влаштована технічна співбесіда AQA
Технічну секцію зазвичай веде lead AQA, SDET або сеньйор-автоматизатор, іноді — разом із розробником, який дивиться на твій код очима того, хто його рев’ювитиме. Формат — від 45 до 90 хвилин розмови, часто з живим кодуванням (окрема глава — «Лайвкодинг для AQA») або з винесеним тестовим завданням («Тестове завдання»).
Усередині розмова має два виміри, і сильний кандидат відчуває, у якому з них зараз перебуває:
- Ширина — мапа тем. Інтервʼюер швидко проходиться по блоках (мова, локатори, патерни, піраміда, API, CI), щоб зрозуміти, де в тебе є фундамент, а де діри. Тут цінується чесне «це знаю поверхово» замість блефу.
- Глибина — твій проєкт. Знайшовши тему, де ти впевнений, інтервʼюер зупиняється й копає вглиб: «а як саме ти це зробив?», «а чому не інакше?», «а що ламалося?». Саме тут вирішується грейд.
Мануальна секція частіше лишається в ширині; AQA-секція майже завжди зривається в глибину, бо код неможливо обговорювати абстрактно. Через це завчені формулювання, які рятують у мануальному скринінгу, тут працюють гірше — про це нижче окремо.
Мапа тем: що готувати і звідки
Технічна база AQA розкладається на шість блоків. Для кожного важливо знати не лише «що це», а й на що дивиться інтервʼюер і в якому розділі vyvchy це повторити.
- Мова (JavaScript/TypeScript). Основа, бо весь код на ній. Питають асинхронність (
async/await,Promise.all, забутийawait), замикання,this, типи в TS. Джун має писати чисто, сеньйор — пояснювати, чому забутийawaitу циклі дає плаваючий флак. Повторити — у розділі JS/TS. - Локатори. Найпрактичніший блок: як ти знаходиш елементи й чому вони не ламаються. Механіку селекторів дає глава «DOM, селектори та події», стратегію стабільних локаторів (
data-testidяк контракт із розробкою, пріоритет ролей) — розділ автоматизації. - Патерни й дизайн коду. Page Object, композиція проти успадкування, DRY/KISS/YAGNI, коли SOLID у тестах стає overengineering. Тут перевіряють, чи ти інженер, а не лише «пишу тести».
- Піраміда і стратегія. Рівні тестування, чому e2e дорогі й крихкі, що автоматизувати першим, ROI автоматизації. Це місток до сеньйорних питань.
- API-тестування. Перевірка статусу/тіла/схеми, ланцюжки запитів, підготовка стану через API замість UI, авторизація. Базу дає глава «REST API та формати даних», поглиблення — розділ API.
- CI/CD і флак. Як тести живуть у пайплайні, паралелізація, і — головне — флакі-тести. Механіку очікувань і синхронізації дає глава «Практичні сценарії AQA: флак і синхронізація».
Ця мапа — орієнтир для підготовки, а не сценарій співбесіди. Реальна розмова стрибає між блоками нерівномірно: там, де ти сильний, зупиняться надовго; там, де плаваєш, швидко підуть далі.
Розмова про твій фреймворк
Це серце AQA-співбесіди. Питання звучить нешкідливо — «розкажи про свій проєкт» або «як влаштований ваш фреймворк?» — але саме з нього виростає половина технічної секції. Інтервʼюер бере твою відповідь і починає копати кожен шар: яка структура, чому Page Object саме такий, як ти готуєш тестові дані, як ізолюєш тести, як бореш флак, як усе це запускається в CI, як виглядає звіт.
Сильна підготовка тут — це вміння намалювати свій фреймворк на дошці по шарах і до кожного шару мати відповідь «чому так». Не «ми використовуємо фікстури», а «фікстури дають нам ізольований стан на воркер, бо інакше паралельні тести билися за одного користувача». Різниця між джуном і мідлом часто саме тут: джун описує що зроблено, мідл — чому і що було альтернативою.
Найнебезпечніша пастка цього блоку — видавати чужий фреймворк за свій. Якщо архітектуру заклав тимлід, а ти лише дописував тести, чесна формула звучить так: «цю частину проєктував не я, ось як я розумію, чому вона така; а особисто я робив ось це». Інтервʼюер це поважає незрівнянно більше, ніж впевнену розповідь, яка розсипається на другому уточненні. Спроба привласнити рішення провалюється завжди однаково: наступне «а чому ви не зробили Х?» — і кандидат замовкає, бо це рішення приймав не він.
Пастка завчених визначень
Найтиповіший провал на AQA-співбесіді — відповідати завченими формулюваннями. Джерело істини співбесіди не в тому, чи ти знаєш означення Page Object, а в тому, чи ти ним користувався й розумієш його межі. Тому інтервʼюер майже ніколи не зупиняється на визначенні — він одразу пускає його через воронку поглиблення:
Завчене визначення проходить перший крок і майже завжди валиться на другому-третьому: людина, яка прочитала означення, але не працювала з поняттям, не може навести приклад зі свого проєкту й не знає, коли поняття шкодить. Класика — Page Object: кандидат бездоганно переказує визначення, але не може сказати, чому god object — це погано, або де перевірки: у page object чи в тесті.
Практичний висновок для підготовки: до кожної теми з мапи готуй не визначення, а трійку «навіщо → приклад з проєкту → межа застосування». Якщо на якусь тему в тебе немає прикладу з практики — це чесна діра, і краще сказати «читав, але руками не робив», ніж імітувати досвід. «Не знаю, але міркував би так…» — сильніша відповідь, ніж завчений абзац без опори.
Флакі-тести: сигнатурне питання AQA
Питання про флакі-тести (flaky tests) звучить майже на кожній AQA-співбесіді, бо воно ідеально розділяє тих, хто запускав тести, і тих, хто володів набором. Хто гасив реальні флаки в CI — відповідає структуровано; хто ні — зводить усе до «додати очікування».
Сильна відповідь має каркас, а не список рецептів: спершу таксономія причин (синхронізація, тестові дані, порядок і залежності між тестами, оточення/CI, і окремо — реальний баг продукту), потім діагностика (артефакти фейлу, повтори, класичне «локально зелений — у CI червоний»), потім ретраї як окрема тема: коли вони легітимні, а коли маскують проблему й перетворюють набір на брехню. Повний розбір теми — канон у розділі автоматизації (глава про флакі-тести); механіку браузерних очікувань дає глава «Практичні сценарії AQA: флак і синхронізація», а окреме джерело плаваючих фейлів — стара версія сторінки з кешу (глава «Кешування»).
Показова деталь, за якою одразу видно рівень, — фікс жорсткого очікування. Слабка відповідь: «поставив би sleep побільше». Сильна: пояснити, чому фіксована пауза — антипатерн, і показати очікування конкретної умови.
// Антипатерн: фіксована пауза — або флак, або марна затримка
await page.waitForTimeout(3000);
await expect(page.getByRole('alert')).toBeVisible();
// Правильно: web-first assertion сама чекає появи умови
await expect(page.getByRole('alert')).toBeVisible();
Ключова теза, яку інтервʼюер хоче почути прямо: фейл тесту не дорівнює багу продукту. Зрілий AQA спершу зʼясовує, що впало — застосунок чи тест, — і лише потім заводить баг або лагодить сюїт.
«Чому Playwright, а не Selenium чи Cypress»
Це питання майже ніколи не про те, який інструмент «кращий». Інтервʼюер перевіряє, чи ти розумієш архітектурні моделі за інструментами, а не завчив порівняльну табличку з блогу. Три моделі принципово різні: W3C WebDriver-протокол (Selenium), власний протокол драйвера поверх постійного зʼєднання — для Chromium на базі CDP, для Firefox/WebKit через патчені збірки (Playwright), виконання коду всередині браузера (Cypress) — і кожна модель має наслідки: ізоляція, кросбраузерність, робота з кількома вкладками, авточекання. Огляд цих моделей — у розділі інструментів.
Слабка відповідь перелічує фічі («Playwright швидший і має авточекання»). Сильна — називає компроміс і привʼязує його до контексту: «Playwright дає дешеву ізоляцію через контексти й авточекання з коробки, що зменшує флак; Selenium виграє там, де потрібна зріла екосистема й підтримка рідкісних браузерів; Cypress зручний для фронтенд-команд, але його модель виконання в браузері ускладнює багатовкладкові й cross-origin сценарії». І, знову ж, чесність про власний контекст: якщо інструмент обрали до тебе — так і скажи: «обрали до мене, ось як я розумію чому, і ось де я відчув межі цього вибору на практиці». Це сильніше за вдавану роль архітектора.
Стратегія і співпраця: сеньйорний рівень
На мідл-плюс і сеньйор питання зміщуються від «як написати тест» до «як побудувати й утримати процес». Тут перевіряють інженерне судження, а не знання API інструмента.
- Стратегія автоматизації. Що автоматизувати першим (критичний шлях, смоук, найдорожчі баги), а що лишити мануальним; чому не варто гнатися за «100% автоматизації»; як не перевернути піраміду в «ріжок морозива» з купою крихких e2e. Чесна оцінка покриття важливіша за красиву цифру.
- Співпраця з розробниками. Автоматизація — командний спорт:
data-testidяк контракт із розробкою, рев’ю тестопридатності фічі до її написання (shift-left), спільне володіння сюїтом. Питання «хто пише автотести — AQA чи розробники?» не має єдиної правильної відповіді; сильний кандидат говорить про ownership і про те, що один флакі-тест підриває довіру до всього gate. - Метрики й рішення. Час прогону, стабільність набору, escape rate; коли зупинити автоматизацію, бо вона вже не окуповується. Сеньйор мислить вартістю володіння, а не кількістю тестів.
На цьому рівні цінується вміння сказати «залежить від контексту» — і одразу назвати, від чого саме залежить. Абстрактне «залежить» без продовження звучить як ухиляння; конкретне «залежить від зрілості команди, ризику фічі й частоти релізів» — як досвід.
Типові помилки
- Виглядає як впевнена розповідь про фреймворк, а насправді — опис чужих рішень: валиться на першому «а чому ви не зробили інакше?», бо рішення приймав не кандидат.
- Виглядає як знання теми (бездоганне визначення), а насправді — завчений абзац: немає прикладу з проєкту й розуміння, коли поняття шкодить.
- Виглядає як відповідь про флак, а насправді — маскування: «додати sleep / увімкнути ретраї» без таксономії причин і без різниці між легітимним ретраєм і приховуванням бага.
- Виглядає як аргумент «чому Playwright», а насправді — переказ фіч із маркетингу: немає компромісу й привʼязки до контексту проєкту.
- Виглядає як ерудиція (сипле патернами й SOLID), а насправді — overengineering: кандидат не бачить, де абстракція в тестах зайва й шкодить читабельності.
- Виглядає як чесне «я цього не робив», але сказане з панікою — а насправді сильний хід, якщо додати «міркував би так…»: інтервʼюери цінують чесну межу знань вище за блеф.
Підсумок
- AQA-співбесіда перевіряє інженерне судження на твоєму коді, а не знання визначень; глибина важливіша за ширину.
- Твій фреймворк — головний матеріал розмови: вмій намалювати його по шарах і до кожного шару мати «чому» й «яка була альтернатива».
- Завчене визначення валиться на воронці «навіщо → приклад з проєкту → межа»; готуй трійки, а не абзаци.
- Флак — сигнатурне питання: відповідай каркасом (таксономія → діагностика → ретраї легітимні чи маскують), а не рецептом «додати очікування».
- «Чому інструмент X» — про архітектурні моделі й компроміси в контексті, не про табличку фіч; чесність про власну роль сильніша за вдавану експертизу.
Що питають на співбесіді
- «Розкажи про свій фреймворк / як він влаштований?» — базове питання, з якого росте половина секції. Дивляться: чи можеш пояснити структуру по шарах і «чому» до кожного рішення, чи це твій досвід, а не переказ.
- «У вас тест іноді падає, іноді ні. Твої дії?» — питання про флак. Дивляться: чи є системний підхід (таксономія → діагностика), чи ти відразу відрізняєш баг тесту від бага продукту, чи не маскуєш проблему ретраями.
- «Чому Playwright/Selenium/Cypress? Що обереш і чому?» — дивляться на розуміння архітектурних моделей і компромісів, а не на завчене порівняння; чи привʼязуєш вибір до контексту.
- «Що б ти автоматизував на новому проєкті першим?» — сеньйорне питання про стратегію. Дивляться: чи мислиш ризиком і ROI, чи розумієш піраміду як орієнтир, чи не обіцяєш «автоматизувати все».
- «Хто у вас пише автотести і як ви ділите відповідальність із розробниками?» — про співпрацю й ownership. Дивляться: чи розумієш shift-left і
data-testidяк контракт, чи бачиш вплив флаку на довіру до gate. - «Поясни, що таке Page Object / піраміда / фікстура» — визначення лише як вхід у воронку. Дивляться не на формулювання, а на приклад із практики й розуміння меж застосування.
Джерела
- ISTQB Certified Tester Foundation Level (CTFL) v4.0 — розділ 6 «Test Tools» (роль інструментів і автоматизації в тестуванні); термінологічна база для розмови про рівні й види.
- ISTQB Certified Tester Advanced Level Test Automation Engineering (CTAL-TAE) v2.0 — канонічний силабус зі стратегії й архітектури автоматизації (SUT, точки контролю, підтримуваність).
- The Practical Test Pyramid — Ham Vocke, martinfowler.com — першоджерело для аргументації про рівні та вартість тестів.
- Playwright Documentation — офіційна документація: архітектура, локатори, авточекання, фікстури.
- Selenium Documentation — офіційна документація WebDriver-протоколу й екосистеми.
Чим технічна співбесіда AQA відрізняється від технічного скринінгу мануального QA?
Різниця не в переліку тем, а в глибині, з якою кожну з них розкопують. Мануальний скринінг перевіряє, чи розумієш ти саме тестування — процеси, види, техніки. AQA-секція перевіряє, чи вмієш ти будувати й підтримувати код, який тестує застосунок, і чи можеш пояснити свої інженерні рішення. Тому центральний матеріал розмови — не визначення, а твій власний проєкт: інтервʼюер розкручує твій фреймворк питаннями «а чому саме так» шар за шаром, доки не намацає, де закінчується реальне розуміння. Практичний наслідок: готуватися треба не до переліку понять, а до захисту власних рішень.
Що таке «ширина» і «глибина» в структурі AQA-співбесіди й навіщо їх розрізняти?
Це два режими розмови, і сильний кандидат відчуває, у якому з них зараз перебуває. Ширина — швидкий прохід по блоках (мова, локатори, патерни, піраміда, API, CI), щоб намалювати мапу твоїх сильних і слабких зон; тут виграє чесне «це знаю поверхово» замість блефу. Глибина настає, коли інтервʼюер знаходить тему, де ти впевнений, зупиняється й починає копати: «як саме ти це зробив», «чому не інакше», «що ламалося». Мануальна секція частіше лишається в ширині, а AQA майже завжди зривається в глибину, бо код неможливо обговорювати абстрактно. Саме на глибині вирішується грейд, тому туди варто заводити розмову там, де тобі є що захищати.
Хто зазвичай веде технічну секцію AQA і як це впливає на розмову?
Секцію найчастіше проводить lead AQA, SDET або сеньйор-автоматизатор, іноді разом із розробником, який дивиться на твій код очима майбутнього рев'юера. Формат — розмова на 45–90 хвилин, часто з живим кодуванням або винесеним тестовим завданням. Знання, хто навпроти, змінює акценти: розробник у складі панелі почне питати про якість самого коду, читабельність, дизайн, а не лише про тестову логіку. Практичний висновок — не зводь підготовку до інструмента, бо частину часу оцінюватимуть тебе як інженера, а не лише як «того, хто пише тести».
«Розкажи про свій фреймворк» — чому це головне питання секції та як до нього готуватися?
Питання звучить нешкідливо, але саме з нього виростає половина технічної розмови: інтервʼюер бере відповідь і починає копати кожен шар — структуру, чому Page Object саме такий, як готуються дані, як ізолюються тести, як бореться флак, як усе запускається в CI, як виглядає звіт. Сильна підготовка — це вміння намалювати фреймворк на дошці по шарах і до кожного шару мати відповідь «чому так» плюс «яка була альтернатива». Не «ми використовуємо фікстури», а «фікстура створює кожному воркеру окремого користувача, інакше паралельні прогони билися б за спільний акаунт». Саме тут часто проходить межа між джуном і мідлом: джун описує, що зроблено, мідл — чому й що було альтернативою. Підготуй розповідь так, щоб кожен її шар витримував уточнення.
Що казати, якщо архітектуру фреймворку проєктував не ти?
Казати правду в чіткій формулі: «цю частину закладав не я, ось як я розумію, чому вона така, а особисто я робив ось це». Спроба видати чуже рішення за своє провалюється завжди однаково — наступне «а чому ви не зробили Х» лишає кандидата без відповіді, бо це рішення приймав інший. Інтервʼюери поважають чесно окреслену межу власного внеску незрівнянно більше за впевнену розповідь, яка розсипається на другому уточненні. Практично: заздалегідь познач для себе, де закінчується твоя робота й починається чужа архітектура, щоб не імпровізувати про це під тиском.
Чому завчене визначення провалюється на AQA-співбесіді?
Бо інтервʼюер майже ніколи не зупиняється на самому визначенні — він пускає його через воронку поглиблення: що це → навіщо це, яку проблему розвʼязує → приклад з твого проєкту → коли це зайве або шкодить. Людина, яка прочитала означення, але не працювала з поняттям, проходить перший крок і валиться на другому-третьому: не може навести приклад із практики й не знає меж застосування. Класика — Page Object: означення відскакує від зубів, але кандидат губиться на тому, чим небезпечний god object і в якому шарі мають жити перевірки — у page object чи в тесті. Висновок для підготовки: вчи не абзаци, а трійки «навіщо → приклад із проєкту → межа».
Як підготувати тему так, щоб вона витримала воронку поглиблення?
До кожного поняття з мапи готуй не визначення, а три опори: навіщо воно (яку біль знімає), приклад із власного проєкту й межу — коли поняття зайве або починає шкодити. Визначення дає лише перший крок воронки, а грейд вирішується на кроках про приклад і про межу. Якщо на якусь тему в тебе немає прикладу з практики, це чесна діра, і сказати «читав, але руками не робив» сильніше, ніж імітувати досвід і замовкнути на уточненні. Відповідь «не знаю, але міркував би так…» звучить переконливіше за гладкий завчений абзац без опори на досвід.
«У вас тест іноді падає, іноді ні. Твої дії?» — як побудувати відповідь про флак?
Питання про флакі-тести (flaky tests) лунає чи не на кожній AQA-співбесіді: воно миттєво показує, чи ти володів набором, чи лише запускав його. Сильна відповідь має каркас, а не список рецептів. Спершу таксономія причин: синхронізація, тестові дані, порядок і залежності між тестами, оточення й CI, і окремо — реальний баг продукту. Потім діагностика: артефакти фейлу, повтори, класичне «локально зелено — у CI червоно». Потім ретраї як окрема тема — коли вони легітимні, а коли лише маскують проблему. Слабкий кандидат зводить усе до «додати очікування»; сильний показує систему й одразу відділяє баг тесту від бага продукту.
Чому page.waitForTimeout або sleep — слабка відповідь на питання про синхронізацію?
Фіксована пауза не звʼязана з реальною подією, на яку ти чекаєш, тож вона одночасно і ненадійна, і марнотратна. Замало почекав — тест почервоніє на повільному прогоні; забагато — сюїт гальмує на кожному зеленому запуску. Правильний підхід — чекати на конкретну умову, а не на абстрактні секунди: web-first assertion у Playwright сама опитує стан, доки він не збіжиться, або поки не вийде таймаут. Тому відповідь «поставив би sleep побільше» одразу сигналить про поверхове розуміння синхронізації, а «замінив би фіксовану паузу на очікування конкретної умови» — про зріле.
Коли ретраї легітимні, а коли вони перетворюють набір на брехню?
Ретрай легітимний, коли ти свідомо гасиш відомий і нерозвʼязний зовні шум — наприклад, миттєве моргання мережі чи сторонній сервіс, який зрідка тупить, — і при цьому бачиш статистику повторів. Ретрай стає брехнею, коли ним глушать нестабільність, причину якої ти не зрозумів: тест «зеленіє з другого разу», реальна проблема залишається, а довіра до набору тихо тане. Небезпека в тому, що масові ретраї маскують і справжні баги продукту, які проявляються не щоразу. Тому в сильній відповіді ретраї — це остання лінія з обовʼязковим моніторингом, а не заміна діагностики першопричини.
Що на практиці означає теза «фейл тесту не дорівнює багу продукту»?
Червоний тест — це лише сигнал, що очікуване й фактичне розійшлися, а не доказ, що зламався застосунок. Зрілий AQA спершу зʼясовує, що саме впало: сам продукт, тестові дані, оточення чи логіка тесту, — і лише потім заводить дефект або лагодить сюїт. Дуже часто винен не застосунок: протух токен, фікстура не створила запис, підставилось не те середовище, тести побилися за спільний стан. Заявляти причину без перевірки — антипатерн; фраза «схоже на баг бекенда, і ось стектрейс, що на це вказує» коштує рівно стільки, скільки під нею доказів.
«Чому Playwright, а не Selenium чи Cypress?» — що насправді перевіряє це питання?
Майже ніколи — не те, який інструмент обʼєктивно «кращий». Інтервʼюер дивиться, чи розумієш ти архітектурні моделі за інструментами, чи просто переказав порівняльну табличку з блогу. Слабка відповідь перелічує фічі: «Playwright швидший і має авточекання». Сильна називає компроміс і привʼязує його до контексту: дешева ізоляція через контексти й авточекання з коробки зменшують флак, зате Selenium виграє зрілою екосистемою й підтримкою рідкісних браузерів. І тут теж цінується чесність про власну роль: якщо інструмент обрали до тебе — так і скажи, додавши, як ти розумієш причину вибору й де відчув його межі на практиці.
Чим принципово різняться архітектурні моделі Selenium, Playwright і Cypress?
Це три різні способи керувати браузером, і кожен має наслідки. Selenium працює через стандартний протокол W3C WebDriver — універсальний і зрілий, але зовнішній щодо браузера. Playwright тримає постійне зʼєднання по власному протоколу драйвера: для Chromium — на базі Chrome DevTools Protocol (CDP), для Firefox і WebKit — через патчені збірки, що дає дешеву ізоляцію контекстами й авточекання. Cypress виконує код тесту всередині самого браузера, що зручно фронтенд-командам, але його модель ускладнює багатовкладкові й cross-origin сценарії. Наслідки моделей стосуються ізоляції, кросбраузерності, роботи з кількома вкладками й авточекання — саме про ці компроміси й питають, а не про швидкість у вакуумі.
«Що б ти автоматизував на новому проєкті першим?» — як відповісти по-сеньйорному?
Це питання про стратегію, тому мислити треба ризиком і окупністю, а не обсягом. Сильна відповідь: спершу критичний шлях і смоук — сценарії, падіння яких найдорожче, — а не «все підряд». Далі важливо не обіцяти «100% автоматизації» й не перевертати піраміду в «ріжок морозива» з купою крихких e2e поверх тонкого шару юнітів. Чесна оцінка покриття цінніша за красиву цифру, а піраміда — це орієнтир пропорцій, а не догма. Слабкий кандидат називає інструменти й обіцяє покрити геть усе; сильний говорить про ROI, ризик фічі й те, що лишити мануальним.
«Хто має писати автотести — AQA чи розробники?» — як відповісти сильно?
Тут немає єдиної правильної відповіді, і сама спроба видати одну — слабкий хід. Сильний кандидат говорить про ownership: автоматизація — командний спорт, а не колодязь однієї ролі. Ключова теза, яку варто озвучити, — один флакі-тест підриває довіру до всього gate, тому спільне володіння набором важливіше за те, чиї руки написали конкретний тест. Добре сюди вплести shift-left і data-testid як контракт із розробкою: коли тестопридатність обговорюють до написання фічі, питання «хто пише» стає менш гострим. Відповідь має показати, що ти бачиш процес і довіру до gate, а не ділиш зони відповідальності по посадах.
Що таке shift-left і чому data-testid називають контрактом із розробкою?
Shift-left — це зсув уваги до якості ліворуч по потоку розробки: тестопридатність фічі обговорюють до того, як її написали, а не після. data-testid тут — атрибут-контракт: розробка домовляється лишати в розмітці стабільні гачки для локаторів, і тоді тести не ламаються від кожного косметичного рефакторингу верстки. Це і є прикладна форма співпраці: замість того щоб AQA полював за крихкими селекторами постфактум, команда закладає зачіпки заздалегідь. Практичний наслідок — менше флаку від зміни DOM і менше конфліктів «ви знову переверстали й поламали нам тести».
Які метрики свідчать про здоров'я набору автотестів?
Сеньйор мислить вартістю володіння набором, а не кількістю тестів. Показові метрики — час прогону (чи не став gate занадто повільним, щоб його поважали), стабільність набору (частка флакі-падінь) і escape rate — скільки дефектів просочилося в прод повз автоматизацію. Разом вони відповідають на головне питання: чи набір усе ще окуповується, чи його підтримка вже коштує дорожче за користь. Звідси й зріле рішення — коли зупинити автоматизацію певної ділянки, бо вона перестала окупатися. Кількість тестів сама по собі нічого не каже: тисяча крихких e2e гірша за сотню надійних.
Чому «залежить від контексту» буває і сильною, і слабкою відповіддю водночас?
Усе вирішує, що йде після цих слів. Голе «залежить» без продовження звучить як ухиляння — кандидат уникає позиції. А «залежить від зрілості команди, ризику фічі й частоти релізів» звучить як досвід, бо одразу називає осі, від яких справді залежить рішення. На мідл-плюс і сеньйор рівні саме це вміння — назвати конкретні чинники, а не сховатися за абстракцією — відрізняє інженерне судження від завченої обережності. Тому правило просте: сказав «залежить» — негайно перелічи, від чого саме, і, якщо доречно, покажи, куди схилив би вибір у кожному разі.
Три розбори з живої AQA-співбесіди: як розкласти власний фреймворк по шарах так, щоб кожен витримав уточнення; як виглядає воронка поглиблення, що топить завчене визначення; і як структурувати відповідь про флак замість «додати sleep». Скрізь — на що дивиться інтервʼюер і чому.
Кейс 1. «Розкажи про фреймворк»: розклад по шарах із «чому» й альтернативою
Питання звучить м'яко, але це вхід у половину секції. Слабко — перелічити інструменти («Playwright, TypeScript, Page Object, GitHub Actions, Allure»). Сильно — намалювати шари й до кожного мати причину рішення та відкинуту альтернативу. Ось та сама розповідь, розкладена в таблицю, якою її і варто тримати в голові перед дошкою:
| Шар | Рішення | Чому саме так | Альтернатива й чому відкинули |
|---|---|---|---|
| Ізоляція даних | Фікстура на воркер створює свого користувача через API | Паралельні воркери не бʼються за спільний акаунт | Один seed-юзер на всіх — гонки й плаваючі падіння |
| Підготовка стану | Передумови ставимо запитами, не кліками по UI | Швидше й стабільніше, ніж проходити майстер кліками | Готувати стан через UI — довго й крихко |
| Локатори | Пріоритет ролей і data-testid | Контракт із розробкою, стійкий до рефакторингу верстки | CSS-класи з хешем — ламаються щобілда |
| Патерн | Page Object лише для складних екранів | Знімає дублювання там, де воно реальне | Page Object на кожну дрібницю — зайва абстракція |
| Запуск | Шардинг у CI, ретрай лише на позначених флакі-тестах | Швидкий gate, ретрай не глушить усе підряд | Глобальні retries: 2 — маскують реальні баги |
Що дивиться інтервʼюер і чому:
- Кожен рядок має колонку «чому». Різниця між джуном і мідлом проходить тут: джун опише, що зроблено, мідл — чому й що було замість. Колонка альтернатив — це і є те, що інтервʼюер витягуватиме питанням «а чому не інакше».
- Не привласнюй чужих рішень. Якщо шар ізоляції проєктував тимлід, чесна формула: «цю частину закладав не я, ось як я розумію її логіку, а особисто я писав тести поверх неї». Це поважають більше за впевнену розповідь, що валиться на другому уточненні.
- Готуй розповідь так, щоб кожен рядок витримував свердління. Інтервʼюер зупиниться на тому шарі, де ти впевнений, і копатиме вглиб — саме там вирішується грейд, тому веди розмову туди, де тобі є що захищати.
Кейс 2. Воронка поглиблення: як тоне завчене визначення
Інтервʼюер майже ніколи не зупиняється на самому визначенні — він пускає його через чотири кроки: що це → навіщо → приклад із проєкту → коли шкодить. Ось та сама тема (Page Object) у двох кандидатів. Репліки реконструйовані, але діалог типовий.
Кандидат A (завчене визначення):
— Що таке Page Object? — Патерн, де кожна сторінка застосунку — окремий клас із методами взаємодії та локаторами всередині. — Навіщо він? — Щоб не дублювати код і легше підтримувати тести. — Наведи приклад зі свого проєкту, де він реально врятував. — Ну… скрізь у нас Page Object, на кожну сторінку клас… — А коли Page Object зайвий або шкодить? — (пауза) Не знаю, ми завжди його використовуємо.
Кандидат A пройшов перший крок бездоганно й потонув на третьому-четвертому: немає прикладу з практики й немає розуміння меж. Це портрет людини, яка прочитала означення, але не працювала з поняттям.
Кандидат B (реальне розуміння):
— А коли Page Object зайвий або шкодить? — Коли екран простий і клас перетворюється на тонку обгортку над одним локатором — це зайва абстракція, читати важче, ніж прямий локатор у тесті. І ще одна пастка — god object: у нас один клас розрісся до сотні методів, ми його порізали за смисловими блоками. Перевірки я тримаю в тесті, а не в page object: об'єкт відповідає за «як натиснути», а тест — за «що має статися».
Що дивиться інтервʼюер і чому:
- Визначення — лише перший крок воронки. Грейд вирішується на «приклад із проєкту» й «межа застосування», а не на гладкості формулювання.
- Чесна діра сильніша за імітацію. Якби кандидат A сказав «Page Object я використовував, але про його межі не думав» — це чесніше й безпечніше, ніж пауза після спроби вдати досвід.
- Готуй трійки, а не абзаци. До кожної теми з мапи — «навіщо → приклад із проєкту → межа», інакше друге-третє уточнення топить.
Кейс 3. «Тест іноді падає, іноді ні»: каркас замість «додати sleep»
Сигнатурне питання про флак розділяє тих, хто запускав тести, і тих, хто володів набором. Слабко — «поставив би паузу побільше». Сильно — розгорнути каркас: таксономія причин → діагностика → ретраї. Ось таксономія у вигляді таблиці рішень, з якою й варто йти на розбір:
| Клас причини | Типовий симптом | Куди копати |
|---|---|---|
| Синхронізація | Падає на повільному прогоні, зникає локально | Замінити фіксовану паузу на очікування умови |
| Тестові дані | 409/дублікат на повторному прогоні | Унікальні дані на прогін + надійний teardown |
| Порядок і залежності | Зелений поодинці, червоний у повному наборі | Ізоляція стану, чистий контекст на тест |
| Оточення / CI | Зелено локально, червоно лише в пайплайні | Паралелізм, rate limit, стан середовища |
| Баг продукту | Відтворюється валідним запитом руками | Завести дефект, а не лагодити тест |
Останній рядок — головна дисципліна: фейл тесту не дорівнює багу продукту, спершу зʼясуй, що впало. Далі — показова деталь, за якою одразу видно рівень: фікс жорсткого очікування.
import { test, expect } from '@playwright/test';
test('поява алерта: очікування умови, а не фіксована пауза', async ({ page }) => {
await page.goto('https://app.example.com/checkout');
await page.getByRole('button', { name: 'Оплатити' }).click();
// Антипатерн: фіксована пауза — або флак на повільному прогоні, або марна затримка
// await page.waitForTimeout(3000);
// await expect(page.getByRole('alert')).toBeVisible();
// Правильно: web-first assertion сама опитує стан, доки умова не збіжиться або не вийде таймаут
await expect(page.getByRole('alert')).toBeVisible();
});
Про ретраї — окремою тезою, бо саме тут видно зрілість:
// Легітимно: тег виділяє відомий флак — ретраї вмикаються точково (окремий прогін/проєкт за тегом), зі статистикою повторів
test('нестабільний сторонній віджет', { tag: '@flaky' }, async ({ page }) => {
// ...
});
// Небезпечно: глобальні retries маскують і реальні баги продукту, що проявляються не щоразу
// retries: 2 // у конфізі «на весь набір» — набір тихо перетворюється на брехню
Що дивиться інтервʼюер і чому:
- Каркас, а не рецепт. «Додати очікування» — лише один пункт з першого рядка таблиці; сильна відповідь показує всю таксономію й порядок діагностики.
- Ретрай — остання лінія з моніторингом, не заміна діагностики. Легітимний ретрай гасить відомий зовнішній шум; ретрай, яким глушать незрозумілу нестабільність, ховає баги й убиває довіру до gate.
- «Що впало?» перед «де баг?». Дуже часто винен не застосунок: протух токен, фікстура не створила запис, тести побилися за спільний стан — і це знахідка про тест, а не про продукт.
Формат і тактика секції
- Розумію, що AQA-секцію від мануальної відрізняє не перелік тем, а глибина, з якою в них копають, і що центральний матеріал — мій код, а не визначення.
- Відчуваю, у якому вимірі зараз розмова: ширина (швидкий обхід блоків) чи глибина (свердління однієї теми), і знаю, що грейд вирішується саме на глибині.
- Можу чесно сказати «це знаю поверхово» замість блефу, бо на ширині це цінується вище за впевнену вигадку.
Розмова про фреймворк
- Умію намалювати свій фреймворк по шарах і до кожного шару маю відповідь «чому так» і «яка була альтернатива».
- Розумію різницю між відповіддю джуна (що зроблено) і мідла (чому зроблено й що було замість), і цілюся в другу.
- Знаю чесну формулу для чужої архітектури: «це проєктував не я, ось як я розумію чому, а особисто я робив ось це».
Пастка завчених визначень
- Розумію воронку поглиблення: що це → навіщо → приклад із проєкту → коли зайве чи шкодить, і знаю, що завчене валиться на другому-третьому кроці.
- До кожної теми готую трійку «навіщо → приклад із проєкту → межа застосування», а не абзац визначення.
- Можу пояснити на прикладі Page Object, де мають жити перевірки й чому god object — це погано.
Флакі-тести
- Маю каркас відповіді про флак: таксономія причин (синхронізація, дані, порядок і залежності, оточення/CI, реальний баг продукту) → діагностика → ретраї, а не список рецептів.
- Можу пояснити, чому фіксована пауза (
waitForTimeout/sleep) — антипатерн, і показати очікування конкретної умови замість неї. - Розрізняю легітимний ретрай (свідоме гасіння відомого шуму з моніторингом) і ретрай-маскування, що перетворює набір на брехню.
- Тримаю як окрему тезу: фейл тесту не дорівнює багу продукту — спершу зʼясовую, що впало, потім заводжу дефект.
Вибір інструмента
- Розумію, що питання «чому Playwright/Selenium/Cypress» — про архітектурні моделі й компроміси, а не про табличку фіч.
- Можу назвати різницю моделей: WebDriver-протокол (Selenium), власний протокол драйвера поверх постійного зʼєднання, для Chromium — CDP (Playwright), виконання коду в браузері (Cypress) — і їхні наслідки для ізоляції, кросбраузерності, вкладок.
- Знаю, що чесне «інструмент обрали до мене, ось як я розумію чому» сильніше за вдавану роль архітектора.
Стратегія і співпраця (сеньйорний рівень)
- Можу пояснити, що автоматизувати першим (критичний шлях, смоук, найдорожчі баги), чому не варто гнатися за «100% автоматизації» й чим небезпечний «ріжок морозива» — перевернута піраміда з крихких e2e.
- Знаю роль shift-left і
data-testidяк контракту з розробкою, розумію ownership набору й чому один флакі-тест підриває довіру до всього gate. - Мислю метриками володіння набором: час прогону, стабільність, escape rate — і знаю, коли автоматизація перестає окуповуватися.
- Умію сказати «залежить від контексту» й одразу назвати, від чого саме (зрілість команди, ризик фічі, частота релізів).
Чим технічна AQA-співбесіда принципово відрізняється від технічного скринінгу мануального QA?
Питання
Чим AQA-співбесіда відрізняється від технічного скринінгу мануального QA?