QAБудь-який рівень

Smoke-тестування

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

Відповідає на
Чи варто тестувати цей білд?
Бюджет часу
До 5 хвилин
Червоний результат
Зупиняє наступний крок

Smoke-набір одного магазину на одному екрані — одинадцять перевірок, що доводить кожна і що зупиняє червоний результат

Ніхто не відкриває сторінку про smoke-тестування заради історії слова. Її відкривають, бо пайплайну потрібен набір, або бо наявний набір триває сорок хвилин і на нього ніхто не чекає. Нижче — готовий набір для інтернет-магазину, чий асистент замовлень тестують сторінки про тестування AI. Він запускається після кожного розгортання в кожне середовище. Рядки 1–2 питають, чи це той білд, що розгортали, 3–6 — чи він підключений, 7–8 — чи може людина увійти, а 9–11 — чи завершується сценарій, що заробляє гроші. Наступні розділи посилаються на рядки за номерами.

#ПеревіркаПроходить, лише якщоЧасЧервоне означає
1Кожен інстанс працює на розгорнутому білдіGET /version на кожному з шести інстансів застосунку повертає коміт a41f9c2 — питають кожен інстанс, а не балансувальник2 сРозгортання нічого не зробило або зробило лише на частині серверів
2Браузери отримують новий інтерфейсГоловна сторінка посилається на новий бандл app.a41f9c2.js, і він завантажується3 сCDN чи кеш віддає фронтенд минулого тижня
3Сервіс готовий/ready звітує про базу даних, кеш і чергу, і кожна відповідає в межах свого тайм-ауту2 сБракує секрету чи рядка підключення
4Платежі відповідаютьВиклик автентифікації з ключами цього середовища успішний — тестові ключі в тесті, бойові в продакшні3 сНе ті ключі для цього середовища; магазин не може приймати гроші
5Пошук наповнений«синій светр» повертає SKU 304174 сПорожній або застарілий індекс
6Пошта відправляєтьсяПровайдер приймає лист на smoke-скриньку; у продакшні — пробний запуск без відправлення5 сПідтвердження замовлень тихо не надсилатимуться
7Головна сторінка відображаєтьсяУ HTML є назва відомого товару, а банера помилки немає3 сВідповідь 200 зі сторінкою помилки всередині
8Людина може увійтиSmoke-акаунт входить через справжню форму входу12 сНіхто не може нічого зробити за формою входу
9Оформлення замовлення завершуєтьсяПошук → товар → кошик → оформлення з тестовою карткою → номер замовлення70 сМагазин не може приймати замовлення
10Замовлення доходить до складуНове замовлення зʼявляється в історії замовлень і в API складу15 сЗамовлення приймають, але ніколи не відвантажують
11Асистент замовлень підключенийНа питання «де замовлення» про замовлення з рядка 9 він викликає get_order із цим номером, а відповідь містить статус, який повернув інструмент20 сІнструменти асистента не підключені в цьому середовищі («Тестування LLM-продуктів», рядок 4)

Ворота, а не рівень тестування

Юніт, інтеграційний і наскрізний — це шари піраміди: вони описують, скільки системи зачіпає тест. Smoke не є одним із них. Глосарій називає його типом тестування й визначає через призначення — здобути достатню впевненість, що обʼєкт тестування готовий до запланованого тестування. Рядки вище показують, що це означає на практиці. Рядок 1 — простий -запит, рядок 5 — виклик , рядок 9 — сценарій у браузері, а рядок 11 — розмова з моделлю. Спільне в них — питання, і це питання про білд, а не про якусь одну фічу.

У програмну інженерію термін прийшов через щоденні білди Microsoft. 1996 року Стів Макконнелл описав цю практику в IEEE Software: щодня кожен файл компілюють і збирають у продукт, а результат проганяють через smoke-тест — «відносно просту перевірку, чи не “димить” продукт, коли працює». Образ — електриків: увімкніть нову плату й подивіться, чи не йде дим, перш ніж щось вимірювати. Макконнелл назвав smoke-тест вартовим проти проблем інтеграції, що підкрадаються непомітно, і написав, що без нього щоденний білд майже нічого не вартий.

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

Що належить набору — одне правило й бюджет, що його тримає

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

