Українська версія

Питання QA Automation для співбесіди

Практичні питання з автоматизації тестування українською: framework design, maintainable test code, CI, programming concepts, automation strategy і test architecture.
83питань
Automation strategy & coverageMiddleOccasionalStrategy

Як ви вирішуєте, чи варто автоматизувати тест?

Відповідь

Автоматизуйте, коли перевірку можна повторювати, вона цінна, достатньо стабільна і дешевша в підтримці, ніж повторне ручне виконання. Враховуйте частоту запуску, ризик, контроль над даними та середовищем, швидкість зворотного зв'язку і те, чи здатна автоматизація зробити надійне твердження (assertion).

Сильна відповідь включає

  • цінність і підтримуваність
  • ризик і повторюваність
  • відкидає ціль 100-відсоткової автоматизації

Практичний приклад

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

Джерела

DOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topicsISTQB CTFL syllabus v4.0.1ISTQB · Testing vocabulary, principles, lifecycle and test-design concepts
Flakiness & reliabilityMiddleOccasionalTroubleshooting

Як би ви розслідували та зменшували нестабільні (flaky) автоматизовані тести?

Відповідь

Класифікуйте падіння за трейсами, логами та повторними запусками, а потім усувайте спільний стан, неконтрольовані дані, довільні очікування (waits) і крихкі локатори. Виправляйте причину, відстежуйте відсоток флейкі-тестів і поміщайте тест у карантин лише тимчасово, з призначеним відповідальним.

Сильна відповідь включає

  • діагностика на основі доказів
  • ізоляція та детерміновані очікування
  • карантин є тимчасовим

Практичний приклад

Тест оформлення замовлення періодично падає в CI. Витягнувши трейс і відео з трьох невдалих прогонів, тестувальник виявляє, що тест клікає «Оформити замовлення» до того, як завершиться асинхронний перерахунок суми в кошику. Заміна довільного sleep(2000) на web-first твердження, яке очікує саме на конкретний текст суми, вирішує проблему остаточно, замість того щоб просто повторно запускати тест або тримати його в карантині нескінченно.

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automation
Automation strategy & coverageSeniorOccasionalStrategy

Як би ви розподілили автоматизовані перевірки між рівнями unit, service та UI?

Відповідь

Розміщуйте кожне твердження (assertion) на найнижчому рівні, який може дати надійний зворотний зв'язок. Використовуйте багато сфокусованих компонентних і сервісних перевірок, залишайте UI-тести для критичної інтегрованої поведінки і зберігайте невелику кількість наскрізних (end-to-end) сценаріїв.

Сильна відповідь включає

  • швидкий зворотний зв'язок
  • рівень обирається за ризиком
  • уникає дублювання UI-наборів

Практичний приклад

Для функції розрахунку знижок команда пише 20 unit-тестів, що покривають кожну комбінацію правил ціноутворення (швидко, мілісекунди на тест), 5 сервісних тестів, що підтверджують коректну інтеграцію сервісу ціноутворення з API каталогу товарів, і лише 2 UI-тести, що підтверджують коректне відображення знижки на сторінці оформлення замовлення — замість того щоб тестувати всі 20 правил ціноутворення через повільну й крихку браузерну автоматизацію.

Джерела

DOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topicsPlaywright best practicesMicrosoft · Reliable modern browser automation
UI automationSeniorOccasionalAutomation

Які проєктні рішення роблять браузерну автоматизацію підтримуваною?

Відповідь

Тестуйте поведінку, видиму користувачу, ізолюйте тести, контролюйте дані, надавайте перевагу доступним (accessible) локаторам, орієнтованим на користувача, та web-first твердженням, а також фіксуйте корисні трейси при падінні. Абстрагуйте бізнес-дії, не ховаючи кожну взаємодію за громіздким фреймворком.

Сильна відповідь включає

  • локатори, орієнтовані на користувача
  • ізоляція
  • корисна діагностика без надмірної абстракції

Практичний приклад

Замість того щоб знаходити кнопку через крихкий CSS-селектор на кшталт div.MuiButton-root:nth-child(3), підтримуваний тест використовує getByRole('button', { name: 'Submit order' }), що переживає рефакторинг стилів. Кожен тест створює власного тестового користувача через API, а не покладається на спільний засіяний акаунт, тож тести можуть виконуватися паралельно без того, щоб очищення одного тесту ламало налаштування іншого, а Playwright trace viewer увімкнено, щоб падіння в CI можна було діагностувати без локального відтворення.

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automation
CI/CD & executionSeniorCommonRelease decision

Як би ви спроєктували етапи тестування та якісні ворота (quality gates) у CI/CD?

Відповідь

Запускайте швидкі детерміновані перевірки на ранніх етапах, ширші інтеграційні перевірки — після появи артефактів, придатних до розгортання, а таргетовані наскрізні або нефункціональні набори — там, де це дозволяє середовище. Кожен gate потребує відповідального, надійний сигнал, політику дій при падінні та аудитований механізм екстреного обходу (override).

Сильна відповідь включає

  • впорядковані рівні зворотного зв'язку
  • надійність перед блокуванням
  • явний механізм обходу та відповідальність

Практичний приклад

Пайплайн запускає unit-тести та лінтинг на кожен коміт менш ніж за 3 хвилини, блокуючи мердж при падінні. Після мерджу в main запускається ширший інтеграційний набір проти розгорнутої staging-збірки, і саме він визначає, чи просувати збірку в продакшн. Перформанс-набір запускається щоночі, а не на кожен коміт, бо він занадто повільний і трохи флейкі, щоб блокувати мерджі, а задокументований процес екстреного обходу дозволяє директору обійти інтеграційний gate для критичного хотфіксу, з логуванням і рев'ю обходу наступного дня.

Джерела

DOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topics
Framework architectureMiddleCommonTheory

Які компоненти мають входити в підтримуваний фреймворк автоматизації тестування?

Відповідь

Фреймворк зазвичай відокремлює намір тесту від конфігурації, драйверів браузера чи API, доменних дій, тестових даних, асертів, синхронізації, налаштування й очищення оточення, репортингу та діагностики. Він також визначає відповідальність, конвенції коду та виконання в CI. Додавайте абстракції лише там, де вони зменшують повторювані зміни або спрощують розуміння падінь тестів.

Сильна відповідь включає

  • розділяє відповідальності без надмірного інжинірингу
  • включає діагностику та контроль життєвого циклу
  • розглядає CI та відповідальність за код як частину фреймворку

Практичний приклад

У Playwright-фреймворку команди методи дій (доменні дії) відокремлені від сирих локаторів (драйвери), тестові дані лежать у фікстурах, що завантажуються окремо для кожного середовища, а кожен асерт обгорнутий кастомним матчером, який при падінні прикріплює скриншот і мережевий лог (діагностика). Коли змінюється селектор поля логіну, потрібно оновити лише один файл page-object, а не сорок тестових файлів — саме в цьому користь такого розділення, а CI при падінні білда показує посилання на trace viewer, а не просто червоний хрестик.

#automation-framework#architecture#reporting#maintainability

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationQA Interview Questions: 60+ With Model AnswersKatalon · Prevalence signal for current QA, automation, leadership and scenario questions
Automation strategy & coverageJuniorOccasionalStrategy

Які основні переваги та ризики автоматизації тестування?

Відповідь

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

Сильна відповідь включає

  • балансує переваги зворотного зв'язку з витратами на підтримку
  • згадує хибну впевненість і флейкі-тести
  • обирає, що автоматизувати, на основі цінності

Практичний приклад

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

#automation#benefits#risk#roi

Джерела

ISTQB CTFL syllabus v4.0.1ISTQB · Testing vocabulary, principles, lifecycle and test-design conceptsQA Interview Questions: 60+ With Model AnswersKatalon · Prevalence signal for current QA, automation, leadership and scenario questions
Flakiness & reliabilityJuniorOccasionalTheory

Як асинхронний код змінює підхід до написання автотестів?

Відповідь

Синхронний код завершується до виконання наступного оператора, тоді як асинхронна робота може завершитися пізніше або впасти через проміс, колбек, подію чи чергу. Тести мають очікувати спостережувану умову завершення, перевіряти таймаути й помилки, за потреби керувати годинником і залежностями та уникати фіксованих sleep, які створюють гонки станів (race conditions) і витрачають час даремно.

Сильна відповідь включає

  • очікує умови, а не фіксований час
  • тестує відхилення, таймаут і порядок виконання
  • керує асинхронними залежностями

Практичний приклад

Флейкі UI-тест використовує жорстко закодований sleep(3000) після кліку на «Відправити», щоб дочекатися тост-повідомлення — це нестабільно падає, коли API повільний, і марно витрачає три секунди, коли API швидкий. Виправлення замінює це на явне очікування появи елемента тосту, додає окремий тест, що мокає затриману відповідь API для перевірки спінера завантаження й помилки таймауту, а також керує системним годинником у юніт-тесті, який перевіряє, що колбек закінчення 30-секундної сесії спрацьовує рівно один раз.

#asynchronous#promises#synchronization#test-code

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Flakiness & reliabilityMiddleOccasionalScenario

Чим мають відрізнятися стратегії очікування (wait strategies) між перевірками в pull request і нічними (nightly) автоматизованими наборами тестів?

Відповідь

Обидва набори тестів мають очікувати спостережувані умови застосунку, а не фіксовані затримки, але можуть відрізнятися за часовими бюджетами, політиками повторів (retry) та глибиною діагностики. Перевірки в pull request мають швидко падати на умовах з високим сигналом, тоді як нічні прогони можуть покривати повільніші сценарії, не приховуючи відмови за широкими retry-механізмами. Відстежуйте тривалість і флейкі-тести (flakiness) в розрізі кожного тесту, зберігайте докази таймаутів і трактуйте повторні спроби як сигнал про дефект, а не як доказ стабільності.

Сильна відповідь включає

  • використовує очікування на основі умов замість фіксованих sleep
  • розділяє цілі швидкого фідбеку від правил коректності
  • вимірює повтори та таймаути як сигнали якості

Практичний приклад

Наприклад, перевірка в PR очікує появи конкретного елемента 'order confirmed' з таймаутом 5 секунд і швидко падає, якщо він не з'являється, даючи розробникам швидкий фідбек у межах 3-хвилинного пайплайна. Нічний набір, що тестує той самий флоу на повільнішому staging-середовищі, використовує 30-секундне очікування на основі умови для того самого елемента, але логує й відображає на дашборді кожну повторну спробу, і команда помічає, що частка retry для цього флоу зросла з 2% до 15% за тиждень — це сигналізує про реальну регресію латентності бекенду ще до того, як вона дійде до продакшену.

