Smoke Test (дымное тестирование) — это минимальный набор проверок, который выполняется после сборки мобильного приложения для подтверждения того, что основные функции работают. Smoke Test позволяет быстро отбраковать нестабильные сборки без проведения полного регрессионного цикла. По данным Google Testing Blog (2024), Smoke Test сокращает время обратной связи для разработчика с 2–3 часов до 10–15 минут. Smoke Test — это первый фильтр качества в конвейере CI/CD, который предотвращает попадание сломанных сборок на следующий этап.
Главное
Smoke Test (дымное тестирование) — это набор быстрых тестов, которые проверяют основные функции приложения без глубокого анализа. Термин пришёл из аппаратной инженерии: если устройство после сборки начинает дымиться, его не отправляют на полное тестирование. В мобильной разработке Smoke Test выполняет ту же функцию — отсеивает заведомо неработоспособные сборки. По данным Microsoft DevOps (2024), внедрение Smoke Test сокращает количество дефектов, доходящих до QA-команды, на 40%.
Smoke Test выполняется на каждом новом билде — как на Android, так и на iOS. В идеале Smoke Test должен занимать не более 15 минут и запускаться автоматически после успешной сборки. Критерий прохождения — 100% тестов из набора Smoke Test должны завершиться успешно. Если хотя бы один тест падает, сборка помечается как нестабильная и не отправляется на дальнейшее тестирование. По данным Google Testing Blog (2024), такой подход сокращает время доставки фич до пользователей на 25%.
Smoke Test может быть как ручным (чек-лист из 5–10 пунктов), так и автоматизированным. В современных мобильных проектах предпочтение отдаётся автоматизированному Smoke Test, встроенному в CI/CD. Ручной Smoke Test оправдан только на ранних стадиях проекта, когда автоматизация экономически невыгодна. По данным Bitrise (2025), 73% команд мобильной разработки автоматизируют Smoke Test.
Smoke Test и регрессионное тестирование часто путают, но это разные практики с разными целями. Регрессионное тестирование проверяет, что изменения в коде не сломали существующую функциональность. Оно покрывает все модули и сценарии приложения, включая редкие и граничные случаи. Smoke Test проверяет только критический путь — основные сценарии, без которых приложение бесполезно. Глубина покрытия — главное различие: Smoke Test покрывает 5–10% функциональности, регрессия — 80–100%.
Второе отличие — время выполнения. Регрессионный набор для мобильного приложения может занимать от 2 до 12 часов в зависимости от размера проекта и количества платформ. Smoke Test занимает 5–15 минут. По данным Sauce Labs (2025), среднее время выполнения регрессионного набора для iOS-приложения — 4.5 часа, для Android — 3.2 часа. Smoke Test на обеих платформах укладывается в 10–15 минут.
Третье отличие — место в пайплайне. Smoke Test выполняется сразу после сборки, до регрессионного тестирования. Если Smoke Test не пройден, регрессия не запускается — это экономит ресурсы CI/CD. Pipeline efficiency — Smoke Test отсеивает до 30% сборок, которые не прошли бы регрессию, но сэкономленных ресурсов хватает на параллельный запуск других задач.
| Параметр | Smoke Test | Регрессионное тестирование |
|---|---|---|
| Цель | Быстрая проверка критического пути | Проверка всей функциональности |
| Объём | 5–10% сценариев | 80–100% сценариев |
| Время | 5–15 минут | 2–12 часов |
| Частота | На каждый билд | Перед релизом или ежедневно |
| CI/CD | После сборки, до регрессии | После Smoke Test |
Запуск приложения — первый и самый важный тест. Приложение должно запускаться без краша на всех целевых устройствах. Smoke Test проверяет холодный старт: установка → открытие → отображение первого экрана. Если приложение падает при запуске, дальнейшее тестирование бессмысленно. XCUITest и Espresso позволяют автоматизировать проверку запуска в 2–3 строки кода. Launch argument `-AppleLanguages (ru)` помогает проверить локализацию на старте.
Авторизация — второй критический сценарий. Smoke Test должен проверить, что форма логина отображается, поля ввода реагируют на касание, кнопка входа отправляет запрос и приложение переходит на главный экран после успешной авторизации. Ошибка авторизации блокирует доступ ко всем остальным функциям, поэтому её проверка входит в минимальный набор. Token refresh — дополнительная проверка для приложений с OAuth 2.0.
Загрузка основного контента — третий тест Smoke Test. Главный экран или лента приложения должны загружаться и отображать данные. Если API не отвечает или парсинг ответа сломан, пользователь видит пустой экран. Проверка сети в Smoke Test включает базовый GET-запрос к основному эндпоинту и проверку, что ответ имеет ожидаемую структуру. Навигация — четвёртый сценарий. Smoke Test проходит по основным экранам приложения: главный → поиск → профиль → настройки. Tab bar и боковое меню — типичные источники проблем в навигации, которые Smoke Test выявляет на раннем этапе.
Fastlane — стандартный инструмент для автоматизации мобильного CI/CD. Smoke Test на Fastlane запускается через `scan` (для XCUITest) или `gradle` (для Espresso). Fastlane позволяет настроить запуск Smoke Test на нескольких устройствах параллельно, что сокращает общее время. Конфигурация в Fastfile включает таргет на Smoke Test suite и порог прохождения: 100% успешных тестов.
GitHub Actions (2024) опубликовал шаблон мобильного CI/CD со встроенным Smoke Test. Шаблон включает три этапа: сборка → Smoke Test → регрессия. Если Smoke Test падает, шаблон автоматически завершает пайплайн и отправляет уведомление в Slack или Telegram. Matrix strategy позволяет запускать Smoke Test на трёх версиях iOS и пяти моделях Android одновременно.
Разделение ответственности в CI/CD: Smoke Test отвечает за быструю обратную связь, регрессия — за полное покрытие. Smoke Test не должен дублировать регрессию, и наоборот. Гранулярность Smoke Test — одна проверка на один критический сценарий. Если Smoke Test занимает более 15 минут, его нужно оптимизировать: убрать избыточные проверки или распараллелить выполнение.
# Fastfile конфигурация для Smoke Test
platform :ios do
lane :smoke do
scan(
scheme: 'App',
devices: ['iPhone 15', 'iPhone SE'],
testplan: 'SmokeTest',
output_directory: 'reports/smoke',
fail_build: true
)
end
lane :regression do
scan(
scheme: 'App',
devices: ['iPhone 15', 'iPhone 14', 'iPhone SE'],
testplan: 'FullRegression'
)
end
end
XCUITest — фреймворк Apple для UI-тестирования iOS-приложений. XCUITest используется для автоматизации Smoke Test: запуск приложения, проверка элементов интерфейса, симуляция пользовательских действий. В сочетании с Xcode Server или GitHub Actions XCUITest запускается при каждом коммите. XCTest — базовый фреймворк для unit-тестов, который дополняет XCUITest для проверки логики.
Espresso — фреймворк Google для UI-тестирования Android. Espresso синхронизируется с UI-потоком и гарантирует, что все анимации завершены до начала проверки. Espresso поддерживает проверку через `onView(withId(...)).check(matches(...))`. Android Test Orchestrator запускает каждый Smoke Test в отдельном процессе, что предотвращает влияние предыдущих тестов на последующие.
Detox — фреймворк для React Native, который поддерживает Smoke Test и grey-box тестирование. Detox синхронизируется с React Native bridge и автоматически ожидает завершения асинхронных операций. Grey-box тестирование позволяет Detox проверять состояние приложения без прямого доступа к исходному коду.
XCUITest для iOS содержит две проверки: запуск приложения и отображение главного экрана. Тест запускает приложение через `XCUIApplication().launch()` и проверяет, что ключевой элемент (например, `navigationBar`) существует. Если приложение падает при запуске, XCTest framework фиксирует ошибку и тест завершается с FAIL. Smoke Test не проверяет содержимое — только что экран открылся.
Espresso для Android использует `ActivityScenario` для запуска Activity и `onView` для проверки элементов. Критическое различие между платформами: iOS-симулятор может показывать отличающееся поведение от реального устройства, поэтому Smoke Test на Android рекомендуется запускать на Firebase Test Lab или эмуляторе. Firebase Test Lab поддерживает параллельный запуск Smoke Test на 10 устройствах.
import XCTest
class LoginSmokeTest: XCTestCase {
let app = XCUIApplication()
override func setUp() {
continueAfterFailure = false
app.launch()
}
func testLoginButtonExists() {
XCTAssertTrue(app.buttons["Log In"].exists)
}
func testLoginFlow() {
app.textFields["email"].tap()
app.textFields["email"].typeText("test@test.com")
app.secureTextFields["password"].tap()
app.secureTextFields["password"].typeText("password123")
app.buttons["Log In"].tap()
XCTAssertTrue(app.staticTexts["Welcome"].waitForExistence(timeout: 5))
}
}
Пример выше показывает Smoke Test для экрана логина на iOS. Первый тест проверяет, что кнопка логина существует на экране. Второй тест проходит полный путь авторизации и проверяет, что после успешного входа отображается приветственное сообщение. Timeout в 5 секунд для waitForExistence — стандартное значение для Smoke Test: если UI-элемент не отображается за это время, приложение работает некорректно.
Часто задаваемые вопросы
Оптимальное количество — от 5 до 15 тестов на один модуль. Smoke Test должен покрывать критический путь пользователя, но не пытаться охватить всю функциональность. Критерий — если все тесты Smoke Test проходят, приложение можно открывать в QA-среде для дальнейшего тестирования.
Smoke Test проверяет стабильность сборки и выполняется на каждом билде. Sanity check — более узкий набор тестов, который выполняется после внесения конкретных изменений. Sanity check отвечает на вопрос "сломал ли это изменение функциональность X", а Smoke Test — "работает ли сборка в принципе".
Да, автоматизация Smoke Test — обязательная практика для проектов с частыми релизами. Автоматизация обеспечивает консистентность проверок и скорость выполнения. Ручной Smoke Test оправдан только на ранних этапах проекта, когда количество сборок не превышает 2–3 в неделю.
Сборка помечается как нестабильная и не отправляется на дальнейшее тестирование. Разработчик получает уведомление с логами падения Smoke Test. После исправления проблемы создаётся новая сборка, на которой Smoke Test запускается повторно. Блокирующий дефект фиксируется в трекере.
Smoke Test обновляется при каждом изменении критического пути пользователя. Если добавляется новый обязательный экран (например, onboarding), он должен войти в Smoke Test. Рекомендуется пересматривать набор Smoke Test каждый спринт на предмет актуальности проверок.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также