Кандидат на перевіркуУ smoke-наборі?Чому
Користувач може увійтиТак — рядок 8Якщо це впало, нічого за входом протестувати не можна: одна перевірка блокує весь білд.
Оформлення замовлення завершується раз, щасливим шляхомТак — рядок 9Доводить, що зібрана система робить те, заради чого існує, — цього не скаже жодна окрема проба.
Кожна залежність відповідаєТак — рядки 3–6Загублений рядок підключення — найчастіша причина, чому свіже середовище нікуди не годиться.
Кожен інстанс працює на розгорнутому комітіТак — рядок 1Дешево, і ловить розгортання, що тихо нічого не зробило, — збій, який зʼїдає найбільше часу.
Повідомлення валідації на формі реєстраціїНіСправжня робота, але тестувальник може працювати попри неї. Це регресія.
Баг минулого релізу, перевірений повторноНіЦе підтверджувальне тестування, а далі — постійний регресійний кейс. Smoke не є місцем памʼяті.
Звіт продажів, що будується чотири хвилиниНіОдна перевірка зʼїла б майже весь бюджет — саме це робить ворота непотрібними.
Кожен намір асистента замовленьНіЦе набір для оцінювання AI. Ворота ставлять одне питання з відомою відповіддю (рядок 11).

Те, як перевірка проходить, важить не менше, ніж те, які перевірки є. Код статусу доводить, що щось відповіло, а не що відповіло правильно: сторінка з написом «Щось пішло не так» усередині цілком справної відповіді 200 проходить будь-яку перевірку статусу, яку будь-коли написали. Тож кожен рядок перевіряє зміст — хеш коміту, назву товару, номер замовлення, статус, який повернув інструмент. Колонку «Проходить, лише якщо» команди пропускають найчастіше.

Бюджет часу — не побажання, а механізм. Ворота працюють, лише якщо відповідь приходить до рішення, яке вона має підказати, а рішення тут — чи починати наступному. До пʼяти хвилин — добра ціль, до десяти — стеля, яку ще можна захистити. Далі люди перестають чекати, починають паралельно, і ворота перетворюються на звіт, що приходить після шкоди.

Тут сторінка розходиться зі статтею, що дала практиці назву, і цю розбіжність варто тримати на виду. Макконнелл очікував, що smoke-тест ростиме разом із системою — від секунд на початку до «30 хвилин, години чи більше». 1996 року це було слушно: білд збирався раз на ніч, і smoke-тест, що завершувався до приходу тестувальників уранці, встигав вчасно. Команда, що розгортає десять разів на день, живе за іншим годинником. Наступна людина починає за кілька хвилин після розгортання, тож відповідь має прийти за хвилини, а набір має перестати рости. Мета та сама; розмір вирішує годинник.

Перевірки справності, smoke-тести й моніторинг відповідають на різні питання

Більшість платформ уже запускають перевірки проти сервісу, і команди іноді зараховують їх як свій smoke-набір. Це не одне й те саме, і різниця в тому, який висновок дозволено робити кожній. Kubernetes визначає три проби. Startup-проба чекає, доки повільний контейнер завершить запуск. Liveness-проба вирішує, коли перезапустити контейнер, — приклад у документації взаємне блокування. Readiness-проба вирішує, чи контейнер узагалі отримує трафік. Усі три питають про один процес, і жодна не питає, чи може клієнт купити светр.

ПеревіркаХто запускаєПитанняУ разі падінняЧого вона не бачить
Liveness-пробаПлатформа, кожні кілька секундЧи не завис цей процес?Перезапустити контейнерУсе поза процесом
Readiness-пробаПлатформа, кожні кілька секундЧи може цей інстанс зараз приймати трафік?Перестати надсилати йому запитиЧи працює продукт від початку до кінця
Smoke-набірПайплайн, після кожного розгортанняЧи вартий цей білд чийогось часу?Зупинити наступний крок; у продакшні — відкотитиТе, що ламається пізніше без розгортання
Синтетичний моніторингПланувальник, кожні кілька хвилин, ззовніЧи працює це для клієнта прямо зараз?Викликати черговогоЧому — вона виявляє, а не діагностує
Платформи запускають власні перевірки, і їх легко сплутати зі smoke-набором. Кожна з чотирьох перевірок тут відповідає на своє питання, а таблиця показує, що це означає в збоях. Liveness-проба питає, чи не завис один процес, і перезапускає його, тож ловить взаємне блокування й нічого поза процесом. Readiness-проба питає, чи може інстанс приймати трафік, а отже, ловить і залежність, до якої він не дістається, — як хибний пароль до бази в новому середовищі. Smoke-набір запускається після розгортання й питає, чи працює продукт: це єдина перевірка, що знаходить сервер, який досі працює на старому білді, і вона ж ловить зламане оформлення замовлення й не ті платіжні ключі раніше, ніж на них натрапить хтось інший. Синтетичний моніторинг запускає перевірки того самого роду за розкладом, тож лише він бачить те, що ламається взагалі без розгортання, — сертифікат, що спливає вночі, індекс, що перебудувався порожнім. Жодна з чотирьох не заміняє іншу.

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

Де він запускається — один набір у пʼяти місцях, із пʼятьма наслідками

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