#automation#ci#waits#flakiness

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Automation strategy & coverageSeniorCommonScenario

Як ви тестували б робочі процеси (workflows), що залежать від ненадійного стороннього (third-party) сервісу?

Відповідь

Розділяйте тести вашого інтеграційного контракту й обробки відмов від невеликої кількості живих end-to-end перевірок на реальному провайдері. Використовуйте контрольовані фейки (fakes) або ін'єкцію відмов (fault injection) для таймаутів, rate limit-ів, некоректних відповідей, часткового успіху та відновлення, водночас перевіряючи retry, ідемпотентність, circuit breaking та статус, видимий користувачу. Незалежно моніторте живу залежність і уникайте повторного запуску цілих тестів у спосіб, що перетворює реальний дефект стійкості на оманливо успішний результат.

Сильна відповідь включає

  • відокремлює детерміновані контрактні тести від перевірок на живому провайдері
  • ін'єктує реалістичні відмови та перевіряє семантику відновлення
  • не використовує повторні запуски, щоб приховати дефекти залежності

Практичний приклад

Наприклад, флоу чекауту залежить від нестабільного зовнішнього платіжного шлюзу, який іноді таймаутиться. Команда будує набір контрактних тестів проти WireMock-стаба, що симулює 30-секундний таймаут, відповідь 429 rate-limit та відповідь часткового успіху, коли списання пройшло, але callback підтвердження загубився, і перевіряє, що застосунок повторює запит ідемпотентно та показує користувачу коректний статус 'в очікуванні', а не списує кошти двічі; окремо невеликий канарковий потік із 5 реальних транзакцій на годину виконується проти живого sandbox, щоб ловити розбіжності, які мок не покриває.

#automation#dependencies#resilience#contracts

Джерела

Google SRE booksGoogle · Reliability, SLOs, monitoring, incidents and resiliencePlaywright best practicesMicrosoft · Reliable modern browser automationOpenAPI Specification 3.2.0OpenAPI Initiative · API contracts, schemas and operation descriptions
CI/CD & executionMiddleOccasionalPractical

Які проблеми можуть спричиняти спільні структури даних під час паралельного виконання тестів?

Відповідь

Мутабельний спільний стан може призводити до гонок (races), залежності від порядку виконання, втрачених оновлень і відмов, які зникають, коли тест запускається окремо. Надавайте перевагу ізольованим фікстурам та унікальним даним; коли спільне використання неминуче, застосовуйте потокобезпечні (concurrency-safe) структури, явну синхронізацію та атомарне налаштування й очищення з чітко зрозумілою відповідальністю за володіння (ownership). Навантажуйте набір тестів повторними рандомізованими паралельними прогонами та зберігайте інформацію про воркер, seed і таймінги, щоб відмови залишалися відтворюваними.

Сильна відповідь включає

  • розпізнає гонки (races) та залежність від порядку виконання
  • надає перевагу ізоляції перед синхронізацією
  • зберігає достатньо контексту виконання, щоб відтворити відмови через конкурентність

Практичний приклад

Наприклад, два тести, що виконуються паралельно, обидва звертаються до спільної фікстури 'testUser' і оновлюють те саме поле 'balance' — один тест перевіряє, що баланс дорівнює 100 після депозиту, а інший, виконуючись одночасно, щойно зняв 50, тож перший тест періодично флейкі залежно від порядку виконання. Перехід кожного тесту на створення власного унікально названого користувача через фабричну функцію повністю усуває цю взаємодію, а команда додатково починає логувати ID воркера та random seed при падінні, щоб будь-який залишковий флейкі-кейс можна було точно відтворити.

#programming#parallelism#test-data#concurrency

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Test code & programmingJuniorCommonTheory

У чому різниця між dummy, stub, spy, mock і fake?

Відповідь

Усі вони — тестові дублери (test doubles), але виконують різні задачі. Dummy просто заповнює параметр, stub повертає заздалегідь налаштовані відповіді, spy записує факти викликів, mock несе в собі очікування щодо взаємодії, а fake — це легка робоча реалізація, наприклад репозиторій в пам'яті (in-memory). Термінологія в різних бібліотеках може відрізнятися, тому краще пояснювати потрібну поведінку, а не покладатися лише на назву.

Сильна відповідь включає

  • використовує test double як загальний (парасольковий) термін
  • розрізняє налаштування стану від перевірки взаємодії
  • зазначає, що термінологія у різних фреймворках може відрізнятися

Практичний приклад

У наборі тестів на Mockito кандидат налаштовує stub для платіжного шлюзу через when(gateway.charge(any())).thenReturn(success), щоб прогнати happy-path гілку, але потім додає зайвий verify(gateway).charge(...), перетворюючи stub на випадковий mock і змушуючи тест падати навіть при нешкідливому рефакторингу порядку викликів.

#test-doubles#unit-testing#sdet

Джерела

Use test doubles in AndroidGoogle · Definitions, selection and limitations of dummies, stubs, spies, mocks and fakes
Test code & programmingMiddleCommonTest design

Як обрати між stub, mock, spy, fake і реальною залежністю?

Відповідь

Обирайте найпростішого співучасника (collaborator), який зберігає поведінку, якій тест має довіряти. Використовуйте stub, щоб прогнати конкретну гілку логіки, mock або spy — лише якщо сама взаємодія є зовнішньо значущою поведінкою, fake — для багаторазової поведінки зі станом, а реальну залежність — коли точність відтворення важливіша за швидкість і витрати на налаштування. Обов'язково залишайте хоча б одну контрактну або інтеграційну перевірку там, де дублер може розійтися з реальністю.

Сильна відповідь включає

  • відштовхується від поведінки та межі тесту
  • уникає перевірок взаємодії для деталей реалізації
  • поєднує дублери з контрактними або інтеграційними доказами

Практичний приклад

Кандидат, що тестує сервіс оформлення замовлення, робить stub для клієнта розрахунку податків, щоб повертати фіксоване значення в тесті на суму замовлення, але залишає окремий контрактний тест проти реального податкового API, щоб зміна схеми на проді все одно була виявлена, навіть якщо unit-тест ніколи не звертається до нього напряму.

#test-doubles#unit-testing#test-design#sdet

Джерела

Use test doubles in AndroidGoogle · Definitions, selection and limitations of dummies, stubs, spies, mocks and fakesPlaywright best practicesMicrosoft · Reliable modern browser automation
Test code & programmingSeniorOccasionalRisk analysis

Як надмірне мокання (over-mocking) може зробити набір тестів ненадійним, навіть коли він проходить?

Відповідь

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

Сильна відповідь включає

  • визначає хибну впевненість і прив'язку до деталей рефакторингу
  • згадує розбіжність поведінки між дублерами і реальними залежностями
  • пропонує перевірки результату та перевірки на межах системи

Практичний приклад

Команда мокає клієнт складського обліку так, щоб він завжди повертав inStock: true; через півроку реальний API починає повертати null для знятих з продажу товарів, і набір юніт-тестів із моками залишається зеленим, тоді як оформлення замовлення падає в проді, бо жоден контрактний тест ніколи не перевіряв це поле.

#test-doubles#maintainability#unit-testing#sdet

Джерела

Use test doubles in AndroidGoogle · Definitions, selection and limitations of dummies, stubs, spies, mocks and fakesPlaywright best practicesMicrosoft · Reliable modern browser automation
CI/CD & executionSeniorOccasionalIntegration

Як запобігти розбіжності fake-сервісу або репозиторію в пам'яті з реальною реалізацією?

Відповідь

Визначте спільний поведінковий контракт і запускайте однакові приклади відповідності (conformance) як проти fake, так і проти реальної реалізації. Охопіть схеми, значення за замовчуванням, семантику помилок, порядок, ідемпотентність та важливу поведінку в умовах конкурентності; версіонуйте контракт і запускайте його в CI для обох постачальників. Fake має швидко падати (fail fast) на непідтримуваній поведінці, а не мовчки повертати зручний результат.

Сильна відповідь включає

  • запускає один набір контрактних тестів як проти fake, так і проти реальної реалізації
  • охоплює відмови та семантику стану, а не лише щасливі сценарії
  • явно обробляє непідтримувану поведінку fake

Практичний приклад

Репозиторій команди в пам'яті мовчки дозволяв дублікати первинних ключів, тоді як Postgres накладав обмеження унікальності; спільний набір контрактних тестів, що запускається як проти fake, так і проти реальної бази, відразу виявляє розбіжність, щойно хтось додає тест, що покладається на можливість вставити дублікат.

#test-doubles#contract-testing#ci#automation-engineer

Джерела

Use test doubles in AndroidGoogle · Definitions, selection and limitations of dummies, stubs, spies, mocks and fakesOpenAPI Specification 3.2.0OpenAPI Initiative · API contracts, schemas and operation descriptions
Automation strategy & coverageMiddleOccasionalTheory

Що показує мутаційне тестування, чого не показує покриття рядків коду (line coverage)?

Відповідь

Мутаційне тестування вносить невеликі зміни (мутації) у продакшн-код і перевіряє, чи впадуть тести. Рядок може бути покритий, але мати слабкі або відсутні перевірки (assertions), тоді як мутант, що вижив (surviving mutant), показує, що правдоподібна зміна поведінки не була виявлена. Mutation score — це діагностичний сигнал, а не універсальна ціль, оскільки еквівалентні, неважливі та затратні мутанти все одно потребують експертної оцінки.

Сильна відповідь включає

  • розрізняє виконання коду від виявлення некоректної поведінки
  • пояснює вбитих (killed) і тих, що вижили (surviving), мутантів
  • не трактує mutation score як абсолютний показник якості

Практичний приклад

Функція calculateDiscount має 100% покриття рядків, але Stryker мутує перевірку порогу з "більше" на "більше або дорівнює", і жоден тест не падає — це показує, що граничне значення насправді ніколи не перевірялося, а лише те, що функція відпрацювала без винятку.

#mutation-testing#code-coverage#unit-testing#sdet

Джерела

Stryker mutation testing documentationStryker Mutator · Mutation testing, surviving mutants and test-suite effectiveness
CI/CD & executionSeniorOccasionalStrategy

