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 30417 | 4 с | Порожній або застарілий індекс |
| 6 | Пошта відправляється | Провайдер приймає лист на smoke-скриньку; у продакшні — пробний запуск без відправлення | 5 с | Підтвердження замовлень тихо не надсилатимуться |
| 7 | Головна сторінка відображається | У HTML є назва відомого товару, а банера помилки немає | 3 с | Відповідь 200 зі сторінкою помилки всередині |
| 8 | Людина може увійти | Smoke-акаунт входить через справжню форму входу | 12 с | Ніхто не може нічого зробити за формою входу |
| 9 | Оформлення замовлення завершується | Пошук → товар → кошик → оформлення з тестовою карткою → номер замовлення | 70 с | Магазин не може приймати замовлення |
| 10 | Замовлення доходить до складу | Нове замовлення зʼявляється в історії замовлень і в API складу | 15 с | Замовлення приймають, але ніколи не відвантажують |
| 11 | Асистент замовлень підключений | На питання «де замовлення» про замовлення з рядка 9 він викликає get_order із цим номером, а відповідь містить статус, який повернув інструмент | 20 с | Інструменти асистента не підключені в цьому середовищі («Тестування LLM-продуктів», рядок 4) |
Ворота, а не рівень тестування
Юніт, інтеграційний і наскрізний — це шари піраміди: вони описують, скільки системи зачіпає тест. Smoke не є одним із них. Глосарій ISTQBInternational Software Testing Qualifications Board — орган сертифікації тестувальниківМіжнародна організація, що стоїть за найпоширенішими сертифікаціями з тестування ПЗ і видає глосарій термінів тестування. Її визначення — поширене спільне джерело на співбесідах і в контрактах; вони фіксують словник, а не те, як має працювати команда.Усі терміни називає його типом тестування й визначає через призначення — здобути достатню впевненість, що обʼєкт тестування готовий до запланованого тестування. Рядки вище показують, що це означає на практиці. Рядок 1 — простий HTTPHyperText Transfer Protocol — протокол вебуПротокол, яким спілкуються браузер і сервер: клієнт надсилає метод і адресу, сервер відповідає кодом стану й тілом. Між запитами він нічого не памʼятає — кожен запит стоїть сам по собі, тому все, що треба памʼятати, передається явно.Усі терміни-запит, рядок 5 — виклик APIApplication Programming Interface — контракт між програмамиПравила, за якими одна програма звертається до іншої: які запити можна надіслати, у якому вигляді й що прийде у відповідь. Для того, хто звертається, це контракт — усе, що за ним, лишається чорною скринькою, і саме тому другий бік можна переписати, не зламавши вас.Докладніше в статті →Усі терміни, рядок 9 — сценарій у браузері, а рядок 11 — розмова з моделлю. Спільне в них — питання, і це питання про білд, а не про якусь одну фічу.
У програмну інженерію термін прийшов через щоденні білди Microsoft. 1996 року Стів Макконнелл описав цю практику в IEEE Software: щодня кожен файл компілюють і збирають у продукт, а результат проганяють через 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-наборі, запущені за розкладом проти продакшну, — це синтетичний моніторинг. Він знаходить те, чого не спричинило жодне розгортання, — сертифікат, що сплив о третій ночі в неділю, платіжного провайдера, що щось змінив на своєму боці. На схемі це єдина колонка, що ловить сертифікат. Їх варто тримати як один набір скриптів із двома розкладами: те, що ворота перевіряють після розгортання, — рівно те, що ви хочете знати кожні пʼять хвилин після нього.
Де він запускається — один набір у пʼяти місцях, із пʼятьма наслідками
Більшість команд запускають smoke-набір в одному місці — зазвичай після розгортання в тестове середовище. Ті самі скрипти вартують більшого, бо в кожному середовищі відповідають на трохи інше питання, а повторний запуск коштує хвилини. Від місця до місця змінюється те, які рядки можуть виконуватися і що дозволено робити червоному результату.
| Місце | Які рядки запускаються | Що здебільшого ловить | Червоний результат |
|---|---|---|---|
| Прев’ю пулреквесту | 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
Стандартного визначення немає. У більшості команд — короткий погляд без сценарію на ділянку, якої торкнулася конкретна зміна, щоб вирішити, чи варто планувати глибше тестування.
Підтвердження
Запускається виправленням. Точні кроки з баг-репорту, повторені, щоб показати, що дефекту немає. Далі це стає регресійним кейсом.
Чотири розгортання — і перевірка, якої бракувало або яку проігнорували
Жодній із цих компаній не бракувало тестів. Кожна мала перевірку, що могла зупинити розгортання, і кожна з чотирьох загубила її в іншому місці: перевірки не було там, де вона була потрібна; вона була, але її пропустили; вона спрацювала, але її ніхто не послухав; або вона запустилася тоді, коли зміна вже дісталася всім.
| Розгортання | Що сталося | 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 р.
Збої, на яких вчиться стаття
розгортання в розділі «Чотири розгортання — і перевірка, якої бракувало або яку проігнорували» та межа в розділі «Де це вироджується»- Звіт регулятораSEC — Order, Release No. 70694: Knight Capital Americas LLC (відкривається в новій вкладці)U.S. Securities and Exchange Commission · 16.10.2013
- ПостмортемJason Zander — Final Root Cause Analysis and Improvement Areas: Nov 18 Azure Storage Service Interruption (відкривається в новій вкладці)Microsoft Azure · 17.12.2014
- ПостмортемGoogle Compute Engine Incident #16007 — Connectivity issues in all regions (відкривається в новій вкладці)Google Cloud Status Dashboard · 13.04.2016
- ПостмортемJohn Graham-Cumming — Details of the Cloudflare outage on July 2, 2019 (відкривається в новій вкладці)Cloudflare · 12.07.2019
- ПостмортемGoogle Cloud — Service Control incident report (відкривається в новій вкладці)Google Cloud Service Health · 13.06.2025
Практики й походження термінів
визначення, походження терміна й проби в розділі «Перевірки справності, smoke-тести й моніторинг»- СтандартISTQB Glossary — smoke testing (відкривається в новій вкладці)ISTQB
- СтандартISTQB Glossary — build verification test (відкривається в новій вкладці)ISTQB
- СтандартISTQB Glossary — confirmation testing (відкривається в новій вкладці)ISTQB
- СтаттяSteve McConnell — Daily Build and Smoke Test (відкривається в новій вкладці)IEEE Software · 07.1996
- ДокументаціяLiveness, Readiness, and Startup Probes (відкривається в новій вкладці)Kubernetes documentation
Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.
Було корисно?
Поділіться з тим, хто працює над тією ж задачею.