Магазин запускає один набір smoke-скриптів у пʼяти місцях, і кожне відповідає на трохи інше питання. На прев’ю пулреквесту рядки, яким не потрібні справжні сервіси, ловлять проблеми коду, поки автор ще поруч, а червоне блокує мердж. У тестовому середовищі всі одинадцять рядків перевіряють білд із конфігурацією команди, а червоне зупиняє передачу тестувальникам. У стейджингу ті самі рядки ловлять здебільшого середовище — секрети, ключі, DNS, — а червоне зупиняє просування. На перших інстансах продакшну вони зустрічають те, що є лише в продакшні, — бойові платіжні ключі й справжній трафік, а рядок 9 виконують на тестовому товарі, який автоматично скасовують і за який повертають гроші; це єдине місце, де червоний результат може відкотити реліз до того, як він дістанеться решті парку, тому його й виділено. Нарешті, продакшн кожні пʼять хвилин — це синтетичний моніторинг: ті самі скрипти ловлять те, що ламається без розгортання, а червоне викликає чергового.
МісцеЯкі рядки запускаютьсяЩо здебільшого ловитьЧервоний результат
Прев’ю пулреквесту1–3 і 7–9, проти тимчасових сервісівКод: зниклий маршрут, падіння на стартіПулреквест не можна змерджити
ТестУсі одинадцятьБілд із конфігурацією командиПередача тестувальникам зупиняється
СтейджингУсі одинадцятьСередовище: секрети, ключі, DNSПросування в продакшн зупиняється
Продакшн, перші інстанси1–8 і 11; рядок 9 із тестовим товаром, який автоматично скасовують і повертають грошіТе, що є лише в продакшні: бойові ключі, справжній трафікАвтоматичний відкат — до того, як оновиться решта парку
Продакшн, кожні пʼять хвилин2–9Те, що ламається без розгортанняВикликають чергового

Smoke до мерджу

  • Запускається на прев’ю-середовищі, зібраному з гілки.
  • Відповідає «чи не зламала ця зміна базове», поки автор ще поруч і може полагодити.
  • Найдешевший зворотний звʼязок, який буває, і сліпий до всього, що стосується справжнього середовища.
  • Падає з причин коду: зниклий маршрут, зламаний білд, падіння на старті.

Smoke після розгортання

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

Обидва варті існування й не заміняють один одного, бо падають із різних причин. Якщо можна дозволити лише один — беріть той, що після розгортання. Зламана гілка коштує одному розробнику години; зламане середовище коштує команді дня, а в продакшні — клієнтів.

Smoke, build verification, sanity, підтвердження — чотири назви, які плутають

Ці слова плутають і на співбесідах, і в командному чаті, і плутанину варто розібрати один раз. Три з них мають визначення в глосарії ISTQB. Smoke-тестування — призначення, наведене вище. Build verification test — це автоматизований тест, що перевіряє цілісність кожного нового білда та його ключову функціональність, стабільність і придатність до тестування: ті самі ворота, названі на честь білда й обовʼязково автоматизовані. Підтверджувальне тестування, або повторне тестування, виконують після виправлення дефекту, щоб підтвердити, що спричинений ним збій не повторюється. Четверте слово, sanity-тестування, у чинному глосарії не має запису взагалі — тому суперечки про нього й не закінчуються.

  • Smoke

    Запускається білдом чи розгортанням. Фіксований набір, щоразу той самий. Його вердикт вирішує, чи починає роботу хтось інший.

  • Build verification test

    Ті самі ворота під назвою, яку ISTQB дає їм у контексті білдів: автоматизовані, запускаються на кожному новому білді, перевіряють, чи його взагалі можна тестувати.

  • Sanity

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

  • Підтвердження

    Запускається виправленням. Точні кроки з баг-репорту, повторені, щоб показати, що дефекту немає. Далі це стає регресійним кейсом.

Чотири розгортання — і перевірка, якої бракувало або яку проігнорували

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