Як впровадити мутаційне тестування, щоб CI не став неприйнятно повільним?

Відповідь

Починайте з ризикованого доменного коду та змінених файлів, виключайте згенерований або тривіальний код, і встановіть базову лінію (baseline), перш ніж додавати поріг, що поступово підвищується (ratcheting threshold). Запускайте фокусований набір мутацій на пул-реквестах і ширший — за розкладом, кешуйте або повторно використовуйте покриття там, де це підтримується, і аналізуйте мутантів, що вижили, шукаючи відсутні перевірки, а не механічно женіться за цифрою.

Сильна відповідь включає

  • використовує ризик і обсяг змін для контролю витрат
  • розділяє швидкий фідбек на пул-реквестах і глибший запуск за розкладом
  • аналізує мутантів, що вижили, замість маніпуляцій з метрикою

Практичний приклад

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

#mutation-testing#ci#test-selection#automation-engineer

Джерела

Stryker mutation testing documentationStryker Mutator · Mutation testing, surviving mutants and test-suite effectivenessDORA research programGoogle Cloud · Software delivery performance (current five-metric model) and organizational capabilities
Automation strategy & coverageJuniorOccasionalTheory

Що таке візуальне регресійне тестування і які дефекти воно добре виявляє?

Відповідь

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

Сильна відповідь включає

  • пояснює порівняння з базовим зображенням (baseline)
  • називає візуальні дефекти, які пропускають семантичні перевірки
  • не замінює функціональне тестування чи тестування доступності

Практичний приклад

Рефакторинг CSS випадково прибирає правило max-width для таблиці з тарифами; усі DOM-перевірки й далі проходять, бо потрібний текст і елементи присутні, але diff у візуальному регресійному тесті одразу показує, що таблиця тепер виходить за межі картки при viewport 1280px.

#visual-regression#screenshots#web-qa#automation-engineer

Джерела

Playwright visual comparisonsMicrosoft · Screenshot baselines, visual comparisons and rendering-environment stability
CI/CD & executionMiddleOccasionalAutomation

Як зробити порівняння скриншотів достатньо стабільним для CI?

Відповідь

Генеруйте та порівнюйте baseline у контрольованому середовищі з фіксованою версією браузера, операційної системи, шрифтів, viewport, кольорових налаштувань і тестових даних. Дочікуйтесь детермінованого стану застосунку, вимикайте або "заморожуйте" анімацію та час, і маскуйте лише справді динамічні ділянки. Використовуйте невеликий обґрунтований допуск (tolerance) і, де можливо, знімки на рівні компонентів — надто широкі пороги можуть приховати реальні регресії.

Сильна відповідь включає

  • контролює середовище рендерингу та стан застосунку
  • точково використовує маскування та допуски
  • віддає перевагу точковим знімкам з дифами, які легко діагностувати

Практичний приклад

Набір тестів, який локально запускали на macOS, а в CI — на Linux, постійно падав лише через відмінності в антиаліасингу шрифтів; фіксація Docker-образу з точно тими самими шрифтами та збіркою браузера, якими записувались baseline, усунула хибні падіння без послаблення порогу diff.

#visual-regression#determinism#ci#automation-engineer

Джерела

Playwright visual comparisonsMicrosoft · Screenshot baselines, visual comparisons and rendering-environment stabilityPlaywright best practicesMicrosoft · Reliable modern browser automation
Automation strategy & coverageSeniorOccasionalStrategy

Який процес рев'ю запобігає бездумному прийняттю нових візуальних baseline?

Відповідь

Зберігайте baseline разом із кодом і робіть їх оновлення явною зміною, що проходить рев'ю. Рев'юєр повинен бачити очікуване, фактичне зображення та diff, пов'язувати зміну із затвердженим дизайном чи вимогою, і відхиляти неповʼязані зміни. Розділяйте навмисні platform-специфічні baseline, вимагайте відповідальної особи (ownership) для критично важливих екранів, і відстежуйте, як часто снепшоти оновлюються без відповідної зміни в продукті.

Сильна відповідь включає

  • розглядає зміни baseline як продуктові зміни, що потребують рев'ю
  • показує докази: очікуване, фактичне зображення та diff
  • відстежує невмотивоване часте оновлення baseline

Практичний приклад

Рев'юєр помічає, що пул-реквест мовчки оновлює дванадцять непов'язаних baseline у флоу оформлення замовлення поряд з одним рядком зміни тексту; з'ясувавши причину, він виявляє регресію рендерингу шрифтів через непов'язане оновлення залежності, яку інакше просто автоматично затвердили б зі словами "просто прийми нові скриншоти".

#visual-regression#code-review#governance#qa-lead

Джерела

Playwright visual comparisonsMicrosoft · Screenshot baselines, visual comparisons and rendering-environment stabilityGit referenceGit Project · Version control concepts and commands
Automation strategy & coverageJuniorOccasionalStrategy

Як обрати матрицю тестування для кросбраузерності та операційних систем?

Відповідь

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

Сильна відповідь включає

  • спирається на політику підтримки та реальні дані з продакшну
  • охоплює окремі рушії, а не кількість брендів браузерів
  • балансує швидкість на пул-реквестах із широтою перевірок за розкладом

Практичний приклад

З аналітики продакшну команда з'ясовує, що 4% користувачів досі на Safari 15 на старих iPad; замість тестування кожної мінорної версії Chrome вони додають саме цю комбінацію Safari/WebKit до матриці, бо вона являє собою справді інший рушій рендерингу і реальний ризик для користувачів.

#cross-browser#browser-matrix#web-qa#automation-engineer

Джерела

Selenium Grid documentationSelenium Project · Parallel remote execution across browser versions and platformsPlaywright best practicesMicrosoft · Reliable modern browser automation
UI automationMiddleOccasionalAutomation

Як спроєктувати надійне паралельне виконання тестів на браузерній сітці (grid)?

Відповідь

Робіть кожен тест незалежним, з ізольованими акаунтами, даними, завантаженнями та станом браузера; явно декларуйте capabilities і уникайте припущень щодо порядку виконання. Розбивайте (shard) тести за виміряною тривалістю, обмежуйте паралелізм відповідно до можливостей grid і бекенду, і зберігайте логи, відео, скриншоти та мережеві дані для кожної сесії окремо. У звітності чітко відрізняйте продуктові збої від нестачі ресурсів grid, проблем запуску браузера та інфраструктурних збоїв.

Сильна відповідь включає

  • ізолює стан і дані для кожного воркера
  • узгоджує рівень паралелізму з можливостями grid і системи
  • відділяє інфраструктурні збої від продуктових

Практичний приклад

Подвоєння кількості воркерів у Selenium Grid з 20 до 40 спричинило стрибок частки падінь з 2% до 30%; причиною виявився пул з'єднань бекенду, а не сам grid, тож рішенням стало обмеження паралелізму до 25 і додавання retry з backoff для помилок вичерпання пулу, а не додавання нових вузлів grid.

#selenium-grid#parallel-testing#cross-browser#automation-engineer

Джерела

Selenium Grid documentationSelenium Project · Parallel remote execution across browser versions and platformsSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Test code & programmingJuniorOccasionalTheory

Чому SDET має розуміти часову та просторову складність (time and space complexity)?

Відповідь

Складність пояснює, як зростають витрати алгоритму чи тестової утиліти зі збільшенням розміру вхідних даних. Це допомагає SDET заздалегідь помітити квадратичне налаштування даних, повільну обробку логів, затратний polling і фікстури, що споживають забагато пам'яті, перш ніж вони зроблять набір тестів непридатним до використання. Варто вказувати домінуючі витрати часу й пам'яті, тестувати на репрезентативному масштабі даних і пам'ятати, що Big O не замінює вимірювання констант, I/O та реальних вузьких місць.

Сильна відповідь включає

  • пов'язує асимптотичне зростання з підтримуваністю набору тестів
  • враховує і час, і додаткову (auxiliary) пам'ять
  • поєднує аналіз із вимірюванням

Практичний приклад

Допоміжна функція для підготовки тестових даних, яка робить лінійний пошук дублікатів всередині циклу, що вставляє N записів, перетворює O(n) сценарій наповнення даними на випадковий O(n у квадраті); на 100 записах цього ніхто не помічає, але нічний прогін, що наповнює 50 000 записів, починає падати за таймаутом, і причину знаходять лише після профілювання.

#algorithms#big-o#sdet#coding-interview

Джерела

MIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexitySoftware Testing Interview Questions and AnswersGeeksforGeeks · Prevalence signal across manual, automation and technical testing topics
Test code & programmingJuniorOccasionalTheory

Як обрати між масивом (array), множиною (set), словником (map), стеком (stack) і чергою (queue) у розв'язанні задачі на кодинг?

Відповідь

Обирайте структуру виходячи з операцій, потрібних для задачі. Масиви зберігають індексований порядок, множини забезпечують унікальність і перевірку належності, словники (map) пов'язують ключі зі значеннями чи лічильниками, стек підтримує обхід за принципом LIFO (останній прийшов — перший вийшов), а черга — за принципом FIFO (перший прийшов — перший вийшов). Поясніть очікувану вартість пошуку, вставки, видалення та збереження порядку, а потім протестуйте порожні, дубльовані та граничні випадки для обраної структури.

Сильна відповідь включає

  • обирає структуру виходячи з потрібних операцій, а не за звичкою
  • пояснює компроміси щодо порядку та складності
  • тестує порожні та дубльовані вхідні дані

Практичний приклад

Коли просять реалізувати LRU-кеш, кандидат, що спершу хапається за звичайний масив, змушений перепроєктовувати рішення посеред співбесіди, щойно з'ясовується, що видалення елемента з середини має бути O(1); поєднання хеш-мапи з двозв'язним списком одразу дає і O(1) пошук, і O(1) видалення.

#data-structures#algorithms#sdet#coding-interview

Джерела

MIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexitySoftware Testing Interview Questions and AnswersGeeksforGeeks · Prevalence signal across manual, automation and technical testing topics
Test code & programmingJuniorOccasionalPractical

Як ефективно знайти дублікати або порівняти частоти символів?

Відповідь

