Smoke, Sanity, Regression: як QA перевіряє продукт на міцність

Smoke, Sanity, Regression: як QA перевіряє продукт на міцність

  • 13 серпня
  • читати 7 хв
Артем Койков
Артем Койков QA Manual/Automation у Auditdata, Викладач Комп'ютерної школи Hillel.

Уявіть, що ви щойно зібрали новий автомобіль. Перш ніж випустити його на трасу для повноцінних випробувань, ви спершу перевірите найпростіші речі: чи заводиться двигун, чи крутяться колеса, чи горять фари. Якщо машина навіть не заводиться — немає сенсу перевіряти гальма на швидкості 200 км/год. Саме так працює QA-інженер із трьома базовими видами тестування: smokesanity та regression. Це не просто три галочки в чек-листі — це фільтр, який рятує команди від хаосу, дорогих багів і зіпсованої репутації продукту.

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

НАВІЩО ВЗАГАЛІ ДІЛИТИ ТЕСТУВАННЯ НА ЕТАПИ

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

Це схоже на медичний огляд. Лікар спочатку заміряє тиск і пульс (базові показники життя), потім, якщо ви прийшли з болем у коліні, огляне саме коліно (цільова перевірка), а вже потім, якщо є підозра на щось серйозніше, призначить повне обстеження всього організму (комплексна перевірка). Ніхто не робить МРТ всього тіла заради нежитю.

SMOKE-ТЕСТУВАННЯ: ЧИ ВЗАГАЛІ «ДИХАЄ» ПРОДУКТ

Smoke testing — це найшвидша і найповерхневіша перевірка, яка відповідає на одне-єдине питання: чи можна взагалі працювати з цим білдом?

Термін прийшов з електротехніки: коли інженери вмикали новий пристрій уперше, вони перевіряли найпростішу річ — чи не пішов з нього дим. Якщо пішов — подальше тестування безглузде, пристрій одразу вимикали. У software-розробці логіка та сама: якщо застосунок не відкривається, не логінить користувача або падає на головному екрані — немає сенсу перевіряти щось складніше.

Уявіть інтернет-магазин. Команда випустила новий білд напередодні Black Friday. QA-інженер запускає smoke-тест — короткий сценарій на 10-15 хвилин:

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

Якщо хоча б один із цих пунктів провалюється — білд одразу відхиляють і повертають розробникам, не витрачаючи часу команди на подальше тестування. Це принцип fail fast — краще втратити 15 хвилин на smoke-тест, ніж 8 годин на повне регресійне тестування білда, який все одно доведеться відкинути.

ЯК ЦЕ РОБЛЯТЬ ВЕЛИКІ КОМПАНІЇ

У Google практика smoke-тестування настільки автоматизована, що вона вбудована прямо в CI/CD-пайплайн. Кожен коміт, який потрапляє в основну гілку коду, автоматично проганяється через набір presubmit tests — по суті, це той самий smoke-тест, тільки виконує його не людина, а автоматизована система за лічені хвилини. Якщо presubmit провалюється, коміт просто не потрапляє в основну гілку — розробник отримує миттєвий фідбек і виправляє проблему до того, як вона зачепить когось іншого.

Схожий підхід і в Netflix: перед тим, як новий реліз потрапляє бодай на невеликий відсоток користувачів (канарковий реліз), система автоматично перевіряє базову працездатність сервісу — чи стартує відео, чи працює рекомендаційний алгоритм, чи не зростає різко кількість помилок 500.

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

SANITY-ТЕСТУВАННЯ: ЧИ ПРАЦЮЄ ТЕ, ЩО ЗМІНИЛИ

Якщо smoke-тест — це перевірка «продукт живий загалом», то sanity testing — це точковий, сфокусований аналіз конкретної зміни або конкретного бага, який щойно виправили.

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

