Smoke Test (kouřové testování) je minimální sada kontrol, která se provádí po sestavení mobilní aplikace k potvrzení, že základní funkce fungují. Smoke Test umožňuje rychle odmítnout nestabilní sestavení bez provedení úplného regresního cyklu. Podle Google Testing Blog (2024) zkracuje Smoke Test dobu zpětné vazby pro vývojáře z 2–3 hodin na 10–15 minut. Smoke Test je prvním filtrem kvality v potrubí CI/CD, který zabraňuje vstupu rozbitých sestavení do další fáze.
Hlavní body
Smoke Test (kouřové testování) je sada rychlých testů, které kontrolují základní funkce aplikace bez hluboké analýzy. Termín pochází z hardware inženýrství: pokud zařízení po sestavení začne kouřit, není odesláno k úplnému testování. V mobilním vývoji plní Smoke Test stejnou funkci — odfiltruje předem nefunkční sestavení. Podle Microsoft DevOps (2024) snižuje zavedení Smoke Testu počet defektů, které se dostanou k QA týmu, o 40%.
Smoke Test se provádí na každém novém sestavení — jak na Androidu, tak na iOS. Ideálně by Smoke Test neměl trvat déle než 15 minut a měl by se spouštět automaticky po úspěšném sestavení. Kritérium úspěšnosti — 100% testů ze sady Smoke Test musí být dokončeno úspěšně. Pokud selže alespoň jeden test, sestavení je označeno jako nestabilní a není odesláno k dalšímu testování. Podle Google Testing Blog (2024) tento přístup zkracuje dobu dodání funkcí uživatelům o 25%.
Smoke Test může být jak ruční (kontrolní seznam 5–10 bodů), tak automatizovaný. V moderních mobilních projektech se upřednostňuje automatizovaný Smoke Test zabudovaný do CI/CD. Ruční Smoke Test je ospravedlnitelný pouze v raných fázích projektu, kdy automatizace není ekonomicky výhodná. Podle Bitrise (2025) 73% týmů mobilního vývoje automatizuje Smoke Test.
Smoke Test a regresní testování jsou často zaměňovány, ale jedná se o rozdílné praktiky s různými cíli. Regresní testování kontroluje, zda změny v kódu neporušily stávající funkčnost. Pokrývá všechny moduly a scénáře aplikace, včetně vzácných a hraničních případů. Smoke Test kontroluje pouze kritickou cestu — základní scénáře, bez kterých je aplikace nepoužitelná. Hloubka pokrytí — hlavní rozdíl: Smoke Test pokrývá 5–10% funkčnosti, regrese 80–100%.
Druhý rozdíl — doba provádění. Regresní sada pro mobilní aplikaci může trvat 2 až 12 hodin v závislosti na velikosti projektu a počtu platforem. Smoke Test trvá 5–15 minut. Podle Sauce Labs (2025) je průměrná doba provádění regresní sady pro iOS aplikaci 4,5 hodiny, pro Android 3,2 hodiny. Smoke Test na obou platformách se vejde do 10–15 minut.
Třetí rozdíl — místo v potrubí. Smoke Test se provádí ihned po sestavení, před regresním testováním. Pokud Smoke Test neprojde, regrese se nespouští — to šetří zdroje CI/CD. Pipeline efficiency — Smoke Test odfiltruje až 30% sestavení, která by neprošla regresí, a ušetřené zdroje stačí na paralelní spouštění jiných úkolů.
| Parametr | Smoke Test | Regresní testování |
|---|---|---|
| Cíl | Rychlá kontrola kritické cesty | Kontrola veškeré funkčnosti |
| Rozsah | 5–10% scénářů | 80–100% scénářů |
| Čas | 5–15 minut | 2–12 hodin |
| Frekvence | Při každém sestavení | Před vydáním nebo denně |
| CI/CD | Po sestavení, před regresí | Po Smoke Testu |
Spuštění aplikace — první a nejdůležitější test. Aplikace se musí spustit bez pádu na všech cílových zařízeních. Smoke Test kontroluje studený start: instalace → otevření → zobrazení první obrazovky. Pokud aplikace spadne při spuštění, další testování je bezvýznamné. XCUITest a Espresso umožňují automatizovat kontrolu spuštění ve 2–3 řádcích kódu. Launch argument `-AppleLanguages (cs)` pomáhá zkontrolovat lokalizaci při startu.
Autorizace — druhý kritický scénář. Smoke Test by měl zkontrolovat, že se přihlašovací formulář zobrazuje, vstupní pole reagují na dotyk, tlačítko přihlášení odesílá požadavek a aplikace přechází na hlavní obrazovku po úspěšné autorizaci. Chyba autorizace blokuje přístup ke všem ostatním funkcím, proto je její kontrola zahrnuta v minimální sadě. Token refresh — dodatečná kontrola pro aplikace s OAuth 2.0.
Načtení hlavního obsahu — třetí test Smoke Testu. Hlavní obrazovka nebo feed aplikace se musí načíst a zobrazit data. Pokud API neodpovídá nebo je analýza odpovědi porušená, uživatel vidí prázdnou obrazovku. Síťová kontrola v Smoke Testu zahrnuje základní GET požadavek na hlavní endpoint a kontrolu, že odpověď má očekávanou strukturu. Navigace — čtvrtý scénář. Smoke Test prochází hlavními obrazovkami aplikace: hlavní → vyhledávání → profil → nastavení. Lišta karet a postranní menu — typické zdroje problémů v navigaci, které Smoke Test odhaluje v rané fázi.
Fastlane — standardní nástroj pro automatizaci mobilního CI/CD. Smoke Test na Fastlane se spouští přes `scan` (pro XCUITest) nebo `gradle` (pro Espresso). Fastlane umožňuje konfiguraci spouštění Smoke Testu na několika zařízeních paralelně, což zkracuje celkový čas. Konfigurace v Fastfile zahrnuje cíl pro sadu Smoke Test a práh úspěšnosti: 100% úspěšných testů.
GitHub Actions (2024) zveřejnil šablonu mobilního CI/CD s vestavěným Smoke Testem. Šablona zahrnuje tři fáze: sestavení → Smoke Test → regrese. Pokud Smoke Test selže, šablona automaticky ukončí potrubí a odešle oznámení do Slacku nebo Telegramu. Matrix strategy umožňuje spouštět Smoke Test na třech verzích iOS a pěti modelech Android současně.
Rozdělení odpovědností v CI/CD: Smoke Test odpovídá za rychlou zpětnou vazbu, regrese za úplné pokrytí. Smoke Test by neměl duplikovat regresi a naopak. Granularita Smoke Testu — jedna kontrola na jeden kritický scénář. Pokud Smoke Test trvá déle než 15 minut, je třeba jej optimalizovat: odstranit nadbytečné kontroly nebo paralelizovat provádění.
# Konfigurace Fastfile pro 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 — rámec Apple pro UI testování iOS aplikací. XCUITest se používá pro automatizaci Smoke Testu: spuštění aplikace, kontrola prvků rozhraní, simulace uživatelských akcí. V kombinaci s Xcode Server nebo GitHub Actions se XCUITest spouští při každém commitu. XCTest — základní rámec pro unit testy, který doplňuje XCUITest pro kontrolu logiky.
Espresso — rámec Google pro UI testování Androidu. Espresso se synchronizuje s UI vláknem a garantuje, že všechny animace jsou dokončeny před zahájením kontroly. Espresso podporuje kontrolu přes `onView(withId(...)).check(matches(...))`. Android Test Orchestrator spouští každý Smoke Test v samostatném procesu, což zabraňuje ovlivnění předchozích testů následujícími.
Detox — rámec pro React Native, který podporuje Smoke Test a grey-box testování. Detox se synchronizuje s React Native bridge a automaticky čeká na dokončení asynchronních operací. Grey-box testování umožňuje Detoxu kontrolovat stav aplikace bez přímého přístupu ke zdrojovému kódu.
XCUITest pro iOS obsahuje dvě kontroly: spuštění aplikace a zobrazení hlavní obrazovky. Test spouští aplikaci přes `XCUIApplication().launch()` a kontroluje, zda klíčový prvek (např. `navigationBar`) existuje. Pokud aplikace spadne při spuštění, rámec XCTest zaznamená chybu a test končí FAILem. Smoke Test nekontroluje obsah — pouze to, že se obrazovka otevřela.
Espresso pro Android používá `ActivityScenario` ke spuštění Activity a `onView` ke kontrole prvků. Kritický rozdíl mezi platformami: iOS simulátor může vykazovat odlišné chování od skutečného zařízení, proto se Smoke Test na Androidu doporučuje spouštět na Firebase Test Lab nebo emulátoru. Firebase Test Lab podporuje paralelní spouštění Smoke Testu na 10 zařízeních.
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))
}
}
Výše uvedený příklad ukazuje Smoke Test pro přihlašovací obrazovku na iOS. První test kontroluje, zda tlačítko přihlášení existuje na obrazovce. Druhý test prochází celou autorizační cestu a kontroluje, že po úspěšném přihlášení se zobrazí uvítací zpráva. Timeout 5 sekund pro waitForExistence — standardní hodnota pro Smoke Test: pokud se UI prvek nezobrazí během této doby, aplikace nepracuje správně.
Často kladené otázky
Optimální počet je 5 až 15 testů na jeden modul. Smoke Test by měl pokrýt kritickou cestu uživatele, ale neměl by se snažit pokrýt veškerou funkčnost. Kritérium — pokud všechny testy Smoke Testu projdou, aplikaci lze otevřít v QA prostředí pro další testování.
Smoke Test kontroluje stabilitu sestavení a provádí se na každém sestavení. Sanity check je užší sada testů, která se provádí po provedení konkrétních změn. Sanity check odpovídá na otázku ‘porušila tato změna funkčnost X?’, zatímco Smoke Test odpovídá na ‘funguje sestavení vůbec?’.
Ano, automatizace Smoke Testu je povinnou praxí pro projekty s častými vydáními. Automatizace zajišťuje konzistenci kontrol a rychlost provádění. Ruční Smoke Test je ospravedlnitelný pouze v raných fázích projektu, kdy počet sestavení nepřesahuje 2– týdně.
Sestavení je označeno jako nestabilní a není odesláno k dalšímu testování. Vývojář obdrží oznámení s logy selhání Smoke Testu. Po opravě problému je vytvořeno nové sestavení, na kterém je Smoke Test znovu spuštěn. Blokující defekt je zaznamenán v trackeru.
Smoke Test se aktualizuje při každé změně kritické cesty uživatele. Pokud je přidána nová povinná obrazovka (např. onboarding), musí vstoupit do Smoke Testu. Doporučuje se revidovat sadu Smoke Test každý sprint z hlediska aktuálnosti kontrol.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také