Пройдіться по вхідних даних один раз і зберігайте кожне значення чи нормалізований символ у множині (set) або частотному словнику (frequency map). Множини достатньо, щоб визначити сам факт наявності дублікату; лічильники потрібні, щоб повідомити про конкретні дублікати або порівняти мультимножини, наприклад для перевірки анаграм. Уточніть правила щодо регістру, пробілів і Unicode, а потім протестуйте порожній вхід, повторювані значення, еквівалентний після нормалізації текст і вхідні дані без дублікатів.

Сильна відповідь включає

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

Практичний приклад

На прикладі рядків 'listen' і 'silent' для перевірки анаграми кандидат, що порівнює лише малі літери, упускає, що 'Silent ' із зайвим пробілом і іншим регістром теж має вважатись еквівалентним, щойно інтерв'юер уточнює, що пробіли та регістр треба нормалізувати перед порівнянням.

#hash-map#strings#sdet#coding-interview

Джерела

MIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexityUnicode Standard Annex #29 — Text SegmentationUnicode Consortium · Grapheme clusters, text boundaries and user-perceived charactersSoftware Testing Interview Questions and AnswersGeeksforGeeks · Prevalence signal across manual, automation and technical testing topics
Test code & programmingMiddleOccasionalPractical

Як виявити цикл у зв'язаному списку (linked list) і протестувати рішення?

Відповідь

Використовуйте повільний вказівник, що просувається на один вузол за крок, і швидкий, що просувається на два. Якщо цикл існує, вони зустрінуться; якщо швидкий вказівник досягає кінця списку, це доводить відсутність циклу. Такий підхід (алгоритм Флойда) працює за лінійний час і використовує сталу додаткову пам'ять. Протестуйте порожній список, список з одного вузла із самоциклом і без нього, цикл, що починається з голови чи середини списку, та довгий список без циклу.

Сильна відповідь включає

  • пояснює інваріант повільного та швидкого вказівників
  • вказує на лінійний час і сталу додаткову пам'ять
  • охоплює самоцикли та цикли в різних позиціях

Практичний приклад

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

#linked-list#cycle-detection#sdet#coding-interview

Джерела

MIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexitySoftware Testing Interview Questions and AnswersGeeksforGeeks · Prevalence signal across manual, automation and technical testing topics
Test code & programmingMiddleOccasionalPractical

Як об'єднати інтервали, що перетинаються (overlapping intervals), і перевірити результат?

Відповідь

Спершу перевірте кожен інтервал, відсортуйте за початком, а потім пройдіться один раз: розширюйте поточний інтервал, якщо початок наступного потрапляє в його межі, інакше — завершуйте його і починайте новий. Домінує складність сортування — O(n log n). Уточніть, чи мають зливатися інтервали, що лише дотикаються (touching), а потім протестуйте порожній вхід, один інтервал, вкладені діапазони, однакові межі, невідсортований вхід та невалідні "перевернуті" діапазони (де кінець раніше за початок).

Сильна відповідь включає

  • сортує перед лінійним об'єднанням
  • уточнює семантику меж для дотичних інтервалів
  • виводить тестові випадки з інваріантів алгоритму

Практичний приклад

Маючи інтервали [1,3], [3,5] і [6,8], кандидат, що не уточнив, чи мають зливатись дотичні межі, може отримати два інтервали замість очікуваного інтерв'юером одного об'єднаного [1,5] плюс [6,8], бо випадок "3 дорівнює 3" — це граничний випадок, який вимоги явно не визначили.

#intervals#sorting#sdet#coding-interview

Джерела

MIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexitySoftware Testing Interview Questions and AnswersGeeksforGeeks · Prevalence signal across manual, automation and technical testing topics
Flakiness & reliabilityMiddleOccasionalPractical

Як змоделювати та протестувати обмежену чергу повторних спроб (bounded retry queue) у задачі на кодинг?

Відповідь

Представляйте кожен елемент через кількість спроб і час наступної можливої спроби, обробляйте готові елементи в порядку черги, і повертайте назад лише ті збої, які підлягають повторній спробі, і лише поки залишаються спроби. Ін'єктуйте годинник (clock) та функцію результату, щоб тести були детермінованими. Покрийте успіх, термінальну відмову, вичерпання спроб, таймінг backoff, кілька елементів, дубльовану доставку та інваріант, що один елемент, який постійно падає, не має блокувати всю подальшу роботу.

Сильна відповідь включає

  • робить час і результати ін'єктованими (injectable)
  • визначає переходи станів для повторних спроб і термінальної відмови
  • тестує справедливість обробки, вичерпання спроб і дубльовану доставку

Практичний приклад

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

#queue#retries#state-machine#coding-interview

Джерела

MIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexityGoogle SRE booksGoogle · Reliability, SLOs, monitoring, incidents and resilience
Test code & programmingJuniorOccasionalPractical

Як варто визначати тестові випадки перед написанням коду розв'язку на співбесіді?

Відповідь

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

Сильна відповідь включає

  • уточнює контракт перед реалізацією
  • використовує межі та обмеження для вибору тестових випадків
  • після написання коду цілиться в найкрихкішу гілку алгоритму

Практичний приклад

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

#coding-interview#test-design#sdet#problem-solving

Джерела

Software Testing Interview Questions and AnswersGeeksforGeeks · Prevalence signal across manual, automation and technical testing topicsISTQB CTFL syllabus v4.0.1ISTQB · Testing vocabulary, principles, lifecycle and test-design concepts
Test code & programmingSeniorOccasionalScenario

Як перевірити рішення задачі на кодинг щодо коректності, складності та тестопридатності (testability)?

Відповідь

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

Сильна відповідь включає

  • використовує інваріанти, а не лише інтуїцію
  • виводить складність із фактичної реалізації
  • перевіряє контроль залежностей і видимість відмов

Практичний приклад

Рецензуючи рекурсивне рішення для обходу дерева, рев'юєр запитує, що станеться з деревом глибиною в десять тисяч рівнів; кандидат усвідомлює, що рекурсивний підхід переповнить стек викликів — те, що happy-path тест на дереві з п'яти вузлів так і не виявив.

#code-review#algorithms#testability#sdet

Джерела

MIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexityPlaywright best practicesMicrosoft · Reliable modern browser automation
CI/CD & executionMiddleOccasionalAutomation

Як псевдолокалізація (pseudo-localization) допомагає знаходити дефекти інтернаціоналізації ще до готовності перекладів?

Відповідь

Псевдолокалізація перетворює вихідні рядки так, щоб подовжити текст, додати символи з діакритикою, позначити межі рядків і, за потреби, симулювати напрямок RTL, зберігаючи при цьому текст впізнаваним. Автоматизовані smoke-тести на такому тексті дозволяють рано виявити обрізаний UI, конкатеновані фрагменти, невиведені в зовнішні ресурси (unexternalized) рядки та хибні припущення щодо кодування. Ідентифікатори та користувацькі дані свідомо виключаються з перетворення, а справжнє лінгвістичне тестування та тестування bidi на реальних локалях все одно проводиться пізніше.

Сильна відповідь включає

  • використовує подовження тексту та позначені символи для виявлення проблем верстки
  • виявляє захардкоджені або конкатеновані рядки
  • не замінює перевірку реального перекладу

Практичний приклад

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

#pseudo-localization#internationalization#ci#automation-engineer

Джерела

Unicode CLDR plural and locale dataUnicode Consortium · Locale formats, plural categories and representative localization casesW3C internationalization guidance for bidirectional textW3C · Right-to-left content, bidirectional isolation and semantic direction markup
UI automationMiddleOccasionalRisk analysis

Які переваги та режими відмов у самозцілювальних (self-healing) UI-локаторів?

Відповідь

Self-healing може зменшити витрати на підтримку тестів, коли семантично той самий елемент змінює атрибути, але також може націлитись на неправильний елемент керування і перетворити справжню регресію на тест, що проходить. Спершу віддавайте перевагу доступним ролям (accessible roles), іменам і явним тестовим контрактам. Якщо healing все ж використовується, обмежуйте схожість кандидатів, логуйте кожну заміну, падайте або вимагайте рев'ю для неоднозначних змін, і вимірюйте хибні "зцілення" окремо від заощадженого часу на підтримку.

Сильна відповідь включає

  • визначає хибнопозитивне зцілення як головний ризик
  • спершу віддає перевагу стабільним семантичним локаторам перед healing
  • вимагає видимих замін, які можна перевірити

Практичний приклад

Інструмент self-healing мовчки перенацілює локатор тесту 'Delete Account' на нову кнопку 'Delete Draft' зі схожими атрибутами після редизайну; тест продовжує проходити зеленим тижнями, поки реальний флоу видалення акаунта повністю зламаний, бо ніхто не перевірив зцілений селектор, перш ніж він був прийнятий автоматично.

#self-healing#locators#ai-assisted-testing#automation-engineer

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationCertified Tester AI Testing (CT-AI)ISTQB · AI-system quality characteristics, ML testing and use of AI in testing
Automation strategy & coverageSeniorOccasionalScenario

Як би ви впроваджували автоматизацію в продукт, який наразі покладається на ручну регресію?

Відповідь

Оцініть базові ризики та вартість повторюваної роботи, покращте тестованість і середовища, оберіть тонкий, але цінний зріз функціональності, встановіть відповідальність і зворотний зв'язок через CI, а потім розширюйте покриття на основі виміряної надійності та вартості підтримки. Не починайте з перекладання кожного ручного кейсу.

Сильна відповідь включає

  • дорожня карта, орієнтована на цінність
  • тестованість і відповідальність
  • вимірює надійність і вартість

Практичний приклад

Замість автоматизації всіх 400 наявних ручних регресійних кейсів, тімлід спочатку обирає 30, які виконуються при кожному релізі й покривають найприбутковіший флоу оформлення замовлення, робить їх стабільними в CI протягом місяця, і лише потім розширює покриття — через півроку команда автоматизувала найцінніші 60%, а не випадкові 100%.

#automation-strategy#roadmap#roi

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationDOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topics
Automation strategy & coverageMiddleOccasionalTheory

Чим корисна ідея піраміди тестування і де команди можуть неправильно її застосовувати?

Відповідь

Вона заохочує багато швидких ізольованих перевірок і менше повільних інтегрованих UI-перевірок. Це евристика, а не фіксований відсоток: архітектура, ризик та доступні інтерфейси визначають форму піраміди, а дубльовані перевірки на різних рівнях додають вартість без додаткової користі.

Сильна відповідь включає

  • швидкість зворотного зв'язку та ізоляція
  • немає універсального співвідношення
  • уникає дубльованого покриття

