Сім принципів тестування
Зміст
«Назвіть сім принципів тестування» — питання, за яким стоїть одна з найбільш недооцінених тем: список легко зазубрити за вечір, але інтерв'юер майже ніколи не хоче список. Він хоче почути, як принцип проявляється в щоденній роботі: чому «всі тести зелені» не означає «багів немає», навіщо чіпати , яка роками не падає, і чому процес з попереднього проєкту не можна сліпо перенести на новий.
Принципи зафіксовані в силабусі ISTQB CTFL (розділ 1.3), але придумали їх не для сертифікації — це концентрат граблів, на які індустрія наступала десятиліттями. Кожен принцип — попередження про конкретну інженерну або управлінську помилку. Саме тому найкращий спосіб їх вивчити — не завчити формулювання, а прив'язати до кожного живу ситуацію. Так і підемо.
Принцип 1. Тестування показує наявність дефектів, а не їхню відсутність
Тестування може довести, що дефекти (defects) у продукті є, але ніколи не доведе, що їх немає. Формулювання сягає ще Едсгера Дейкстри: тестування виявляє присутність багів, а не їхню відсутність. Скільки б перевірок не пройшло — це лише означає, що в перевірених сценаріях дефектів не знайдено. Про неперевірені сценарії зелений прогін не каже нічого.
Живий приклад. Команда виконала 500 тест-кейсів на форму логіну — усі пройшли. Через тиждень користувач заходить у два акаунти в сусідніх вкладках, і сесії змішуються. Дефект був завжди; просто жоден із 500 кейсів не перевіряв одночасні сесії. Тести не збрехали — вони відповіли тільки на ті питання, які їм поставили.
Практичний наслідок — мова звітності. Досвідчений QA не пише «багів немає», він пише «у перевірених сценаріях дефектів не виявлено» і додає, що саме перевірялося. Тестування знижує ймовірність невиявлених дефектів і дає підстави для рішення про реліз — але не видає сертифікат бездоганності. Різницю між дефектом, помилкою і збоєм ми розібрали в главі Тестування, QA і QC.
Принцип 2. Вичерпне тестування неможливе
Перевірити всі комбінації вхідних даних, станів і неможливо для будь-якої нетривіальної системи — не «дуже важко», а недосяжно за будь-який реалістичний час: кількість комбінацій зростає експоненційно.
Порахуймо на пальцях. Форма налаштувань із 10 незалежними чекбоксами — це 2^10, тобто 1024 комбінації станів. Додаємо три дропдауни по 5 значень — уже 128 000. А тепер одне-єдине текстове поле: варіанти довжини, літери різних алфавітів, емодзі, пробіли, спецсимволи — простір значень практично нескінченний. І це ще без пар «браузер × операційна система» та станів самої системи.
Наслідок фундаментальний: тестування — це завжди вибірка, а отже, завжди пріоритезація. Замість «перевірити все» ми відповідаємо на питання «що перевірити в першу чергу, щоб зловити найімовірніші та найдорожчі дефекти». Інструменти для розумної вибірки дає тест-дизайн (, — про них окремий розділ), а критерій «що важливіше» — ризик-орієнтоване тестування.
Підступне продовження цього принципу — «а якщо дати необмежений час?». Правильна відповідь: на практиці не допоможе — для нетривіальної системи простір комбінацій практично нескінченний, а сам продукт тим часом змінюється, тому питання не в часі, а в стратегії вибірки.
Принцип 3. Раннє тестування заощаджує час і гроші
Що раніше в життєвому циклі знайдено дефект, то дешевше його виправити. Дефект, помічений у вимогах, — це правка одного речення в документі. Той самий дефект на проді — це хотфікс, зіпсовані дані користувачів, нічний і розбір польотів.
Вартість зростає з кожним етапом, бо дефект встигає «обрости» наслідками: на ньому будують інший код, під нього пишуть тести, його поведінку бачать користувачі. Живий приклад: у вимозі написано «знижка застосовується до суми замовлення», і ніхто не спитав, до суми з доставкою чи без. Якщо питання поставили на рев'ю вимог — це хвилина обговорення. Якщо неоднозначність доїхала до проду — це два різних тлумачення в коді бекенду і фронтенду, розбіжності в чеках і повернення грошей.
Тому тестування починається не з першого , а з першого документа: рев'ю вимог і — це теж тестування (докладніше — у главі Статичне тестування і рев'ю). Цей підхід називають (shift-left) — переміщенням перевірок на ранні фази життєвого циклу.
Принцип 4. Скупчення дефектів
Дефекти розподіляються по системі нерівномірно: невелика частина модулів зазвичай містить більшість багів. Це відлуння принципу Парето — евристики «80/20»: більшість проблем концентрується в меншості коду.
Чому так? Баги скупчуються там, де складна логіка (розрахунок знижок, права доступу), де часті зміни (модуль, який правлять кожен спринт), де зовнішні залежності (інтеграція з платіжним провайдером) і де легасі-код, якого всі бояться. Живий приклад: у типовому e-commerce проєкті модуль чекауту з промокодами, доставкою і оплатою збирає більше дефектів, ніж усі статичні сторінки разом, — і це стабільно з релізу в реліз.
Практичний наслідок: історія баг-трекера — це карта мінних полів. Якщо в модулі знайшли п'ять багів, найімовірніше, там є шостий — і глибше тестувати треба саме там, а не рівномірно розмазувати зусилля по всьому продукту. Скупчення дефектів — один із головних аргументів при виборі обсягу регресії і пріоритетів у -орієнтованому підході.
Принцип 5. Парадокс пестицидів: тести зношуються
Якщо ганяти ті самі тести раз за разом, вони перестають знаходити нові дефекти — як шкідники з часом стають нечутливими до того самого пестициду. У силабусі ISTQB CTFL 4.0 принцип називається «тести зношуються» (tests wear out) і має посилання (Beizer 1990) — але стоїть воно на самому принципі, а не на метафорі: слова «pesticide» силабус не вживає ніде. «Парадокс пестицидів» — усталена індустріальна назва; приписувати саму метафору Борису Бейзеру джерело підстав не дає.
Механізм простий: тест знаходить дефект → дефект виправляють → тест назавжди стає зеленим. Усі баги, які цей набір міг зловити, уже зловлено. Нові дефекти з'являються в місцях і сценаріях, яких набір не покриває, — і роками зелена регресія починає давати хибне відчуття безпеки.
Класична ознака зношеного автотесту — роками незмінні захардкоджені дані:
// Три роки той самий товар і той самий користувач — тест давно нічого не ловить
test('додавання товару оновлює лічильник кошика', async ({ page }) => {
await page.goto('/product/42');
await page.getByRole('button', { name: 'Додати в кошик' }).click();
await expect(page.getByTestId('cart-count')).toHaveText('1');
});
Ліки: періодично переглядати набір, варіювати , додавати перевірки під нові фічі та знайдені на проді баги, доповнювати скриптовані прогони (exploratory testing). Важливий нюанс, який цінують інтерв'юери: принцип не вимагає викидати стабільну регресію. Для контролю «старе не зламалося» повторюваність — перевага; зношування означає лише, що нових багів від старого набору чекати не варто.
Принцип 6. Тестування залежить від контексту
Не існує єдиного правильного способу тестувати. Підхід визначається продуктом, ризиками, доменом, командою і стадією проєкту.
Порівняйте: медичне ПЗ або банківський застосунок — регуляторні вимоги, формальна документація, глибоке , аудит; маркетинговий лендинг на два тижні життя — швидкий чеклист і ; мобільна гра — фокус на сумісності пристроїв і UX; внутрішня адмінка на п'ять користувачів — мінімум формальностей. Той самий інженер, ті самі техніки — але глибина, документація і пріоритети радикально різні. Навіть усередині одного продукту API-тестування і UI-тестування вимагають різних підходів та інструментів.
Практичні наслідки два. Перший: переносити процес між проєктами треба свідомо, а не «у нас на минулій роботі так було». Другий, співбесідний: будь-яке питання формату «як би ти протестував X» сильний кандидат починає з уточнення контексту — хто користувач, які ризики, скільки часу. Відповідь без питань про контекст — це і є порушення шостого принципу. Як модель розробки змінює роботу QA — окрема тема глави SDLC: моделі розробки ПЗ.
Принцип 7. Хибність відсутності дефектів (absence-of-defects fallacy)
Хибне уявлення про відсутність дефектів (absence-of-defects fallacy; у попередніх версіях силабусу — absence-of-errors fallacy): якщо в продукті не знайдено дефектів — це ще не означає, що продукт успішний. Можна ідеально реалізувати і вилизати до нуля багів систему, яка не потрібна користувачам або розв'язує не ту проблему.
Живий приклад: команда пів року тестувала систему бронювання, виправила всі знайдені дефекти, реліз пройшов бездоганно — а користувачі йдуть, бо бронювання займає дванадцять кроків, і конкурент робить те саме за два. Формально якість висока: продукт відповідає специфікації. Фактично продукт провалився: специфікація не відповідала потребам.
Це принцип про різницю між верифікацією («чи правильно ми зробили продукт») і валідацією («чи правильний продукт ми зробили») — пара понять із першої глави. Тестувальник, який перевіряє лише відповідність вимогам і не дивиться на продукт очима користувача, закриває тільки половину роботи. Тому в хорошій команді QA бере участь у рев'ю вимог і має право сказати «це відповідає специфікації, але користувача заплутає».
Типові помилки
- «Усі тести зелені — можна релізити» виглядає як гарантія якості, а насправді каже лише, що перевірені сценарії не зловили дефектів. Рішення про реліз — це оцінка ризиків, а не колір прогону (принципи 1 і 7).
- «Допишемо ще кейсів і покриємо все» виглядає як старанність, а насправді ганяється за недосяжною метою. Правильне питання — не «скільки ще», а «що найризиковіше не покрито» (принцип 2).
- «Регресія три роки не падає — продукт стабільний» виглядає як стабільність, а насправді часто означає, що набір зносився і нові баги живуть поза його покриттям (принцип 5).
- «Тестування починається, коли є білд» виглядає логічно, а насправді пропускає найдешевший етап пошуку дефектів — рев'ю вимог і дизайну (принцип 3).
- «У цьому модулі вже знайшли й виправили купу багів, тепер шукаймо в інших» звучить справедливо, а насправді статистика каже протилежне: де було скупчення, там найімовірніше є ще (принцип 4).
- «Візьмемо процес з минулого проєкту, він же працював» виглядає як досвідченість, а насправді ігнорує контекст: процес для банку задушить стартап, а процес стартапу завалить банк (принцип 6).
Підсумок
- Зелений прогін нічого не доводить: тестування показує наявність дефектів, а не їхню відсутність, тому звітуємо «не знайдено у перевіреному», а не «багів немає».
- на практиці неможливе, тому тестування — це завжди пріоритезована вибірка за ризиком.
- Що раніше знайдено дефект, то дешевший фікс: рев'ю вимог — це вже тестування.
- Дефекти скупчуються в проблемних модулях, але тести на них зношуються — тому шукаємо там, де історично болить, і регулярно оновлюємо набір.
- Підхід диктує контекст продукту, і навіть бездефектний продукт може провалитися, якщо не відповідає потребам користувачів.
Можливі питання
Типові формулювання:
- «Назвіть сім принципів тестування» — дослівно всі сім вимагають рідко; частіше просять згадати кілька і пояснити своїми словами.
- «Чому не можна протестувати все? А якщо дати необмежений час і людей?» — перевіряють, чи розумієте комбінаторну природу проблеми, а не «бо часу мало».
- «Що таке парадокс пестицидів? Стикалися на практиці?» — сильна відповідь містить приклад: зношена регресія, захардкоджені дані, баг на проді повз зелений набір.
- «Усі тести пройшли. Можемо релізити?» — пастка одразу на два принципи: тестування не доводить відсутність дефектів, а відсутність дефектів не доводить успішність продукту.
- «Продукт без багів — це якісний продукт?» — очікують absence-of-defects fallacy і розмову про валідацію.
- «Отримали новий білд незнайомого продукту — де шукатимете баги насамперед?» — очікують скупчення дефектів: історія баг-трекера, складні модулі, свіжі зміни.
На що дивиться інтерв'юер: чи стоїть за формулюванням розуміння, а не зазубрений список; чи є до кожного принципу приклад із практики або хоча б побутова аналогія; чи бачите зв'язки між принципами — вичерпність неможлива, тому потрібна пріоритезація за ризиком; скупчення підказує, де шукати, а пестициди попереджають, що вчорашня карта скупчень старіє. Кандидат, який показує, як принципи працюють у зв'язці, звучить на рівень вище за того, хто перелічує їх через кому.
Джерела
Принцип 1. Тестування показує наявність дефектів, а не їхню відсутність
- ISTQB CTFL Syllabus v4.0 — принцип 1 «Testing shows the presence, not the absence of defects» з атрибуцією (Buxton 1970) і застереження, що навіть нуль знайдених дефектів не доводить коректності .
- E. W. Dijkstra — The Humble Programmer (EWD 340) — класичне формулювання 1972 року: тестування показує присутність багів, але безнадійно непридатне, щоб показати їхню відсутність.
Принцип 2. Вичерпне тестування неможливе
- ISTQB CTFL Syllabus v4.0 — принцип 2 «Exhaustive testing is impossible» і його наслідок: замість вичерпності — техніки тест-дизайну, пріоритизація тест-кейсів і ризик-орієнтоване тестування.
Принцип 3. Раннє тестування заощаджує час і гроші
- ISTQB CTFL Syllabus v4.0 — принцип 3 «Early testing saves time and money»: рано усунений дефект не породжує похідних, а статичне й динамічне тестування починають якомога раніше.
- ISTQB CTFL Syllabus v4.0 — принцип 4 «Defects cluster together» як ілюстрація принципу Парето і як вхідні дані для ризик-орієнтованого тестування.
Принцип 5. Парадокс пестицидів: тести зношуються
- ISTQB CTFL Syllabus v4.0 — принцип 5 «Tests wear out» з атрибуцією (Beizer 1990) і застереженням, що подекуди повторення тих самих тестів корисне — як в автоматизованому регресійному тестуванні.
Принцип 6. Тестування залежить від контексту
- ISTQB CTFL Syllabus v4.0 — принцип 6 «Testing is context dependent»: єдиного універсально застосовного підходу до тестування не існує.
- Context Driven Testing — Principles — категоричніше формулювання школи: хороші практики існують у контексті, «найкращих практик» немає.
Принцип 7. Хибність відсутності дефектів (absence-of-defects fallacy)
- ISTQB CTFL Syllabus v4.0 — принцип 7 «Absence-of-defects fallacy»: перевірити всі вимоги й виправити всі знайдені дефекти — ще не гарантія системи, яка відповідає потребам користувачів; звідси валідація поряд із верифікацією.
Назвіть сім принципів тестування. Звідки вони взялися?
Сім принципів зафіксовані в силабусі ISTQB CTFL (розділ 1.3): тестування показує наявність дефектів, а не їхню відсутність; неможливе; раннє тестування заощаджує час і гроші; дефекти скупчуються; тести зношуються (парадокс пестицидів); тестування залежить від контексту; хибність відсутності дефектів (absence-of-defects fallacy). Придумали їх не для сертифікації — це концентрат граблів, на які індустрія наступала десятиліттями, і кожен принцип — попередження про конкретну інженерну або управлінську помилку. Дослівне відтворення всіх семи тут мало що дає. Тому сильна відповідь — не зазубрений список, а кілька принципів із живим прикладом до кожного.
Що означає «тестування показує наявність дефектів, а не їхню відсутність»?
Тестування може довести, що дефекти (defects) у продукті є, але ніколи не доведе, що їх немає — формулювання сягає ще Едсгера Дейкстри. Скільки б перевірок не пройшло, це означає лише, що в перевірених сценаріях дефектів не знайдено; про неперевірені сценарії зелений прогін не каже нічого. Класична ілюстрація: команда виконала 500 тест-кейсів на форму логіну, усі пройшли, а через тиждень користувач відкриває два акаунти в сусідніх вкладках — і сесії змішуються. Дефект був завжди, просто жоден кейс не перевіряв одночасні сесії: тести відповіли тільки на ті питання, які їм поставили. Практичний наслідок — тестування знижує ймовірність невиявлених дефектів і дає підстави для рішення про реліз, але сертифікат бездоганності не видає.
Як правильно звітувати за результатами тестування і чому не можна писати «багів немає»?
«Багів немає» — твердження, яке тестування довести не здатне в принципі, тож такий звіт бреше вже формулюванням. Досвідчений QA пише «у перевірених сценаріях дефектів не виявлено» і додає, що саме перевірялося — а в ідеалі й що лишилося поза . Різниця не косметична: перший варіант знімає з команди відповідальність думати про , другий дає менеджеру чесні дані для рішення про реліз. Якщо після релізу вилізе баг у неперевіреному сценарії, звіт «багів немає» виглядатиме як провал тестування, хоча тестування свою роботу зробило — просто пообіцяло більше, ніж могло.
Чому неможливо протестувати все? А якщо дати необмежений час і людей?
Кількість комбінацій вхідних даних, станів і зростає експоненційно, тому для будь-якої нетривіальної системи вичерпне тестування недосяжне — не «дуже важко», а недосяжне за будь-який реалістичний час. Форма з 10 незалежними чекбоксами — це вже 2^10, тобто 1024 комбінації; три дропдауни по 5 значень підіймають це до 128 000; одне текстове поле з довжинами, алфавітами, емодзі та спецсимволами робить простір значень практично нескінченним — і це без пар «браузер × ОС». Підступне продовження «а якщо дати необмежений час?» — перевірка, чи розумієте ви комбінаторну природу проблеми: не допоможе, бо простір комбінацій росте швидше за будь-який бюджет. Тому правильна відповідь — питання не в часі, а в стратегії вибірки: тестування — це завжди пріоритезація «що перевірити в першу чергу, щоб зловити найімовірніші та найдорожчі дефекти», а інструменти дає тест-дизайн і ризик-орієнтований підхід.
Що таке раннє тестування і зсув уліво (shift-left)? Чому дефект у вимогах дешевший за дефект на проді?
Що раніше в життєвому циклі знайдено дефект, то дешевше його виправити: у вимогах це правка одного речення в документі, на проді — хотфікс, зіпсовані дані користувачів і розбір польотів. Вартість зростає, бо дефект встигає «обрости» наслідками: на ньому будують інший код, під нього пишуть тести, його поведінку бачать користувачі. Приклад: вимога «знижка застосовується до суми замовлення» без уточнення, з доставкою чи без, — на рев'ю вимог це хвилина обговорення, на проді це два різних тлумачення в бекенді й фронтенді, розбіжності в чеках і повернення грошей. Тому тестування починається не з першого , а з першого документа: рев'ю вимог і — це теж тестування. Переміщення перевірок на ранні фази життєвого циклу і називають (shift-left).
Що таке скупчення дефектів і як використовувати цей принцип у щоденній роботі?
Дефекти розподіляються по системі нерівномірно: невелика частина модулів зазвичай містить більшість багів — це відлуння принципу Парето, евристики «80/20». Скупчуються баги там, де складна логіка (розрахунок знижок, права доступу), де часті зміни, де зовнішні залежності (платіжні провайдери) і де легасі-код, якого всі бояться. У типовому e-commerce модуль чекауту з промокодами, доставкою і оплатою стабільно збирає більше дефектів, ніж усі статичні сторінки разом. Практичний наслідок: історія баг-трекера — це карта мінних полів; якщо в модулі знайшли п'ять багів, найімовірніше, там є шостий, і глибше тестувати треба саме там, а не рівномірно розмазувати зусилля. Цей принцип — один із головних аргументів при виборі обсягу та пріоритетів у ризик-орієнтованому підході.
Отримали новий білд незнайомого продукту — де шукатимете баги насамперед?
Це питання перевіряє, чи вмієте ви застосувати скупчення дефектів на практиці. Перший крок — не тикати навмання, а подивитися на історію: баг-трекер покаже, які модулі стабільно збирають дефекти, а список останніх змін — де код правили нещодавно. Далі за пріоритетом ідуть місця з відомими факторами ризику: складна бізнес-логіка, інтеграції із зовнішніми сервісами, легасі-частини. Поширена помилка — логіка «тут уже знайшли й виправили купу багів, тепер шукаймо в інших місцях»: статистика каже протилежне — де було скупчення, там найімовірніше є ще. Рівномірне розмазування зусиль по всьому продукту звучить справедливо, але суперечить і скупченню дефектів, і неможливості вичерпного тестування.
Що таке парадокс пестицидів? Стикалися з ним на практиці?
Якщо ганяти ті самі тести раз за разом, вони перестають знаходити нові дефекти — як шкідники стають нечутливими до того самого пестициду. У силабусі ISTQB CTFL 4.0 принцип називається «тести зношуються» (tests wear out), і посилання (Beizer 1990) стоїть саме на принципі — слова «pesticide» силабус не вживає ніде, тож «парадокс пестицидів» варто подавати як індустріальну назву, а не як метафору Бейзера. Механізм простий: тест знаходить дефект, дефект виправляють, тест назавжди стає зеленим — усі баги, які набір міг зловити, уже зловлено, а нові з'являються поза його покриттям. Роками зелена регресія починає давати хибне відчуття безпеки. Сильна відповідь на співбесіді містить приклад: автотест, який три роки додає в кошик той самий товар тим самим користувачем із захардкодженими даними, давно нічого не ловить — а баг на проді проходить повз зелений набір. Ліки: періодична ревізія набору, варіювання , нові перевірки під нові фічі та знайдені на проді баги, (exploratory testing) на додачу до скриптованих прогонів.
Парадокс пестицидів означає, що стабільну регресію треба викинути?
Ні — і це нюанс, який цінують інтерв'юери. Для контролю «старе не зламалося» повторюваність — перевага, а не вада: стабільна регресія чесно виконує свою роль сторожа вже перевірених сценаріїв. Зношування означає лише, що нових багів від старого набору чекати не варто — він уже зловив усе, що міг. Тому правильна стратегія — не видалення, а доповнення: лишити стабільне ядро для регресійного контролю і паралельно оновлювати набір новими даними, сценаріями під свіжі фічі та перевірками під баги, які прорвалися на прод. Відповідь «викинути й переписати» показує, що кандидат зрозумів принцип надто буквально.
Що означає «тестування залежить від контексту»? Наведіть приклад.
Не існує єдиного правильного способу тестувати: підхід визначається продуктом, ризиками, доменом, командою і стадією проєкту. Порівняйте: медичне ПЗ чи банківський застосунок — регуляторні вимоги, формальна документація, глибоке покриття й аудит; маркетинговий лендинг на два тижні життя — швидкий чеклист і ; мобільна гра — фокус на сумісності пристроїв і UX; внутрішня адмінка на п'ять користувачів — мінімум формальностей. Той самий інженер і ті самі техніки, але глибина, документація і пріоритети радикально різні; навіть усередині одного продукту API- та UI-тестування вимагають різних підходів. Практичний наслідок: переносити процес між проєктами треба свідомо, а не «у нас на минулій роботі так було» — процес для банку задушить стартап, а процес стартапу завалить банк.
Чому на питання «як би ти протестував X» варто починати з зустрічних питань?
Бо будь-яка відповідь без контексту порушує шостий принцип: не знаючи, хто користувач, які ризики і скільки часу, неможливо вибрати адекватну глибину і пріоритети перевірок. Сильний кандидат спершу уточнює: для кого продукт, що станеться при , який дедлайн, які частини найкритичніші — і лише тоді пропонує стратегію. Інтерв'юер таким питанням перевіряє не знання конкретної , а чи розуміє кандидат, що тестування — це завжди рішення під контекст. Відповідь-простиня «перевірю позитивні сценарії, негативні, граничні значення...» без жодного питання виглядає завченою і програє короткому «спершу уточню: хто користувач і які ризики?».
Що таке хибність відсутності дефектів (absence-of-defects fallacy)?
Це хибне уявлення, що продукт без знайдених дефектів — успішний продукт; у попередніх версіях силабусу принцип називався absence-of-errors fallacy. Можна ідеально реалізувати й вилизати до нуля багів систему, яка не потрібна користувачам або розв'язує не ту проблему. Приклад: команда пів року тестувала систему бронювання, виправила всі знайдені дефекти, реліз пройшов бездоганно — а користувачі йдуть, бо бронювання займає дванадцять кроків, і конкурент робить те саме за два. Формально якість висока: продукт відповідає специфікації; фактично продукт провалився, бо специфікація не відповідала потребам. Тому тестувальник, який перевіряє лише відповідність вимогам і не дивиться на продукт очима користувача, закриває тільки половину роботи.
У чому різниця між верифікацією і валідацією і до якого принципу вона стосується?
Верифікація відповідає на питання «чи правильно ми зробили продукт» — відповідність вимогам і специфікації; валідація — «чи правильний продукт ми зробили» — відповідність реальним потребам користувача. Це серцевина сьомого принципу: absence-of-defects fallacy — це саме ситуація, коли верифікація пройдена ідеально, а валідація провалена. Продукт без багів, який розв'язує не ту проблему, — верифіковано, але не валідовано. Практичний наслідок: у хорошій команді QA бере участь у рев'ю вимог і має право сказати «це відповідає специфікації, але користувача заплутає» — тобто працює на обидві половини, а не лише звіряє поведінку з документом.
«Усі тести пройшли. Можемо релізити?» — як відповісти?
Це пастка одразу на два принципи, і саме зв'язку інтерв'юер хоче почути. Перший удар — принцип 1: зелений прогін каже лише, що перевірені сценарії не зловили дефектів; про неперевірені він мовчить, тож «тести пройшли» не дорівнює «багів немає». Другий — принцип 7: навіть якби багів справді не було, це ще не означає, що продукт успішний — він може не відповідати потребам користувачів. Правильна рамка відповіді: рішення про реліз — це оцінка ризиків, а не колір прогону; треба дивитися, що саме покрито, які ризики лишилися непокритими і чи відповідає продукт своїй меті. Коротке «так, релізимо» на співбесіді — червоний , розгорнуте «залежить від того, що ми перевірили і що ні» — очікувана відповідь.
Як сім принципів працюють у зв'язці?
Найпомітніший ланцюжок: вичерпне тестування неможливе, тому потрібна пріоритезація за ризиком; скупчення дефектів підказує, де саме шукати; а парадокс пестицидів попереджає, що вчорашня карта скупчень старіє — набір і пріоритети треба регулярно переглядати. Друга зв'язка — релізна: принципи 1 і 7 разом пояснюють, чому «всі тести зелені» не аргумент для релізу — прогін не доводить відсутності дефектів, а відсутність дефектів не доводить успішності продукту. Третя — процесна: раннє тестування каже починати з рев'ю вимог, а залежність від контексту нагадує, що глибина й формальність цих перевірок різні для банку і для лендингу. Кандидат, який показує принципи у зв'язці, звучить на рівень вище за того, хто перелічує їх через кому: видно розуміння системи, а не зазубрений список.
Три кейси, де сім принципів перестають бути теорією: релізний статус, який не бреше (принципи 1 і 7), «куди спрямувати перші зусилля на новому білді» (принципи 2, 4 і 6) і ревізія зношеного Playwright-теста (принцип 5). Скрізь — що дивитися і чому.
Кейс 1. Релізний статус: два звіти про той самий прогін
П'ятниця, у релізному чаті менеджер питає: «Тестування закінчили? Релізимо?» Усі 500 кейсів на форму логіну зелені. Два варіанти відповіді QA.
Звіт, який бреше формулюванням:
Тестування завершено. Багів немає, можна релізити.
Звіт, який дає дані для рішення:
Прогін завершено: 500/500 кейсів пройшло.
Покрито: логін/логаут, відновлення пароля, валідація полів, блокування після 5 невдалих спроб.
НЕ покрито: одночасні сесії в кількох вкладках, паралельний логін з двох пристроїв.
Ризик: сценарії з кількома сесіями не перевірялися — у перевірених сценаріях дефектів не виявлено.
Що дивитися і чому:
- «Багів немає» — твердження, яке тестування не здатне довести в принципі. Зелений прогін каже лише, що перевірені сценарії не зловили дефектів (принцип 1). Коли за тиждень користувач змішає сесії у двох вкладках, перший звіт виглядатиме як провал QA, другий — як чесно задокументований .
- Секція «НЕ покрито» — найцінніша частина звіту. Саме вона перетворює звіт з «сертифіката бездоганності» на підставу для рішення: менеджер бачить, який ризик приймає, релізячи зараз.
- Рішення про реліз лишається за бізнесом, і це нормально. QA дає картину ризиків, а не вердикт «можна/не можна»: релізити з відомим непокритим ризиком — легітимне рішення, релізити наосліп — ні (принципи 1 і 7 разом).
Кейс 2. Новий білд незнайомого продукту: таблиця рішень
Вас підключили до проєкту, який ви бачите вперше. Часу — два дні до релізу, перевірити все неможливо (принцип 2), тож питання одне: куди спрямувати зусилля в першу чергу. Замість інтуїції — сигнали і принципи за ними.
| Сигнал | Принцип | Дія |
|---|---|---|
| У модулі чекауту за квартал знайшли 15 багів, у решті — по 2–3 | Скупчення дефектів | Найглибше тестувати чекаут: де було скупчення, там найімовірніше є ще |
| Модуль оплати правлять кожен спринт | Скупчення дефектів | Свіжі зміни — фактор ризику: пріоритет у регресії |
| Інтеграція з платіжним провайдером і легасі-модуль звітів | Скупчення дефектів | Зовнішні залежності й легасі — ще два магніти для багів |
| Регресія три роки стабільно зелена | Тести зношуються | Не заспокоюватись: набір міг зноситися, нові баги живуть поза покриттям |
| «На минулому проєкті ми все тестували за формальними тест-кейсами» | Залежність від контексту | Не переносити процес сліпо: спершу зрозуміти продукт, ризики і стадію проєкту |
| У вимогах до нової фічі неоднозначне формулювання знижки | Раннє тестування | Поставити питання зараз, на рев'ю — а не ловити розбіжність чеків на проді |
Що дивитися і чому:
- Історія баг-трекера — перше, що варто відкрити на незнайомому проєкті. Це готова карта мінних полів: розподіл дефектів нерівномірний, і минулі скупчення — найкращий предиктор майбутніх.
- «Тут уже все виправили, шукаймо в інших місцях» — типова помилка. Звучить справедливо, але статистика каже протилежне (принцип 4): п'ять знайдених багів у модулі — аргумент шукати шостий там само.
- Рівномірно розмазати зусилля — теж рішення, але найгірше. Воно ігнорує і неможливість , і скупчення дефектів: вибірка має бути пріоритезованою за ризиком, а не «чесною».
Кейс 3. Ревізія зношеного автотеста: до і після
Автотест кошика три роки зелений і три роки не змінювався. За цей час на прод прорвався баг: після додавання другого товару лічильник кошика скидався в одиницю. Тест цього не зловив — і не міг: він перевіряє рівно один сценарій з рівно одними даними.
Було — класична ознака зношування, захардкоджені дані:
// Три роки той самий товар і той самий користувач — тест давно нічого не ловить
test('додавання товару оновлює лічильник кошика', async ({ page }) => {
await page.goto('/product/42');
await page.getByRole('button', { name: 'Додати в кошик' }).click();
await expect(page.getByTestId('cart-count')).toHaveText('1');
});
Стало — той самий інваріант, але дані варіюються, а прод-баг закріплено окремим тестом:
// Варіюємо дані: різні типи товарів замість вічного /product/42
const products = [
{ id: '42', label: 'звичайний товар' },
{ id: '107', label: 'товар зі знижкою' },
{ id: '215', label: 'товар з мінімальним залишком' },
];
for (const { id, label } of products) {
test(`додавання (${label}) оновлює лічильник кошика`, async ({ page }) => {
await page.goto(`/product/${id}`);
await page.getByRole('button', { name: 'Додати в кошик' }).click();
await expect(page.getByTestId('cart-count')).toHaveText('1');
});
}
// Новий тест під баг, що прорвався на прод: другий товар не скидає лічильник
test('другий товар збільшує лічильник, а не скидає його', async ({ page }) => {
await page.goto('/product/42');
await page.getByRole('button', { name: 'Додати в кошик' }).click();
await page.goto('/product/107');
await page.getByRole('button', { name: 'Додати в кошик' }).click();
await expect(page.getByTestId('cart-count')).toHaveText('2');
});
Що дивитися і чому:
- Старий тест не видалено — його розширено. Принцип «тести зношуються» не вимагає викидати стабільну : контроль «старе не зламалося» лишається, повторюваність тут перевага. Змінюється очікування: нових багів від старого сценарію не буде.
- Кожен прод-баг — це кандидат у постійний набір. Сценарій «два товари поспіль» тепер закріплено тестом: дефект, який одного разу прорвався повз , більше не пройде тим самим шляхом.
- Варіювання даних — найдешевший спосіб відсунути зношування. Один цикл по трьох типах товарів коштує кілька рядків, а покриває стани, яких вічний
/product/42не бачив роками. - Автотести не закривають питання повністю. Нові дефекти з'являються в сценаріях, яких скриптований набір не передбачив — тому ревізію доповнюють (exploratory testing), а не лише новими скриптами.
Список і походження
- Можу назвати сім принципів тестування і знаю, що вони із силабусу ISTQB CTFL (розділ 1.3).
- Розумію, що інтерв'юер майже ніколи не хоче список — до кожного принципу маю живий приклад або побутову аналогію.
Межі тестування (принципи 1 і 2)
- Можу пояснити, чому тестування доводить наявність дефектів, але не їхню відсутність (формулювання Дейкстри).
- Знаю мову звітності: «у перевірених сценаріях дефектів не виявлено» плюс перелік перевіреного, а не «багів немає».
- Можу на пальцях показати комбінаторний вибух: 10 чекбоксів — це
2^10, тобто 1024 комбінації, а одне текстове поле робить простір практично нескінченним. - Маю відповідь на підступне «а якщо дати необмежений час?» — не допоможе, простір комбінацій росте швидше за будь-який бюджет.
- Розумію, що тестування — завжди пріоритезована вибірка: питання не «скільки ще кейсів», а «що найризиковіше не покрито».
Раннє тестування (принцип 3)
- Можу пояснити, чому дефект у вимогах — правка речення, а той самий дефект на проді — хотфікс і зіпсовані дані: він встигає «обрости» кодом, тестами й користувачами.
- Знаю, що рев'ю вимог і — це теж тестування, і що переміщення перевірок на ранні фази називається (shift-left).
Де живуть і як старіють баги (принципи 4 і 5)
- Розумію скупчення дефектів як відлуння принципу Парето («80/20») і знаю чотири фактори: складна логіка, часті зміни, зовнішні залежності, легасі.
- Використовую історію баг-трекера як карту мінних полів: п'ять багів у модулі — привід шукати там шостий, а не йти «в чисті» місця.
- Можу пояснити механізм парадоксу пестицидів (тест знайшов дефект → виправили → назавжди зелений, нові баги поза ) і впізнаю ознаку зношеного автотесту — роками незмінні захардкоджені дані.
- Знаю ліки від зношування — ревізія набору, варіювання даних, нові сценарії під фічі та прод-баги, exploratory testing — і що стабільну при цьому не викидають: для контролю «старе не зламалося» повторюваність — перевага.
- Знаю, що в CTFL 4.0 принцип називається «тести зношуються» (tests wear out) з посиланням (Beizer 1990) на сам принцип, а «парадокс пестицидів» — індустріальна назва: слова «pesticide» силабус не вживає.
Контекст і цінність (принципи 6 і 7)
- Можу навести контрастні контексти: медичне ПЗ з аудитом і формальною документацією проти лендинга зі і чеклистом.
- Знаю, що переносити процес між проєктами треба свідомо: процес для банку задушить стартап, процес стартапу завалить банк.
- На питання «як би ти протестував X» починаю з уточнень: хто користувач, які , скільки часу — відповідь без питань порушує шостий принцип.
- Можу пояснити absence-of-defects fallacy: нуль знайдених багів не означає успішний продукт — система може розв'язувати не ту проблему.
- Знаю різницю верифікації («чи правильно ми зробили продукт») і валідації («чи правильний продукт ми зробили») і до якого принципу вона прив'язана.
- Маю готову відповідь на пастку «усі тести пройшли — релізимо?»: вона б'є одразу по принципах 1 і 7, а рішення про реліз — це оцінка ризиків, а не колір прогону.
Квіз
Перед стартом
- Питань: 13
- Поріг «зараховано»: ≥70% правильних відповідей.
- Результат впливає на прогрес; завалені питання підуть у чергу повторення.
- Квіз впливає на компліт теми: тема стає «пройдено», лише коли прочитано теорію І квіз складено на ≥70%.
Питання
Принцип 1: що тестування може довести, а що — ні?