Розробник виправив баг: при застосуванні промокоду на суму знижки 100% ціна товару йшла в мінус. QA отримує білд і робить sanity-тест:

  1. Застосовує саме той промокод, який спричиняв баг
  2. Перевіряє, що ціна коректно стає 0, а не негативною
  3. Перевіряє кілька сусідніх сценаріїв — промокод на 50%, промокод, що вже не діє, промокод з мінімальною сумою замовлення

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

ПРИКЛАД З ПРАКТИКИ ВЕЛИКИЙ КОМПАНІЙ

У Microsoft, коли команда Windows випускає патч, що виправляє конкретну вразливість або баг у певному модулі (наприклад, у драйвері принтера), QA-команда спершу проводить cаніті-перевірку саме цього модуля на обмеженому наборі конфігурацій, перш ніж патч потрапить у широке регресійне тестування на десятках комбінацій «версія Windows + драйвер + периферія». Це економить величезну кількість машинного часу й людських ресурсів — навіщо ганяти повний regression-набір, якщо є підозра, що фікс взагалі не спрацював?

Головна відмінність sanity від smoke: smoke — широкий і неглибокий (перевіряємо все по трошки), sanity — вузький і глибокий (перевіряємо мало, але детально).

РЕГРЕСІЙНЕ ТЕСТУВАННЯ: ЧИ НЕ ЗЛАМАЛИ МИ ЩОСЬ СТАРЕ

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

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

ЧОМУ ЦЕ СПРАВДІ СКЛАДНО

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

Команда розробила нову функцію — можливість оплати частинами (Buy Now, Pay Later). Функція начебто ізольована: новий екран, нова кнопка, новий бекенд-сервіс. Але після релізу з'ясувалося, що:

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

Жоден з цих двох багів не пов'язаний напряму з новою кнопкою оплати частинами. Але вони виникли через цю зміну — і саме такі приховані наслідки й покликане виявляти регресійне тестування.

ЯК ВЕЛИКІ КОМПАНІЇ БОРЮТЬСЯ З ЦІЄЮ ПРОБЛЕМОЮ

Facebook (Meta) свого часу зіткнулися з класичною проблемою масштабу: команда з тисяч інженерів комітить код у монолітний репозиторій десятки разів на день. Ручний регрес такого обсягу фізично неможливий. Рішення — масштабна автоматизація: тисячі автоматизованих регресійних тестів запускаються на кожен pull request, а система пріоритизації тестів (test impact analysis) визначає, які саме тести варто запустити залежно від того, які файли змінилися, щоб не ганяти весь набір щоразу.

Amazon пішов ще далі: у них є принцип «you build it, you run it» — команда, яка розробляє фічу, сама відповідає за її регресійне покриття автотестами. Це знижує ризик того, що QA-команда, не занурена в контекст конкретного модуля, пропустить неочевидний зв'язок між компонентами.

Але навіть у гігантів регресія час від часу «прориває оборону». Класичний приклад — масштабний збій Facebook, Instagram та WhatsApp у жовтні 2021 року, коли помилкова конфігураційна зміна в мережевій інфраструктурі призвела до того, що сервіси стали недоступні на кілька годин для мільярдів користувачів. Це нагадування: чим складніша система, тим важче передбачити всі побічні ефекти навіть за наявності потужної автоматизації.

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

Рекомендуємо курси по темі

ТИПОВІ ПОМИЛКИ ПОЧАТКІВЦІВ

Розглядаючи цю тему зі студентами курсів QA, я регулярно бачу одні й ті самі помилки:

Плутанина між smoke і sanity. Багато хто вважає, що це синоніми, бо обидва «швидкі». Але ключова відмінність — у меті. Smoke відповідає на питання «чи варто взагалі тестувати цей білд», sanity — «чи працює саме ця конкретна зміна».

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

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

Нерозуміння, що regression — це не «тестування всього підряд». Грамотний QA-інженер не запускає весь набір тестів наосліп щоразу, а аналізує, які зони продукту потенційно могли постраждати від конкретної зміни (так званий impact analysis), і пріоритизує тести відповідно.

Рекомендуємо публікації по темі