Практичний приклад

Команда бездумно дотримується співвідношення 70/20/10 юніт/інтеграційні/E2E-тести навіть для тонкого API-шлюзу майже без бізнес-логіки, у підсумку пишучи сотні майже безглуздих юніт-тестів лише заради дотримання пропорції, тоді як жменька добре підібраних інтеграційних тестів дала б набагато більше впевненості за набагато меншої вартості підтримки.

#test-pyramid#test-levels#automation

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationISTQB CTFL syllabus v4.0.1ISTQB · Testing vocabulary, principles, lifecycle and test-design concepts
UI automationMiddleOccasionalTheory

Яка стратегія локаторів робить UI-тести одночасно стабільними й змістовними?

Відповідь

Надавайте перевагу видимим користувачу ролям, підписам і стабільним продуктовим контрактам; уникайте стилізації та глибокої структури DOM. Локатор має ідентифікувати саме те, з чим взаємодіє користувач, залишатися унікальним і чітко провалюватися, коли змінюється доступність чи поведінка продукту.

Сильна відповідь включає

  • локатори, орієнтовані на користувача
  • стійкість до прив'язки до DOM
  • унікальність і корисний провал

Практичний приклад

Тест, що використовує CSS-селектор .btn-primary > span:nth-child(2), ламається щоразу, коли дизайнер трохи змінює розмітку кнопки, тоді як переписаний варіант з getByRole('button', { name: 'Submit order' }) переживає повний візуальний редизайн, бо орієнтується на те, що користувач насправді бачить і клацає, а не на деталь реалізації.

#locators#playwright#selenium

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Flakiness & reliabilityMiddleOccasionalTheory

Чому фіксовані затримки (sleep) — слабка стратегія синхронізації і чим їх варто замінити?

Відповідь

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

Сильна відповідь включає

  • синхронізація на основі умови
  • обмежений таймаут
  • провал, який можна діагностувати

Практичний приклад

Тест з 'sleep(3000)' перед натисканням кнопки локально проходить, але флейкіє приблизно раз на 20 запусків на повільнішому CI-раннері; заміна на очікування, поки кнопка стане активною, з обмеженим 10-секундним таймаутом, що при провалі виводить фактичний стан кнопки, усуває флейкі-поведінку і робить будь-який реальний збій одразу зрозумілим для дебагу.

#waits#flakiness#synchronization

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
CI/CD & executionSeniorOccasionalScenario

Що має бути правдою, перш ніж набір тестів зможе безпечно виконуватися паралельно?

Відповідь

Тестам потрібні ізольовані користувачі, дані й ресурси, детермінований setup і teardown, відсутність залежності від порядку виконання та достатня місткість середовища. Паралелізм має обмежуватися найповільнішою спільною залежністю та зберігати діагностовні артефакти для кожного воркера окремо.

Сильна відповідь включає

  • ізоляція даних і ресурсів
  • усвідомлення місткості
  • діагностика для кожного воркера

Практичний приклад

Два тести, що виконуються паралельно, обидва використовують захардкоджений акаунт «testuser@example.com» і починають час від часу падати через гонку за зміну профілю того самого користувача; перехід на динамічно згенеровані унікальні акаунти для кожного воркера одразу усуває флейкі-поведінку й дозволяє масштабувати набір на більшу кількість паралельних воркерів.

#parallelism#isolation#ci

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
CI/CD & executionSeniorOccasionalTheory

Яка інформація перетворює звіт автоматизованого тестування на дієвий сигнал для CI?

Відповідь

Показуйте протестовану збірку, середовище, набір тестів, тривалість, тренд результатів, повтори, категорію збою та посилання на логи, трейси й скриншоти. Відокремлюйте збої продукту від збоїв інфраструктури та відомого карантину, щоб гейт відображав достовірні докази.

Сильна відповідь включає

  • простежувана збірка й середовище
  • діагностичні артефакти
  • класифікація збоїв

Практичний приклад

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

#reporting#ci#quality-gates

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationDORA research programGoogle Cloud · Software delivery performance (current five-metric model) and organizational capabilities
Framework architectureJuniorOccasionalTheory

Як інкапсуляція, абстракція, наслідування та поліморфізм можуть допомогти або нашкодити тестовому коду?

Відповідь

Інкапсуляція та невеликі абстракції можуть централізувати стабільну поведінку; поліморфізм може підтримувати взаємозамінні драйвери. Глибоке наслідування та приховані побічні ефекти ускладнюють розуміння тестів. Застосовуйте ООП там, де це знижує вартість змін, а не для того щоб імітувати архітектуру продакшн-коду.

Сильна відповідь включає

  • пояснює принципи через тестовий код
  • попереджає про глибоке наслідування
  • оптимізує читабельність

Практичний приклад

Базовий клас page object розростається до п'яти рівнів наслідування заради переробки дрібних шматків логіки, і новий співробітник витрачає годину лише на те, щоб зрозуміти, який батьківський клас насправді налаштовує стан логіну; спрощення до одного класу з парою композитних допоміжних об'єктів робить ту саму поведінку очевидною з першого погляду.

#oop#test-code#design

Джерела

DOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topics
Framework architectureJuniorOccasionalTheory

Коли тестовий фреймворк мав би використовувати інтерфейс замість абстрактного базового класу?

Відповідь

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

Сильна відповідь включає

  • контракт проти спільної реалізації
  • кілька реалізацій
  • усвідомлення композиції

Практичний приклад

Фреймворк визначає інтерфейс IBrowserDriver, щоб та сама тестова логіка могла виконуватися і з драйвером Selenium, і з драйвером Playwright, і з мок-драйвером у юніт-тестах, тоді як абстрактний клас BaseTest використовується лише для спільного коду setup/teardown, який справді потрібен кожному конкретному тесту.

#interfaces#abstraction#frameworks

Джерела

DOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topics
Framework architectureMiddleCommonTheory

Які ідеї SOLID найкорисніші, коли фреймворк автоматизації починає опиратися змінам?

Відповідь

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

Сильна відповідь включає

  • конкретний тиск дизайну
  • вузькі залежності
  • уникає абстракції заради абстракції

Практичний приклад

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

#solid#maintainability#automation-framework

Джерела

DOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topics
Framework architectureMiddleCommonTheory

Як DRY, KISS і YAGNI запобігають надмірному ускладненню (over-engineering) фреймворку автоматизації?

Відповідь

Усувайте дублювання лише тоді, коли продубльоване знання змінюється разом; тримайте типові сценарії очевидними та не будуйте точки розширення під уявні майбутні потреби. Читабельність і чіткість діагностики цінніші за мінімально можливу кількість рядків коду.

Сильна відповідь включає

  • дублювання знання
  • прості спостережувані потоки
  • уникає надуманих функцій фреймворку

Практичний приклад

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

#dry#kiss#yagni

Джерела

DOU — QA interview: 250+ questionsDOU · Coverage signal across Junior, Middle, Senior, AQA, web, mobile and practical topics
Test code & programmingMiddleOccasionalScenario

Як тестовий код має обробляти винятки, не приховуючи справжню причину збою?

Відповідь

Ловіть виняток лише тоді, коли додаєте контекст, виконуєте безпечне очищення (cleanup) або перетворюєте відомий граничний випадок. Зберігайте оригінальну причину й стек викликів, уникайте широких блоків catch-and-continue і дозволяйте неочікуваним збоям провалювати тест із відповідними артефактами.

Сильна відповідь включає

  • зберігає оригінальну причину
  • обмежене очищення
  • без тихого продовження виконання

Практичний приклад

Тест обгортає перевірку в try/catch, який при будь-якому винятку просто логує попередження й продовжує виконання, тож справжній провал перевірки тихо проковтується, а тест звітує «зелено», хоча функція насправді зламана. Прибирання цього загального catch і перехоплення лише конкретної очікуваної помилки очищення одразу викриває справжній збій.

#exceptions#diagnostics#test-code

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automation
Flakiness & reliabilitySeniorOccasionalScenario

Як би ви спроектували відтворюваний тест для підозрюваного стану гонки (race condition)?

Відповідь

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

Сильна відповідь включає

  • спільний стан і чергування
  • керована синхронізація
  • перевіряє інваріанти

Практичний приклад

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

#concurrency#race-condition#invariants

Джерела

Google SRE booksGoogle · Reliability, SLOs, monitoring, incidents and resiliencePostgreSQL documentationPostgreSQL Global Development Group · Relational modelling, SQL, joins, constraints, transactions, concurrency, indexes, query plans and recovery
CI/CD & executionMiddleOccasionalScenario

Як би ви підійшли до обсягу автоматизації для інтерфейсу, який швидко змінюється?

Відповідь

Почніть з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — обсяг автоматизації для інтерфейсу, який швидко змінюється. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для обсягу автоматизації
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Регресійний набір для оформлення замовлення розрісся до 400 UI-тестів, які виконувалися 90 хвилин, а за останній квартал реальні дефекти знайшла лише жменька з них. Дизайнери викочували правки інтерфейсу мало не щотижня, і тести на основі локаторів постійно ламалися через косметичні зміни, які не мали жодного стосунку до реальних регресій. Такий послідовний розбір перетворив розпливчасту скаргу на короткий відтворюваний опис, за яким хтось інший міг діяти без зайвого перепитування.

#automation#ci#automation-scope

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationDORA research programGoogle Cloud · Software delivery performance (current five-metric model) and organizational capabilities
CI/CD & executionMiddleOccasionalRisk analysis

Які ризики та тестові оракули найважливіші для обсягу автоматизації у пул-реквестах і нічних прогонах?

Відповідь

Визначте пріоритетність ризиків, здатних звести нанівець результат для користувача чи бізнесу, ще до вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — обсяг автоматизації у пул-реквестах і нічних прогонах. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для обсягу автоматизації
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Регресійний набір для оформлення замовлення розрісся до 400 UI-тестів, які виконувалися 90 хвилин, а за останній квартал реальні дефекти знайшла лише жменька з них. Гейт для пул-реквестів мав давати відповідь за хвилини, тоді як окремий нічний прогін міг дозволити собі покрити значно більше за ніч. Поставивши цей ризик вище за косметичні проблеми в беклозі, команда полагодила його того ж дня, а не поставила в чергу наступного спринту.

#automation#ci#automation-scope

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
CI/CD & executionSeniorOccasionalTest design

