Integrační testování ověřuje správnost interakce mezi komponentami mobilní aplikace — moduly, službami, databázemi a externími API. Na rozdíl od jednotkových testů, které izolují každou komponentu, integrační testy odhalují chyby na rozhraních: nekompatibilitu datových formátů, selhání při předávání parametrů a nesprávné zpracování odpovědí ze serveru. Podle údajů Martin Fowler, 2018, integrační testy pokrývají až 40% kritických defektů vynechaných jednotkovými kontrolami a poskytují důvěru ve stabilitu systému před vydáním.
Hlavní body
Integrační testování — je fáze ověřování softwaru, při které se hodnotí správnost interakce mezi jednotlivými moduly nebo subsystémy aplikace. Zatímco jednotkové testy kontrolují každou komponentu izolovaně, integrační testy tyto komponenty spojují dohromady a ověřují, jak fungují ve spojení. Typické scénáře zahrnují přenos dat mezi síťovou vrstvou a úložištěm, zápis do databáze přes ORM a zpracování odpovědí z API třetích stran.
V kontextu mobilního vývoje integrační testy pokrývají interakci mezi UI vrstvou, obchodní logikou a zdroji dat. Například test může ověřit, že po stisknutí tlačítka „Přihlásit se“ aplikace odešle požadavek na server, obdrží token a uloží jej do lokálního úložiště. Taková kontrola potvrzuje, že řetězec komponent funguje bez selhání.
Podle zprávy World Quality Report 2023 společnosti, které pravidelně aplikují integrační testování, snižují počet produkčních incidentů o 35% ve srovnání s projekty spoléhajícími se pouze na jednotkové testy. To činí integrační kontroly povinným prvkem strategie zajišťování kvality v komerčním vývoji.
Mobilní aplikace se skládají z mnoha vzájemně propojených komponent: síťových požadavků, lokálních databází, push notifikací, systémových služeb a SDK třetích stran. Každá z těchto komponent je vyvíjena samostatně, ale za běhu si vyměňují data v reálném čase. Integrační testování odhaluje defekty, které nelze odhalit při izolované kontrole modulů.
Mezi typické problémy odhalené integračními testy patří nesoulad datových typů mezi API a modelem aplikace, chyby serializace JSON, nesprávné zpracování síťových časových limitů a selhání při paralelním přístupu k databázi přes Room nebo Core Data. Bez integračních kontrol se takové defekty dostanou do produkce a projeví se pouze u skutečných uživatelů.
Výzkum Google Testing Blog (2021) ukazuje, že náklady na opravu defektu odhaleného ve fázi integračního testování jsou 5krát nižší než po vydání. Je to proto, že v raných fázích má vývojář úplný kontext chyby a může ji opravit bez urgentního hotfix cyklu. Investice času do psaní integračních testů se vyplácí snížením nákladů na údržbu a zvýšením důvěry uživatelů.
Existují tři hlavní přístupy k organizaci integračních testů: Big Bang, Bottom-Up a Top-Down. Volba strategie závisí na velikosti projektu, architektuře aplikace a dostupnosti komponent v době psaní testů. Každý přístup má své výhody a omezení, které je důležité zvážit při plánování testovacího pokrytí.
Big Bang — přístup, při kterém jsou všechny komponenty systému propojeny současně, poté je proveden celkový testovací běh. Tato metoda je jednoduchá na implementaci: nevyžaduje psaní stubů ani emulaci jednotlivých modulů. Při odhalení chyby je však obtížné určit, která komponenta je jejím zdrojem. Big Bang je opodstatněný v malých projektech s jednoduchou architekturou, kde počet modulů nepřesahuje pět.
Bottom-Up — strategie, při které integrační testování začíná od nízkoúrovňových komponent: databáze, síťové vrstvy, systémových služeb. Po kontrole každé úrovně testy postupně připojují vyšší moduly — úložiště, Use Case třídy a ViewModel. Hlavní výhodou je včasné odhalení defektů v základních vrstvách aplikace, což snižuje riziko kaskádových chyb v pozdějších fázích vývoje.
Top-Down — přístup, při kterém testování začíná od komponent horní úrovně — UI obrazovek a navigace, zatímco nižší moduly jsou imitovány pomocí stubů nebo mocků. To umožňuje kontrolovat uživatelské scénáře dříve, než je plně implementována serverová část nebo databáze. Top-Down je zvláště užitečný při paralelním vývoji klientské a serverové části, když backend ještě není připraven k reálné integraci.
Pro integrační testování mobilních aplikací se používá řada specializovaných nástrojů, které se dělí do tří kategorií: knihovny pro emulaci serverů, frameworky pro práci s databázemi a prostředky pro kontrolu systémových služeb. Volba konkrétního nástroje závisí na platformě — Android nebo iOS — a technologickém stacku projektu.
Podívejme se na praktické příklady integračních testů pro Android a iOS. Pro platformu Android používáme MockWebServer ve spojení s JUnit, pro iOS — XCTest s knihovnou OHHTTPStubs. Oba příklady kontrolují scénář získání dat z API a jejich uložení v lokálním úložišti.
Tento test ověřuje, že Retrofit požadavek na emulovaný server vrací správný JSON a úložiště převádí odpověď na doménový model. MockWebServer zachycuje požadavek a vrací zadaný JSON, poté test porovná očekávaný výsledek se skutečným.
class UserRepositoryTest {
private val mockServer = MockWebServer()
@Before
fun setup() {
mockServer.start()
}
@Test
fun fetchUser_returnsCorrectData() {
val json = "{ \`"id\`": 1, \`"name\`": \`"Alice\`" }"
mockServer.enqueue(MockResponse()
.setBody(json)
.setResponseCode(200))
val repository = UserRepository(
createRetrofit(mockServer.url("/").toString()))
val user = repository.fetchUser(1)
assertEquals(1, user.id)
assertEquals("Alice", user.name)
}
@After
fun tearDown() {
mockServer.shutdown()
}
}
Pro iOS používá podobný test OHHTTPStubs k zachycení URL požadavků. Knihovna nahrazuje odpověď serveru na úrovni systémového frameworku URL Loading System, což umožňuje testovat libovolnou síťovou knihovnu — URLSession, Alamofire nebo Moya.
import XCTest
import OHHTTPStubs
import OHHTTPStubsSwift
class UserRepositoryTests: XCTestCase {
func testFetchUser_returnsCorrectData() {
stub(condition: isPath("/users/1")) { _ in
return HTTPStubsResponse(
jsonObject: ["id": 1, "name": "Alice"],
statusCode: 200,
headers: nil
)
}
let repository = UserRepository()
let expectation = expectation(description: "fetch user")
repository.fetchUser(id: 1) { user in
XCTAssertEqual(user.id, 1)
XCTAssertEqual(user.name, "Alice")
expectation.fulfill()
}
waitForExpectations(timeout: 2.0)
}
}
Efektivní integrační testování vyžaduje dodržování řady postupů, které zvyšují stabilitu testů a snižují náklady na jejich údržbu. Izolujte externí závislosti: používejte in-memory databáze místo produkčních instancí a emulujte externí API pomocí knihoven testovacích stubů. To eliminuje nedeterministická selhání způsobená dostupností sítě nebo stavem externích služeb.
Udržujte nezávislost testů: každý integrační test musí pracovat izolovaně, bez závislosti na výsledcích jiných testů. Používejte anotace @Before a @After v JUnit nebo setUp a tearDown v XCTest pro přípravu a čištění testovacího prostředí. To zabraňuje vzájemnému ovlivňování testů a zjednodušuje diagnostiku chyb.
Pokrývejte okrajové případy: integrační testy by měly kontrolovat nejen úspěšné scénáře (happy path), ale také zpracování chyb — časové limity, HTTP kódy 4xx a 5xx, prázdné odpovědi, poškozený JSON. Podle údajů Google Testing Blog (2022) souvisí 60% produkčních incidentů s nesprávným zpracováním okrajových případů, které nebyly pokryty testy.
Často kladené otázky
Jednotkové testy kontrolují jednu třídu nebo funkci v izolaci, nahrazují závislosti stuby. Integrační testy kontrolují interakci několika skutečných komponent — například síťové připojení a databázi současně.
Spuštění integračních testů obvykle trvá 2 až 15 minut v závislosti na počtu testů a složitosti prostředí. Pro velké projekty se doporučuje rozdělit testy na paralelní úlohy v CI systému, aby se zkrátil celkový čas kontroly před mergem.
V první řadě se integrační testy píší pro síťovou vrstvu, databázi a systémové služby — notifikace, kameru, geolokaci. API požadavky na backend a operace s lokálním úložištěm poskytují nejvyšší ROI, protože tyto komponenty se nejčastěji stávají zdrojem regresí.
Pro jednu obrazovku stačí jednotkové testy ViewModel a UI testy. Integrační testy pro jednu obrazovku jsou opodstatněné pouze pokud obrazovka interaguje s několika zdroji dat — například kombinuje odpovědi ze dvou různých API nebo zapisuje data současně do sítě a lokální databáze.
Integrační testy se spouštějí při každém pull requestu v CI pipeline a před hlavními vydáními. Doporučuje se také spouštět celou sadu integračních testů v noci (nightly build), aby se odhalily defekty související se změnami v závislostech nebo testovacím prostředí.
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é