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

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

    Смоук, саніті, регресія і ретест

    Зміст

    «Чим смоук відрізняється від саніті?» і «чим ретест відрізняється від регресії?» — два питання-фільтри, якими на співбесіді trainee/junior QA відсіюють тих, хто вчив терміни списком. Пастка в тому, що всі чотири слова описують не що перевіряти, а коли і навіщо запускати вже наявні перевірки. Це не техніки дизайну тестів і не рівні тестування — це відповіді на запитання «зміна в коді сталася, що тепер прогнати?».

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

    Смоук: чи живий білд узагалі

    Смоук-тестування (smoke testing) — мінімальний набір перевірок критичної функціональності, який запускають на кожному новому білді до будь-якого глибшого тестування. Мета — не знайти якомога більше дефектів, а швидко відповісти на одне бінарне питання: цей білд узагалі придатний для тестування?

    Типовий смоук для вебзастосунку: застосунок відкривається, логін працює, головна сторінка рендериться, ключовий бізнес-флоу (створити замовлення, надіслати форму) проходить без падінь. Жодних граничних значень, негативних сценаріїв чи рідкісних конфігурацій — тільки хребет системи. Звідси класична характеристика: смоук — широкий і мілкий (broad and shallow): торкається всіх критичних зон, але жодну не копає.

    Смоук — це гейт. Його результат — рішення, а не список багів:

    Так

    Ні

    Новий білд на тестовому середовищі

    Смоук-набір: хвилини, не години

    Усі перевірки пройшли?

    Білд прийнято:
    починаємо заплановане тестування

    Білд відхилено:
    повертаємо розробці

    Так

    Ні

    Новий білд на тестовому середовищі

    Смоук-набір: хвилини, не години

    Усі перевірки пройшли?

    Білд прийнято:
    починаємо заплановане тестування

    Білд відхилено:
    повертаємо розробці

    Якщо смоук упав — далі не йдемо. Тестувати білд зі зламаним логіном означає витратити день і отримати купу «дефектів», які зникнуть з наступним білдом. Саме тому смоук виграє від автоматизації і жорсткого таймбоксу: він має відпрацьовувати за хвилини після кожного деплою на тестове середовище (що таке білд, деплой і тестові стенди — у главі про тестові середовища). У CI-практиці той самий набір часто називають build verification test (BVT) — перевірка життєздатності білда.

    Саніті: чи має сенс конкретна зміна

    Саніті-тестування (sanity testing) у вжитку індустрії — швидка, але глибока перевірка конкретної зміни: фікса, невеликої фічі, зачепленого модуля. Питання інше, ніж у смоуку: не «чи живий білд», а «чи розумно поводиться саме те, що змінили, — і чи варто витрачати час на повноцінну регресію навколо».

    Приклад: розробник виправив розрахунок знижки в кошику. Саніті — це прицільно проганяємо кілька сценаріїв знижок: базовий випадок, комбінування знижок, знижка на межі порогу. Не чіпаємо логін, каталог і оплату — лише зону зміни, зате вглиб. Звідси дзеркальна характеристика: саніті — вузьке і глибоке (narrow and deep).

    Тут потрібна чесна примітка, яка на співбесіді працює на вас. У глосарії ISTQB sanity test — синонім smoke test, окремого означення саніті стандарт не дає. Розрізнення «смоук — широкий і мілкий, саніті — вузьке і глибоке» — усталена індустріальна конвенція, а не стандарт: у різних командах слова можуть вживатися по-різному. Сильна відповідь на співбесіді містить обидва факти — і конвенцію, і те, що ISTQB їх не розводить.

    Смоук vs саніті

    АспектСмоукСаніті
    ПитанняЧи придатний білд для тестування?Чи адекватна конкретна зміна?
    ФормаШирокий і мілкийВузьке і глибоке
    ОбʼєктУвесь білд, критичні шляхиЗона зміни: фікс, модуль, фіча
    КолиКожен новий білд, до основного тестуванняПісля фіксу/зміни, перед рішенням про регресію
    НабірСтабільний, документований, часто автоматизованийЧасто ситуативний, підбирається під зміну
    Фейл означаєБілд відхиленоЗміну повернуто, глибше не тестуємо

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

    Ретест і регресія: два різні питання після фіксу

    Дефект виправлено, фікс приїхав у білд. Тут народжуються дві окремі активності, які плутають найчастіше.

    Ретест, або підтверджувальне тестування (confirmation testing, re-testing) — повторне виконання того самого тесту, який виявив дефект: ті самі кроки, ті самі дані, те саме середовище. Мета одна — підтвердити, що саме цей дефект справді виправлено. Ретест — стандартний крок життєвого циклу дефекту: у більшості процесів без нього баг не переводять у closed (докладно — у главі про баг-репорт і життєвий цикл дефекту).

    Регресійне тестування (regression testing) — перевірка, що зміна не зламала те, що раніше працювало. Код повʼязаний: фікс розрахунку знижки може зачепити підсумок замовлення, історію покупок, звіти. Регресія проганяє тести, які до зміни проходили, і шукає нові дефекти в старій функціональності — їх так і називають: регресійні баги, або просто «регресія».

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

    Ні

    Так

    Так

    Ні

    Фікс дефекту в новому білді

    Ретест: той самий тест,
    ті самі кроки й дані

    Пройшов?

    Дефект перевідкрито
    reopened

    Дефект закрито

    Регресія навколо зміни:
    тести, що раніше проходили

    Нічого не зламалось?

    Зміну прийнято

    Новий баг-репорт:
    регресійний дефект

    Ні

    Так

    Так

    Ні

    Фікс дефекту в новому білді

    Ретест: той самий тест,
    ті самі кроки й дані

    Пройшов?

    Дефект перевідкрито
    reopened

    Дефект закрито

    Регресія навколо зміни:
    тести, що раніше проходили

    Нічого не зламалось?

    Зміну прийнято

    Новий баг-репорт:
    регресійний дефект

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

    Коли і в якому обсязі запускати регресію

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

    На практиці обсяг обирають за двома осями:

    • Аналіз впливу (impact analysis) — що саме зачепила зміна. Найдешевше джерело — розробник: питання «що ще може зламатися від цього фікса?» коштує хвилину, а економить години. Додатково дивляться на зачеплені модулі, спільні компоненти, звʼязки між фічами.
    • Ризик — де падіння найдорожче. Критичний бізнес-шлях (оплата, реєстрація) перевіряють завжди; історично крихкі зони — часто; стабільну периферію — рідко. Систематичний підхід до «ймовірність × вплив» — у главі про ризик-орієнтоване тестування.

    Типова розкладка на проєкті виглядає так: смоук — на кожен білд; вибіркова регресія навколо зміни — після кожного фікса чи фічі; повна або широка регресія — перед релізом, після великих рефакторингів і міграцій. В автоматизованих командах до цього додається нічний прогін повного набору в CI — але механіка пайплайнів це вже тема розділу про Git і CI/CD.

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

    Підтримка регресійного набору

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

    Тому підтримка — це регулярні дії у два боки:

    • Поповнення: тести з нових багів, тести на нову функціональність, що стала критичною.
    • Чистка: видалення кейсів на мертві фічі, злиття дублікатів, актуалізація кроків після зміни UI, перегляд пріоритетів (кейс, що три роки не ловив жодного дефекту, можливо, не мусить бігти в кожному прогоні).

    Окрема причина ревізувати набір — парадокс пестицидів (pesticide paradox) з семи принципів тестування: ті самі тести, що ганяються знову і знову, з часом перестають знаходити нові дефекти. Код навколо них «виробив імунітет» — усе, що вони вміли ловити, уже виловлено. Регресійний набір захищає від повернення старих багів, але для пошуку нових його треба періодично освіжати новими даними, сценаріями і перевірками.

    Практична дисципліна: у наборі мають бути пріоритети або теги (критичний шлях / розширений / повний), щоб «регресія за годину» і «регресія за два дні» були готовими зрізами, а не імпровізацією під дедлайн.

    Чому регресія — перший кандидат на автоматизацію

    Подивімось на властивості регресійного тестування як задачі:

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

    Це буквально портрет ідеального автотесту: повторюваний, детермінований, потрібний часто. Людина, що вручну ганяє один і той самий набір щотижня, коштує однаково кожного прогону; автоматизований набір коштує дорого один раз (написати й підтримувати), а кожен наступний прогін — майже безкоштовний і може бігти вночі без участі людей. Тому в стратегії автоматизації регресія і смоук зазвичай стоять першими в черзі — раніше за будь-які нові фічі.

    Мінімальний приклад, як це виглядає в коді: тег у назві тесту дозволяє запускати зрізи набору окремо. (Блок потребує основ JS/TS — при першому проході можна пропустити.)

    import { test, expect } from '@playwright/test';
    
    // тег @smoke — тест біжить і в смоуку, і в повній регресії
    test('логін з валідними даними відкриває дашборд @smoke', async ({ page }) => {
      await page.goto('/login');
      await page.getByLabel('Email').fill('user@example.com');
      await page.getByLabel('Пароль').fill('correct-password');
      await page.getByRole('button', { name: 'Увійти' }).click();
      await expect(page).toHaveURL(/dashboard/);
    });
    # на кожен білд — лише смоук; вночі — увесь набір
    npx playwright test --grep @smoke
    npx playwright test

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

    Типові помилки

    • Виглядає як «смоук — це швидко проклацати застосунок, що встигну», а насправді це фіксований мінімальний набір критичних перевірок з бінарним критерієм: упав — білд відхилено, тестування не починається. Імпровізований «проклац» не дає ні повторюваності, ні підстав для рішення.
    • Виглядає як «ретест і регресія — одне й те саме, обидва ж після фіксу», а насправді цілі протилежні: ретест повторює тест, що падав, і перевіряє сам фікс; регресія ганяє тести, що проходили, і перевіряє, чи не зламалось інше. Виконати треба обидва.
    • Виглядає як «смоук і саніті чітко розведені стандартом», а насправді у глосарії ISTQB sanity — синонім smoke; розрізнення «широкий/мілкий vs вузький/глибокий» — індустріальна конвенція. Знати треба і конвенцію, і цей факт.
    • Виглядає як «регресію запускають перед релізом», а насправді тригер регресії — будь-яка зміна: фікс, фіча, рефакторинг, оновлення залежностей, зміна конфігурації. Перед релізом лише найширший прогін.
    • Виглядає як «автоматизували регресію — питання закрите», а насправді набір продовжує старіти: парадокс пестицидів, мертві фічі, дублікати. Без регулярної чистки й поповнення з нових багів автонабір за рік перетворюється на повільний зелений шум.

    Підсумок

    • Смоук — широкий і мілкий гейт на кожен білд: відповідає «чи придатний білд для тестування»; упав смоук — білд повертається розробці без подальшого тестування.
    • Саніті — вузька і глибока перевірка конкретної зміни; за ISTQB — синонім смоуку, в індустрії — окремий термін. Сильний кандидат знає обидва факти.
    • Ретест підтверджує фікс тим самим тестом, що знайшов дефект; регресія перевіряє тестами, які раніше проходили, що зміна не зламала решту. Це різні активності з різними наборами.
    • Обсяг регресії — рішення про ризик: критичний шлях завжди, зона зміни за impact analysis, решта за пріоритетом. Повна регресія — рідкісна і дорога подія.
    • Регресійний набір — живий продукт: поповнюється з кожного знайденого бага, регулярно чиститься, а його повторюваність і стабільність роблять його першим кандидатом на автоматизацію.

    Що питають на співбесіді

    • «Чим смоук відрізняється від саніті?» Класика-фільтр. Чекають пару «широкий і мілкий vs вузьке і глибоке» плюс різні питання, на які вони відповідають (придатність білда vs адекватність зміни). Згадка, що ISTQB вважає їх синонімами, — маркер, що ви читали першоджерела, а не тільки статті.
    • «Чим ретест відрізняється від регресії?» Другий фільтр. Провал — «це коли перевіряємо після фіксу» про обидва. Сильна відповідь розводить ціль (сам фікс vs усе навколо) і набір тестів (той, що падав, vs ті, що проходили).
    • «Баг пофіксили. Твої дії?» Дивляться на процес: ретест на тому самому середовищі й даних → закриття (або перевідкриття) дефекту → регресія навколо зміни, де нові падіння стають окремими баг-репортами. Бонус — згадати, що обсяг регресії залежить від впливу зміни.
    • «Часу на повну регресію немає. Що прогониш?» Перевірка зрілості: чекають пріоритизацію (критичний бізнес-шлях, зона зміни, крихкі місця) і чесне озвучення непокритого ризику, а не героїчне «встигну все».
    • «Що б ти автоматизував першим і чому?» Очікувана відповідь — смоук і регресію, з аргументацією через повторюваність, стабільність кроків і вартість прогону, а не «бо автоматизація — це модно».
    • «Звідки беруться кейси в регресійному наборі і як його підтримувати?» Дивляться, чи розумієте набір як живий артефакт: поповнення з багів, чистка мертвого, парадокс пестицидів, пріоритети для зрізів різної тривалості.

    Джерела

    • ISTQB CTFL Syllabus 4.0 — глава покриває розділ 2.2.3 «Confirmation Testing and Regression Testing»; там само — про регресію як кандидата на автоматизацію та impact analysis.
    • ISTQB Glossary — канонічні означення: smoke test (синоніми — sanity test, confidence test), confirmation testing, regression testing.
    • Martin Fowler — SelfTestingCode — навіщо кодовій базі набір тестів, що ловить регресії за хвилини, і як це змінює впевненість у змінах.
    • Playwright — Tag tests — офіційна документація про теги й анотації: механіка запуску смоук- і регресійних зрізів одного набору.