Як би ви розробили фокусну тест-стратегію для обсягу автоматизації, коли сторонні сервіси працюють нестабільно?

Відповідь

Побудуйте найменшу корисну модель поведінки, почавши з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — обсяг автоматизації, коли сторонні сервіси працюють нестабільно. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для обсягу автоматизації
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Регресійний набір для оформлення замовлення розрісся до 400 UI-тестів, які виконувалися 90 хвилин, а за останній квартал реальні дефекти знайшла лише жменька з них. Пісочниця платіжного провайдера, яку використовували в CI, флейкіла десь двічі на тиждень, і її падіння заглушали реальний сигнал про проблеми у власному коді команди. Підсумковий тест-план покрив ті два-три сценарії, які справді мали значення, і свідомо пропустив решту, щоб залишатися швидким і легким у підтримці.

#automation#ci#automation-scope

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
CI/CD & executionSeniorOccasionalTroubleshooting

Які режими відмов ви розслідували б найпершими щодо обсягу автоматизації за цільового часу зворотного зв'язку в десять хвилин?

Відповідь

Зробіть розслідування відтворюваним, почавши з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — обсяг автоматизації за цільового часу зворотного зв'язку в десять хвилин. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для обсягу автоматизації
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Регресійний набір для оформлення замовлення розрісся до 400 UI-тестів, які виконувалися 90 хвилин, а за останній квартал реальні дефекти знайшла лише жменька з них. Керівництво встановило жорсткий ліміт у десять хвилин на пайплайн для пул-реквестів, а сам наявний набір тестів займав двадцять п'ять. Перевіривши спершу точний час, вхідні дані й оточення — ще до того, як чіпати код, — команда знайшла справжню причину менш ніж за годину замість цілого дня здогадок.

#automation#ci#automation-scope

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Framework architectureLeadOccasionalAutomation

Що б ви автоматизували для обсягу автоматизації під час міграції між тестовими фреймворками, а що залишили б ручним?

Відповідь

Перш ніж автоматизувати, почніть з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — обсяг автоматизації під час міграції між тестовими фреймворками. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для обсягу автоматизації
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Регресійний набір для оформлення замовлення розрісся до 400 UI-тестів, які виконувалися 90 хвилин, а за останній квартал реальні дефекти знайшла лише жменька з них. Команда переходила з Selenium на Playwright посеред кварталу, і обидва набори тестів мали певний час співіснувати в CI, не подвоюючи флейкі-падіння й витрати на підтримку. Повторювану частину, що не потребувала експертної оцінки, заскриптували в CI, а крок, який вимагав людського рішення, свідомо залишили ручним.

#automation#ci#automation-scope

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationDORA research programGoogle Cloud · Software delivery performance (current five-metric model) and organizational capabilities
UI automationMiddleOccasionalRelease decision

Які докази ви вимагали б для ухвалення рішення про реліз щодо стабільних локаторів для інтерфейсу, який швидко змінюється?

Відповідь

Сформулюйте рішення про реліз, почавши з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — стабільні локатори для інтерфейсу, який швидко змінюється. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для стабільних локаторів
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Тест форми логіну ламався щоспринту, бо шукав кнопки за CSS-класом, а фронтенд-команда перейменовувала ці класи під час кожного редизайну. Дизайнери викочували правки інтерфейсу мало не щотижня, і тести на основі локаторів постійно ламалися через косметичні зміни, які не мали жодного стосунку до реальних регресій. Реліз випустили лише тоді, коли хтось зміг показати конкретні докази, назвати, хто погодив рішення, і чітко сформулювати, який ризик свідомо залишили відкритим.

#automation#ci#stable-locators

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
UI automationMiddleOccasionalScenario

Як би ви підійшли до стабільних локаторів у пул-реквестах і нічних прогонах?

Відповідь

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

Сильна відповідь включає

  • явний ризик і тестовий оракул для стабільних локаторів
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Тест форми логіну ламався щоспринту, бо шукав кнопки за CSS-класом, а фронтенд-команда перейменовувала ці класи під час кожного редизайну. Гейт для пул-реквестів мав давати відповідь за хвилини, тоді як окремий нічний прогін міг дозволити собі покрити значно більше за ніч. Такий послідовний розбір перетворив розпливчасту скаргу на короткий відтворюваний опис, за яким хтось інший міг діяти без зайвого перепитування.

#automation#ci#stable-locators

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
UI automationMiddleOccasionalRisk analysis

Які ризики та тестові оракули найважливіші для стабільних локаторів, коли сторонні сервіси працюють нестабільно?

Відповідь

Визначте пріоритетність ризиків, здатних звести нанівець результат для користувача чи бізнесу, ще до вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — стабільні локатори, коли сторонні сервіси працюють нестабільно. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для стабільних локаторів
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Тест форми логіну ламався щоспринту, бо шукав кнопки за CSS-класом, а фронтенд-команда перейменовувала ці класи під час кожного редизайну. Пісочниця платіжного провайдера, яку використовували в CI, флейкіла десь двічі на тиждень, і її падіння заглушали реальний сигнал про проблеми у власному коді команди. Поставивши цей ризик вище за косметичні проблеми в беклозі, команда полагодила його того ж дня, а не поставила в чергу наступного спринту.

#automation#ci#stable-locators

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
UI automationSeniorOccasionalTest design

Як би ви розробили фокусну тест-стратегію для стабільних локаторів за цільового часу зворотного зв'язку в десять хвилин?

Відповідь

Побудуйте найменшу корисну модель поведінки, почавши з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — стабільні локатори за цільового часу зворотного зв'язку в десять хвилин. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для стабільних локаторів
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Тест форми логіну ламався щоспринту, бо шукав кнопки за CSS-класом, а фронтенд-команда перейменовувала ці класи під час кожного редизайну. Керівництво встановило жорсткий ліміт у десять хвилин на пайплайн для пул-реквестів, а сам наявний набір тестів займав двадцять п'ять. Підсумковий тест-план покрив ті два-три сценарії, які справді мали значення, і свідомо пропустив решту, щоб залишатися швидким і легким у підтримці.

#automation#ci#stable-locators

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationDORA research programGoogle Cloud · Software delivery performance (current five-metric model) and organizational capabilities
Framework architectureSeniorOccasionalTroubleshooting

Які режими відмов ви розслідували б найпершими щодо стабільних локаторів під час міграції між тестовими фреймворками?

Відповідь

Зробіть розслідування відтворюваним, почавши з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — стабільні локатори під час міграції між тестовими фреймворками. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для стабільних локаторів
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Тест форми логіну ламався щоспринту, бо шукав кнопки за CSS-класом, а фронтенд-команда перейменовувала ці класи під час кожного редизайну. Команда переходила з Selenium на Playwright посеред кварталу, і обидва набори тестів мали певний час співіснувати в CI, не подвоюючи флейкі-падіння й витрати на підтримку. Перевіривши спершу точний час, вхідні дані й оточення — ще до того, як чіпати код, — команда знайшла справжню причину менш ніж за годину замість цілого дня здогадок.

#automation#ci#stable-locators

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Flakiness & reliabilityLeadOccasionalAutomation

Що б ви автоматизували для ізоляції тестів для інтерфейсу, який швидко змінюється, а що залишили б ручним?

Відповідь

Перш ніж автоматизувати, почніть з вибору перевірок за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. У фокусі — ізоляція тестів для інтерфейсу, який швидко змінюється. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доцільному рівні. Охопіть ізоляцію тестів, синхронізацію, діагностику, безпечність паралельного запуску та правила карантину нестабільних тестів. Тримайте дані та залежності під контролем настільки, щоб можна було відтворити збій. Випускайте зміни лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • явний ризик і тестовий оракул для ізоляції тестів
  • оптимізує цикл зворотного зв'язку
  • розглядає флейкі-тести як дефект
  • вимірювані докази та формулювання залишкового ризику

Практичний приклад

Два паралельні воркери одночасно створювали користувача з однаковим email у спільній staging-базі, і очищення даних після одного тесту видаляло дані, які ще були потрібні іншому. Дизайнери викочували правки інтерфейсу мало не щотижня, і тести на основі локаторів постійно ламалися через косметичні зміни, які не мали жодного стосунку до реальних регресій. Повторювану частину, що не потребувала експертної оцінки, заскриптували в CI, а крок, який вимагав людського рішення, свідомо залишили ручним.

#automation#ci#test-isolation

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Flakiness & reliabilityMiddleOccasionalRelease decision

Які докази вам потрібні, щоб ухвалити рішення про реліз щодо ізоляції тестів між pull request-перевірками та нічними прогонами?

Відповідь

Сформулюйте рішення про реліз на основі того, що ви обираєте перевірки за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. Зосередьтеся на ізоляцію тестів між pull request-перевірками та нічними прогонами. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доречному рівні. Охопіть ізоляцію, синхронізацію, діагностику, безпеку паралельного виконання та правила карантину тестів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для ізоляції тестів
  • оптимізує цикл зворотного зв'язку
  • трактує флейкі-поведінку тестів як дефект
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Пайплайн для PR у команді запускав частину тестів на спільній staging-базі даних, тож два PR, змерджені майже одночасно, час від часу ламали тести одне одного через конфлікти даних, не пов'язані з їхніми змінами. Рішенням стало виділення кожному запуску PR власної тимчасової схеми бази даних, заповненої з фікстури, тоді як нічний прогін залишив повний спільний набір даних для виявлення взаємодій між функціями. Після зміни кількість падінь на PR різко скоротилася, а нічний прогін усе одно виявив реальний баг протягом тижня.

#automation#ci#test-isolation

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Flakiness & reliabilityMiddleOccasionalScenario

Як би ви підійшли до ізоляції тестів, коли сторонні сервіси нестабільні?

Відповідь

Почніть з того, що ви обираєте перевірки за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. Зосередьтеся на ізоляцію тестів, коли сторонні сервіси нестабільні. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доречному рівні. Охопіть ізоляцію, синхронізацію, діагностику, безпеку паралельного виконання та правила карантину тестів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для ізоляції тестів
  • оптимізує цикл зворотного зв'язку
  • трактує флейкі-поведінку тестів як дефект
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Виклик платіжного сервісу в тестах оформлення замовлення час від часу завершувався тайм-аутом, бо провайдер пісочниці обмежує кількість запитів у робочі години. Команда замінила звернення до живої пісочниці на записаний контрактний мок для ізольованого шару тестів, залишивши один невеликий канарковий тест, який усе ще звертається до реальної пісочниці щоночі. Флейкі-частка через ізоляцію тестів впала з 15% практично до нуля в пайплайні для PR.

