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

    01 · Основи тестування

    Сім принципів тестування

    Зміст

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

    Принципи зафіксовані в силабусі 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).

    Механізм простий: тест знаходить дефект → дефект виправляють → тест назавжди стає зеленим. Усі баги, які цей набір міг зловити, уже зловлено. Нові дефекти з'являються в місцях і сценаріях, яких набір не покриває, — і роками зелена регресія починає давати хибне відчуття безпеки.

    Тести знаходять дефекти

    Дефекти виправляють

    Ті самі тести стабільно зелені

    Нові дефекти живуть поза покриттям

    Ревізія набору: нові дані,
    нові сценарії, exploratory

    Тести знаходять дефекти

    Дефекти виправляють

    Ті самі тести стабільно зелені

    Нові дефекти живуть поза покриттям

    Ревізія набору: нові дані,
    нові сценарії, exploratory

    Класична ознака зношеного автотесту — роками незмінні захардкоджені дані:

    // Три роки той самий товар і той самий користувач — тест давно нічого не ловить
    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 і розмову про валідацію.
    • «Отримали новий білд незнайомого продукту — де шукатимете баги насамперед?» — очікують скупчення дефектів: історія баг-трекера, складні модулі, свіжі зміни.

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

    Джерела

    • ISTQB CTFL v4.0 — сторінка сертифікації з актуальним силабусом; глава покриває розділ 1.3 «Testing Principles», канонічні формулювання всіх семи принципів.
    • ISTQB Glossary — офіційний глосарій термінів: defect, failure, exhaustive testing тощо.
    • Dijkstra, «The Humble Programmer» (EWD340) — лекція Тюрінга 1972 року з класичним формулюванням першого принципу.
    • Context-Driven Testing — принципи школи контекстно-залежного тестування; поглиблення шостого принципу.