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

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

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

    Зміст

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

    Принципи зафіксовані в силабусі 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» силабус не вживає ніде. «Парадокс пестицидів» — усталена індустріальна назва; приписувати саму метафору Борису Бейзеру джерело підстав не дає.

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

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

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

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

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

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

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

    Джерела

    Принцип 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»: рано усунений дефект не породжує похідних, а статичне й динамічне тестування починають якомога раніше.

    Принцип 4. Скупчення дефектів

    • 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»: перевірити всі вимоги й виправити всі знайдені дефекти — ще не гарантія системи, яка відповідає потребам користувачів; звідси валідація поряд із верифікацією.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.