#automation#ci#test-isolation

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationDORA research programGoogle Cloud · Software delivery performance (current five-metric model) and organizational capabilities
Flakiness & reliabilityMiddleOccasionalRisk analysis

Які ризики та тестові оракули найважливіші для ізоляції тестів за цільового часу зворотного зв'язку в десять хвилин?

Відповідь

Визначте пріоритетність ризиків, які можуть звести нанівець результат для користувача або бізнесу, ще до того, як ви обираєте перевірки за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. Зосередьтеся на ізоляцію тестів за цільового часу зворотного зв'язку в десять хвилин. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доречному рівні. Охопіть ізоляцію, синхронізацію, діагностику, безпеку паралельного виконання та правила карантину тестів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для ізоляції тестів
  • оптимізує цикл зворотного зв'язку
  • трактує флейкі-поведінку тестів як дефект
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Набір тестів, що виконувався 35 хвилин через спільну заповнену базу даних, розбили так, щоб ізольовані тести йшли паралельними шардами проти окремих баз для кожного воркера, скоротивши час до дев'яти хвилин. Команда відстежувала p95 тривалості пайплайну на дашборді й трактувала будь-який прогін, що перевищував десять хвилин, як регресію, яку треба виправляти, а не терпіти.

#automation#ci#test-isolation

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Flakiness & reliabilitySeniorOccasionalTest design

Як би ви розробили сфокусовану тестову стратегію для ізоляції тестів під час міграції між тестовими фреймворками?

Відповідь

Побудуйте найменшу корисну модель поведінки, спираючись на те, що ви обираєте перевірки за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. Зосередьтеся на ізоляцію тестів під час міграції між тестовими фреймворками. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доречному рівні. Охопіть ізоляцію, синхронізацію, діагностику, безпеку паралельного виконання та правила карантину тестів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для ізоляції тестів
  • оптимізує цикл зворотного зв'язку
  • трактує флейкі-поведінку тестів як дефект
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Під час міграції набору тестів із Protractor на Playwright команда протягом двох спринтів запускала обидва фреймворки паралельно в окремих лініях CI, порівнюючи результати pass/fail тест за тестом, щоб виявити регресії ізоляції, спричинені моделлю паралелізму нового фреймворка за замовчуванням. Виявилося, що одна флейкі-група тестів використовувала спільний файл-фікстуру, у який воркери Playwright писали одночасно, і це раніше маскував старий послідовний ранер.

#automation#ci#test-isolation

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Flakiness & reliabilitySeniorOccasionalTroubleshooting

Які варіанти відмов ви б досліджували першими щодо стратегій очікування для інтерфейсу користувача, який швидко змінюється?

Відповідь

Зробіть розслідування відтворюваним, спираючись на те, що ви обираєте перевірки за цінністю зворотного зв'язку, відтворюваністю та вартістю підтримки, а не за відсотком автоматизації. Зосередьтеся на стратегії очікування для інтерфейсу користувача, який швидко змінюється. Як оракул використовуйте детерміновані перевірки (assertions) на найнижчому доречному рівні. Охопіть ізоляцію, синхронізацію, діагностику, безпеку паралельного виконання та правила карантину тестів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли набір тестів дає швидкі відтворювані падіння, а вартість його підтримки залишається прозорою.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для стратегій очікування
  • оптимізує цикл зворотного зв'язку
  • трактує флейкі-поведінку тестів як дефект
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Набір тестів використовував фіксовані паузи по 2 секунди, щоб дочекатися відображення графіків на дашборді, а після редизайну одні графіки почали завантажуватися за 200 мс, а інші — за 4 секунди, і набір тестів став одночасно повільним і флейкі. Рішенням стала заміна кожної фіксованої паузи на явне очікування конкретного сигналу про готовність (наприклад, атрибута 'data-loaded'), що прибрало флейкі-поведінку та скоротило загальний час прогону вдвічі.

#automation#ci#wait-strategies

Джерела

Playwright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation
Test code & programmingMiddleOccasionalScenario

Як би ви підійшли до функцій і побічних ефектів усередині спільної тестової бібліотеки?

Відповідь

Почніть з того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на функції та побічні ефекти усередині спільної тестової бібліотеки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Спільний хелпер 'login as user' у тестовій бібліотеці за кожним викликом мовчки створював новий акаунт у базі даних, і за кілька місяців повторного використання CI-база накопичила мільйони «сирітських» рядків, які сповільнювали кожен прогін. Команда переписала його як чисту функцію, що повертає токен із фікстури, а фактичне створення акаунта винесла в окремий явний і залогований крок налаштування, який інші автори могли свідомо перевикористовувати.

#programming#test-code#functions-and-side-effects

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingMiddleOccasionalRisk analysis

Які ризики та тестові оракули найважливіші для функцій і побічних ефектів, коли операції можуть завершитися помилкою або тайм-аутом?

Відповідь

Визначте пріоритетність ризиків, які можуть звести нанівець результат для користувача або бізнесу, ще до того, як ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на функції та побічні ефекти, коли операції можуть завершитися помилкою або тайм-аутом. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Функція, яка записувала рядок аудиту, а потім викликала downstream API білінгу, залишала рядок аудиту закомічений навіть тоді, коли виклик білінгу завершувався тайм-аутом, що породжувало записи про списання, яких насправді не було. Команда додала тест, що примусово викликає тайм-аут білінгу й перевіряє, що запис аудиту відкочується або позначається як «в очікуванні», і це виявило ще два приховані шляхи часткового збою.

#programming#test-code#functions-and-side-effects

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
CI/CD & executionSeniorOccasionalTest design

Як би ви розробили сфокусовану тестову стратегію для функцій і побічних ефектів за паралельного виконання?

Відповідь

Побудуйте найменшу корисну модель поведінки, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на функції та побічні ефекти за паралельного виконання. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Два тестові воркери, що викликали спільний хелпер «збільшити лічильник» проти одного in-memory сховища, приблизно в одному прогоні з двадцяти губили оновлення. Стратегією стали кілька невеликих детермінованих юніт-тестів логіки лічильника окремо плюс цільовий тест на конкурентність, що запускає N паралельних викликів і перевіряє, що фінальне значення дорівнює N, — це надійно відтворювало гонку замість покладання на нестабільні наскрізні прогони.

#programming#test-code#functions-and-side-effects

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingSeniorOccasionalTroubleshooting

Які варіанти відмов ви б досліджували першими щодо функцій і побічних ефектів із вхідними даними від ненадійного API?

Відповідь

Зробіть розслідування відтворюваним, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на функції та побічні ефекти з вхідними даними від ненадійного API. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Функція розрахунку ціни довіряла полю валюти від API партнера й напряму множила його у запис у базу даних; коли партнер одного разу надіслав порожній рядок замість числа, функція записала NaN у тисячі рядків замовлень, перш ніж хтось це помітив. Першим, що перевірили після інциденту, було те, чи валідує функція та відхиляє некоректні вхідні дані до того, як виконати будь-який побічний ефект, — і виявилося, що ні.

#programming#test-code#functions-and-side-effects

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingLeadOccasionalAutomation

Що б ви автоматизували для функцій і побічних ефектів під час рефакторингу без зміни поведінки, а що залишили б ручним?

Відповідь

Перш ніж автоматизувати, почніть з того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на функції та побічні ефекти під час рефакторингу без зміни поведінки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Перед розбиттям монолітної функції 'processOrder' на менші частини команда зафіксувала її побічні ефекти (надіслані листи, записані рядки, опубліковані події) для фіксованого набору зразкових замовлень і перетворила це на автоматизований набір характеризаційних тестів. Вручну лід усе одно переглядав diff на випадки, не покриті фікстурами, наприклад рідкісний шлях часткового повернення коштів, перед мержем.

#programming#test-code#functions-and-side-effects

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingMiddleOccasionalRelease decision

Які докази вам потрібні, щоб ухвалити рішення про реліз щодо композиції об'єктів усередині спільної тестової бібліотеки?

Відповідь

Сформулюйте рішення про реліз на основі того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на композицію об'єктів усередині спільної тестової бібліотеки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Спільна бібліотека page object-ів композувала CheckoutPage з CartWidget і об'єкта PaymentForm, і зміна в конструкторі PaymentForm мовчки ламала кожен тест, що композував його всередині CheckoutPage. Перед релізом команда вимагала доказів, що всі об'єкти, які беруть участь у композиції, покриті хоча б одним інтеграційним тестом, а не лише юніт-тестами листкового об'єкта PaymentForm.

#programming#test-code#object-composition

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingMiddleOccasionalScenario

Як би ви підійшли до композиції об'єктів, коли операції можуть завершитися помилкою або тайм-аутом?

Відповідь

Почніть з того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на композицію об'єктів, коли операції можуть завершитися помилкою або тайм-аутом. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Об'єкт Order, композований з підоб'єктів Payment і Shipment, залишав Shipment напівініціалізованим, коли крок Payment завершувався тайм-аутом посеред побудови, а подальший код вважав, що Shipment завжди валідний, і кидав помилку null pointer. Підхід полягав у тому, щоб зробити композицію явною й поетапною, віддаючи зібраний Order лише тоді, коли всі підоб'єкти підтвердили успіх, або ж провалюючи всю побудову атомарно.

#programming#test-code#object-composition

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
CI/CD & executionMiddleOccasionalRisk analysis

Які ризики та тестові оракули найважливіші для композиції об'єктів за паралельного виконання?

Відповідь

Визначте пріоритетність ризиків, які можуть звести нанівець результат для користувача або бізнесу, ще до того, як ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на композицію об'єктів за паралельного виконання. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Два потоки, що композували той самий кешований об'єкт Session зі спільної фабрики, обидва отримували напівпобудований об'єкт, бо фабрика не захищала процес побудови, що пошкоджувало стан для обох. Головним ризиком визначили мутабельну спільну композицію без синхронізації, а оракулом став тест, що «б'є» по фабриці з багатьох потоків і перевіряє, що кожен повернений об'єкт повністю й коректно скомпонований.

#programming#test-code#object-composition

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingSeniorOccasionalTest design