Knight Capital вручну розгортала новий торговий код на своїх восьми серверах SMARS у дні перед 1 серпня 2012 року, і один сервер пропустили. На ньому спрацював код, який розбудив повторно використаний прапорець, і приблизно за 45 хвилин після відкриття о 09:30 фірма втратила понад 460 мільйонів доларів. Дві деталі роблять це випадком про smoke-тестування. Перша — те, як питають версію. Один запит через балансувальник потрапляє на той сервер, що відповів, тож сім разів із восьми повідомляє про новий білд і ховає восьмий; лише запит до кожного сервера, як у рядку 1 набору магазину, повертає сім нових і один старий і робить ворота червоними. Друга — 97 автоматичних листів «Power Peg disabled», що пішли до відкриття торгів. Це був сигнал, який дійшов до людей, але ніхто не проєктував ці листи як алерти, і ніщо в них нічого не зупинило. Перевірка без наслідків — це пів воріт.
РозгортанняЩо сталосяSmoke-перевірка — і де її загубили
Knight Capital, 1 серпня 2012Технік вручну скопіював новий торговий код на вісім серверів і пропустив один. На восьмому повторно використаний прапорець розбудив код, яким не користувалися з 2003 року. До відкриття торгів пішло 97 автоматичних листів «Power Peg disabled»; їх не проєктували як алерти. Приблизно за 45 хвилин фірма втратила понад 460 мільйонів доларів. Повністю цю історію розповідає сторінка «Ризик-менеджмент».Рядок 1: спитати кожен сервер, на якому білді він працює. Листи — друга половина уроку: сигнал, що дійшов до людей і нічого не зупинив.
Azure Storage, 18 листопада 2014Зміну продуктивності, перевірену в тестовому й передпродакшн-середовищах для фронтендів Table storage і кілька тижнів запущену на частині продакшну, увімкнули на всій інфраструктурі одразу — і помилково на фронтендах Blob storage, які увійшли в нескінченний цикл. Перевірки справності й поступове розгортання частинами («flighting») існували. Інженер вирішив, що крок малоризиковий, а інструменти розгортання не примушували дотримуватися правил.Smoke-прогін на першій частині фронтендів Blob — для якого потрібно було, щоб перша частина існувала. Виправлення Microsoft забрало рішення з людських рук: тепер правила «примусово виконує сама платформа розгортання».
Google Compute Engine, 11 квітня 2016Баг у конфігурації прибрав із мережевої конфігурації всі блоки IP-адрес Compute Engine. Канарковий крок розгорнув її на одному майданчику й «правильно визначив, що нова конфігурація небезпечна». Другий баг не передав цей вердикт назад, тож поступове розгортання тривало. З 19:09 за тихоокеанським часом вхідний трафік до Compute Engine в усіх регіонах упав більш ніж на 95% — на 18 хвилин.Перевірка спрацювала; дріт до рішення — ні. Тестуйте самі ворота: навмисно змусьте smoke-перевірку впасти й переконайтеся, що розгортання зупиняється.
Cloudflare, 2 липня 2019Нове правило файрвола пройшло CI й о 13:42 UTC вийшло через систему, що за секунди доходить до кожного сервера. Робоча процедура дозволяла змінам правил оминати поетапне розгортання, через яке проходять звичайні релізи, — майданчик лише для співробітників, потім частка безплатного трафіку, потім канарки. Регулярний вираз правила вичерпав CPU по всьому світу. Синтетичний тест файрвола підняв тривогу через три хвилини; трафік відновився о 14:09.Синтетичний тест був правильною перевіркою не в тому місці — після того, як зміна дісталася всім. Та сама перевірка на першому майданчику, до решти, — це і є smoke-ворота.

Де це вироджується

Чесне обмеження в тому, що smoke-набір перевіряє один білд, щасливим шляхом, в один момент. Він не бачить шляху в коді, який ще ніщо не виконувало. У червні 2025 року нова перевірка в Service Control від Google Cloud два тижні працювала в продакшні, і всі перевірки білда проходили, — доки до неї нарешті не дійшла зміна політики з порожніми полями й не поклала сервіси по всьому світу; цей випадок розповідає сторінка «Планування релізу». Конфігурація й дані змінюються після розгортання, і їм потрібні власні ворота. Зелений smoke каже, що білд вартий тестування, але ніколи — що він правильний.

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

  • Набір перевірок «HTTP 200», який проходить і сторінка з помилкою всередині.
  • Питати версію в балансувальника, тож сім правильних серверів ховають восьмий.
  • Smoke, який запускають вручну, коли хтось згадає; день, коли його пропустили, — це день, коли він був потрібен.
  • Результати в каналі без жодних наслідків: червоний запуск стає інформацією, а не вказівкою.
  • Ворота, чий червоний результат ще жодного разу не зупинив нічого, бо самі ворота ніхто не тестував.
  • Набір, лишений незмінним у продакшні, поки він пише справжні дані: одне забуте тестове замовлення на розгортання до кінця кварталу стає питанням до фінансів.
  • Двадцять розумних доповнень — і набір, що тепер триває сорок хвилин і досі зветься smoke.
  • Власник на імʼя «QA» — це відділ, а не людина, що полагодить червоний запуск сьогодні.
  • Сприймати зелений запуск як заяву про якість.

Коли це застосовувати

Застосовуйте, коли

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

Уникайте, коли

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

Джерела й метод

На чому стоїть ця стаття

  • 10 джерел
  • 5 задокументованих збоїв
  • Перевірено 17 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.