Як би ви розробили сфокусовану тестову стратегію для композиції об'єктів із вхідними даними від ненадійного API?

Відповідь

Побудуйте найменшу корисну модель поведінки, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на композицію об'єктів із вхідними даними від ненадійного API. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

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

#programming#test-code#object-composition

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingSeniorOccasionalTroubleshooting

Які варіанти відмов ви б досліджували першими щодо композиції об'єктів під час рефакторингу без зміни поведінки?

Відповідь

Зробіть розслідування відтворюваним, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на композицію об'єктів під час рефакторингу без зміни поведінки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

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

#programming#test-code#object-composition

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingLeadOccasionalAutomation

Що б ви автоматизували для обробки помилок усередині спільної тестової бібліотеки, а що залишили б ручним?

Відповідь

Перш ніж автоматизувати, почніть з того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на обробку помилок усередині спільної тестової бібліотеки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для обробки помилок
  • контролює побічні ефекти та залежності
  • проєктує код так, щоб тести були детермінованими
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Спільний хелпер 'waitForElement' проковтував будь-який виняток і повертав null, тож десятки тестів у наборі повідомляли про заплутані помилки null-посилання замість справжньої помилки тайм-ауту. Команда автоматизувала lint-правило, яке позначає будь-який catch-блок у спільній бібліотеці без повторного кидання чи логування, але рішення про те, який саме тип власного винятку кидати в кожному хелпері, залишили за ручним рев'ю коду.

#programming#test-code#error-handling

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingMiddleOccasionalRelease decision

Які докази вам потрібні, щоб ухвалити рішення про реліз щодо обробки помилок, коли операції можуть завершитися помилкою або тайм-аутом?

Відповідь

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

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для обробки помилок
  • контролює побічні ефекти та залежності
  • проєктує код так, щоб тести були детермінованими
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

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

#programming#test-code#error-handling

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
CI/CD & executionMiddleOccasionalScenario

Як би ви підійшли до обробки помилок за паралельного виконання?

Відповідь

Почніть з того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на обробку помилок за паралельного виконання. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для обробки помилок
  • контролює побічні ефекти та залежності
  • проєктує код так, щоб тести були детермінованими
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Коли один із десяти паралельних API-викликів у батчі провалювався, обробник помилок батчу логував лише перший побачений виняток і мовчки відкидав решту дев'ять результатів, деякі з яких теж провалилися, але по-іншому. Підхід полягав у тому, щоб збирати кожну паралельну відмову в об'єкт-агрегат помилок і перевіряти в тестах повний набір, а не лише перший виявлений випадок.

#programming#test-code#error-handling

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingMiddleOccasionalRisk analysis

Які ризики та тестові оракули найважливіші для обробки помилок із вхідними даними від ненадійного API?

Відповідь

Визначте пріоритетність ризиків, які можуть звести нанівець результат для користувача або бізнесу, ще до того, як ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на обробку помилок із вхідними даними від ненадійного API. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для обробки помилок
  • контролює побічні ефекти та залежності
  • проєктує код так, щоб тести були детермінованими
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

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

#programming#test-code#error-handling

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingSeniorOccasionalTest design

Як би ви розробили сфокусовану тестову стратегію для обробки помилок під час рефакторингу без зміни поведінки?

Відповідь

Побудуйте найменшу корисну модель поведінки, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на обробку помилок під час рефакторингу без зміни поведінки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

  • чіткий ризик і тестовий оракул для обробки помилок
  • контролює побічні ефекти та залежності
  • проєктує код так, щоб тести були детермінованими
  • наводить вимірювані докази та констатацію залишкового ризику

Практичний приклад

Рефакторинг громіздкого блоку try/catch на менші функції ризикував непомітно змінити, які винятки де перехоплюються. Стратегія полягала в тому, щоб спершу написати характеризаційні тести, які фіксують точний тип і повідомлення винятку для кожного відомого відмовного вхідного значення в старому коді, а потім прогнати ті самі тести без змін проти рефакторингової версії перед мержем.

#programming#test-code#error-handling

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Flakiness & reliabilitySeniorOccasionalTroubleshooting

Які варіанти відмов ви б досліджували першими щодо асинхронного коду усередині спільної тестової бібліотеки?

Відповідь

Зробіть розслідування відтворюваним, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на асинхронний код усередині спільної тестової бібліотеки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

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

#programming#test-code#asynchronous-code

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Flakiness & reliabilityLeadOccasionalAutomation

Що б ви автоматизували для асинхронного коду, коли операції можуть завершитися помилкою або тайм-аутом, а що залишили б ручним?

Відповідь

Перш ніж автоматизувати, почніть з того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на асинхронний код, коли операції можуть завершитися помилкою або тайм-аутом. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

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

#programming#test-code#asynchronous-code

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Flakiness & reliabilityMiddleOccasionalRelease decision

Які докази вам потрібні, щоб ухвалити рішення про реліз щодо асинхронного коду за паралельного виконання?

Відповідь

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

Сильна відповідь включає

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

Практичний приклад

Перед релізом фічі, яка одночасно запускає кілька асинхронних API-викликів під час завантаження сторінки, команда хотіла доказів, що ці виклики не конкурують за оновлення того самого фрагмента стану UI в непослідовному порядку. Вирішальним доказом став тест, що навмисно резолвить виклики в неправильному порядку й перевіряє, що фінальний стан UI коректний.

#programming#test-code#asynchronous-code

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Flakiness & reliabilityMiddleOccasionalScenario

Як би ви підійшли до асинхронного коду з вхідними даними від ненадійного API?

Відповідь

Почніть з того, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на асинхронний код з вхідними даними від ненадійного API. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Асинхронний обробник дочікувався пейлоада вебхука від стороннього API й напряму передавав одне з полів у запит до бази даних без валідації, і коли партнер одного разу надіслав пейлоад без цього поля взагалі, дочекане звернення кинуло виняток усередині «запустив і забув» проміса, який ніхто не слухав. Підхід полягав у тому, щоб валідувати пейлоад синхронно до входження в будь-який асинхронний ланцюжок і гарантувати, що кожен такий ланцюжок має явний обробник відхилення.

#programming#test-code#asynchronous-code

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Flakiness & reliabilityMiddleOccasionalRisk analysis

Які ризики та тестові оракули найважливіші для асинхронного коду під час рефакторингу без зміни поведінки?

Відповідь

Визначте пріоритетність ризиків, які можуть звести нанівець результат для користувача або бізнесу, ще до того, як ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на асинхронний код під час рефакторингу без зміни поведінки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

Перетворення ланцюжка викликів .then() на async/await ризикувало змінити поширення помилок, бо непойманий reject у старому коді мовчки перетворювався на непіймане виключення в новому. Головним ризиком була саме ця зміна поведінки «проковтнуто проти кинуто», а оракулом — тест, що перевіряє появу того самого об'єкта помилки в тій самій точці виклику до і після рефакторингу.

#programming#test-code#asynchronous-code

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMDN JavaScript GuideMozilla · Functions, closures, objects, classes, error handling and asynchronous programming (promises, async/await)
Test code & programmingSeniorOccasionalTest design

Як би ви розробили сфокусовану тестову стратегію для структур даних усередині спільної тестової бібліотеки?

Відповідь

Побудуйте найменшу корисну модель поведінки, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на структури даних усередині спільної тестової бібліотеки. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

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

#programming#test-code#data-structures

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automationMIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexity
Test code & programmingSeniorOccasionalTroubleshooting

Які варіанти відмов ви б досліджували першими щодо структур даних, коли операції можуть завершитися помилкою або тайм-аутом?

Відповідь

Зробіть розслідування відтворюваним, спираючись на те, що ви чітко визначаєте входи, виходи, відповідальність і поведінку під час збоїв, перш ніж обирати реалізацію. Зосередьтеся на структури даних, коли операції можуть завершитися помилкою або тайм-аутом. Як оракул використовуйте невеликі детерміновані юніт-тести разом з інтеграційною поведінкою на реальних межах системи. Охопіть штатний перебіг, некоректні вхідні дані, винятки, конкурентність і звільнення ресурсів. Тримайте дані й залежності під контролем настільки, щоб можна було відтворити збій. Випускайте реліз лише тоді, коли тести падають з однієї зрозумілої причини, а код залишається легким для змін.

Сильна відповідь включає

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

Практичний приклад

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

#programming#test-code#data-structures

Джерела

Git referenceGit Project · Version control concepts and commandsPlaywright best practicesMicrosoft · Reliable modern browser automationMIT OpenCourseWare — Introduction to AlgorithmsMIT OpenCourseWare · Data structures, algorithmic reasoning and time and space complexity
Framework architectureMiddleCommonStrategy

Як обрати між Playwright, Selenium, Cypress або іншим підходом до automation для конкретного продукту?

Відповідь

Починайте не з популярності, а з обмежень продукту й команди: required browsers і platforms, architecture застосунку, language ecosystem, наявні skills, CI topology, parallel execution, debugging artifacts, network control, accessibility needs, plugin maturity та maintenance cost. Зробіть невеликий prototype найризикованіших workflows у двох реалістичних кандидатах і порівняйте reliability, diagnostics та operating effort. Універсального переможця немає; зафіксуйте trade-off і можливий exit path.

Сильна відповідь включає

  • починає з product coverage і team constraints, а не з улюбленого tool
  • порівнює reliability, diagnostics, CI behavior і maintenance cost через невеликий spike
  • документує trade-offs і не оголошує один framework універсально найкращим

Практичний приклад

Команді потрібні Chromium, Firefox і WebKit, TypeScript, parallel CI та сильні traces для сучасного web app, тому Playwright добре показує себе у короткому spike. Інша організація вже має зрілий Java Selenium Grid, внутрішні libraries і legacy browser obligations; заміна створила б більше maintenance risk, ніж користі, тому Selenium там залишається раціональним вибором.

#automation-framework#tool-selection#playwright#selenium#cypress

Джерела

QA Interview Questions and Answers for 2026Testsigma · Current recurrence signal from beginner through senior QA, manual testing, automation, CI/CD and scenario questions200+ QA Interview Questions & Answers (2026)AssertHired · Current QA/SDET recurrence signal across practical scenarios, automation, API, CI/CD, real-time systems and tool selectionPlaywright best practicesMicrosoft · Reliable modern browser automationSelenium documentationSelenium Project · WebDriver architecture, waits, Grid and browser automation