Mobil uygulama testi, bir uygulamanın doğru çalıştığını, çökmediğini ve gereksinimleri karşıladığını doğrulama sürecidir. Software Testing Help (2025)'e göre, otomatik test, manuel teste kıyasla regresyon kontrollerinin süresini %70–80 oranında azaltır. Bu makalede, test seviyelerini, iOS ve Android araçlarını, TDD ve BDD'yi ve ayrıca testler için CI/CD'yi inceleyeceğiz.
Önemli Noktalar
Birim testleri mobil uygulama testinin temelidir. Kodun en küçük birimini — tek bir fonksiyon, yöntem veya sınıfı sistemin geri kalanından izole ederek doğrular. Mobil geliştirmede, birim testleri JUnit (Android) ve XCTest (iOS) ile yazılır. İyi bir birim testi hızlı, bağımsız ve tekrarlanabilir olmalıdır — ağa, veritabanına veya UI bileşenlerine bağımlı olmamalıdır. İzolasyon için test çiftleri kullanılır: mock, stub ve fake.
Mockito (Java/Kotlin) ve MockK (Kotlin öncelikli), Android'de mock nesneleri oluşturmak için popüler kütüphanelerdir. iOS'te OCMock, Cuckoo veya manuel protokoller kullanılır. Kural: birim testleri iş mantığını ve veri modellerini kapsamalıdır. UI testleri birim testlerini tekrarlamamalıdır — bunlar kullanıcının arayüzle etkileşimini doğrular.
Entegrasyon testleri bileşenler arasındaki etkileşimi doğrular: veritabanı ile depo, API hizmeti ile ViewModel, ekranlar arası gezinme. Birim testlerinin aksine, entegrasyon testleri gerçek veya gerçeğe yakın bağımlılıklar kullanır (örneğin, bellek içi veritabanı veya mock sunucu). Robolectric, öykünücü olmadan JVM'de Android testlerini çalıştırmak için bir framework'tür ve entegrasyon testlerini 10 kat hızlandırır.
Anlık görüntü testleri (Golden Tests), işlenmiş bir UI bileşenini referans görüntüyle (anlık görüntü) karşılaştıran özel bir entegrasyon testi türüdür. Görünüm değişirse test başarısız olur ve geliştirici neyin değiştiğini görür. Facebook SnapshotTestCase (iOS) ve Shot (Android), anlık görüntü testi için popüler araçlardır.
E2E testleri (uçtan uca), baştan sona tüm kullanıcı senaryosunu doğrular: uygulama başlatma, giriş yapma, işlem yapma, sonucu kontrol etme. UI testleri, arayüze odaklanan E2E'nin bir alt kümesidir. Araçlar: Espresso (Android), XCUITest (iOS), Detox (React Native). E2E testleri en yavaş olanlardır, bu nedenle CI'da ayrı olarak çalıştırılırlar — genellikle gece yapılarında.
XCTest, mobil uygulamaların birim testi için Apple'ın yerleşik framework'üdür. XCTestRunner, simülatörde veya gerçek bir cihazda testleri çalıştırır. Testler XCTestCase'den miras alır, hazırlık ve temizlik için setUp ve tearDown içerir. XCTest, iddialar için XCTAssert (XCTAssertEqual, XCTAssertNil, XCTAssertTrue) ve asenkron işlemleri beklemek için XCTWaiter içerir.
Basit bir XCTest testi örneği: User modeli oluşturma, başlatmanın doğruluğunu, ad biçimlendirmesini ve yaş hesaplamasını doğrulama. Xcode'daki Kod Kapsamı, testlerle hangi kod satırlarının kapsandığını gösterir — ticari projeler için hedef: iş mantığının en az %70–80 kapsamı. XCTest, xcodebuild test aracılığıyla Xcode Server ve CI sistemleriyle entegre olur.
XCUITest, Apple'ın UI testi framework'üdür. Erişilebilirlik tanımlayıcıları aracılığıyla çalışır: XCUIElementQuery, düğmeleri, giriş alanlarını, tabloları etiket, tanımlayıcı veya türe göre bulur. XCUITest bir eylem dizisini kaydeder (kayıt/oynatma) ve test kodu oluşturur. Önemli: kararlı test çalışması için tüm UI öğelerinin bir accessibilityIdentifier'a sahip olması gerekir.
JUnit, Java/Kotlin'de mobil uygulamaların birim testi için temel framework'tür. Android'de, JUnit 4 (son kararlı sürüm 4.13.2) ve yeni projeler için JUnit 5 kullanılır. Mockito, mock nesneleri oluşturmak için bir kütüphanedir: when(mock.method()).thenReturn(value) — test edilen sınıfı bağımlılıklardan ayırmak için standart bir kalıp.
Android için JUnit testi örneği:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class LoginViewModelTest {
@Mock
AuthRepository authRepository;
@Test
public void login_emptyEmail_returnsError() {
LoginViewModel vm = new LoginViewModel(authRepository);
String result = vm.login("", "password123");
assertEquals("Email cannot be empty", result);
verify(authRepository, never()).authenticate(any());
}
}
Espresso, Google'ın Android UI testleri için framework'üdür. Espresso otomatik olarak UI iş parçacığıyla senkronize olur: onView(withId(R.id.button)).perform(click()).check(matches(isDisplayed())). Espresso, yerleşik boşta bekleme sayesinde yazması kolay ve kararlıdır. UI Automator, sistem öğeleriyle (izin diyalogları, bildirim gölgesi) etkileşime girebilen uygulamalar arası testler için bir framework'tür.
Detox, Wix'ten React Native mobil uygulamalarını test etmek için gri kutu E2E framework'üdür. Detox, içte Espresso (Android) ve XCUITest (iOS) kullanarak tek bir test kod tabanından her iki platformda da çalışır. Detox, uygulama boşta kalana (animasyon, ağ isteği, zamanlayıcı yok) kadar otomatik olarak bekler ve ancak o zaman sonraki eylemi gerçekleştirir.
Appium, Android, iOS, Web ve hibrit uygulamaları destekleyen evrensel bir platformlar arası framework'tür. Appium, WebDriver protokolünü kullanır ve herhangi bir programlama dilini (Java, Python, JS, Ruby) destekler. Appium Server, komutları yerel UI Automator / XCUITest komutlarına çeviren bir HTTP sunucusu olarak çalışır. Appium'un ana dezavantajı hızdır: testler yerel Espresso veya XCUITest'ten daha yavaş çalışır.
| Kriter | iOS | Android |
|---|---|---|
| Birim testleri | XCTest | JUnit 4/5 + Mockito |
| UI testleri | XCUITest | Espresso, UI Automator |
| Anlık görüntü testleri | FBSnapshotTestCase | Shot, Roborazzi |
| Hareket otomasyonu | XCUIGesture | UiAutomator touch |
| Kod kapsamı | Xcode Code Coverage | Jacoco |
| CI entegrasyonu | xcodebuild test | Gradle connectedCheck |
TDD, uygulama kodundan önce testin yazıldığı bir mobil uygulama test metodolojisidir. Red-Green-Refactor döngüsü: (1) başarısız olan bir test yazın (Red), (2) testi geçmek için minimum kodu yazın (Green), (3) testi geçer durumda tutarak kodu yeniden düzenleyin. TDD, yeni işlevsellik için %100 test kapsamı ve temiz bir mimari sağlar çünkü test, gereksinimin ilk şartnamesidir.
BDD, testlerin doğal dilde Given-When-Then formatında yazıldığı TDD'nin bir uzantısıdır. Given (bağlam) — When (eylem) — Then (beklenen sonuç). BDD testleri, ekip üyelerinin tümü tarafından anlaşılabilir: geliştiriciler, test uzmanları, analistler ve müşteriler. Mock vs Stub vs Fake: Mock etkileşimi doğrular (yöntemin çağrılıp çağrılmadığı), Stub sabit veri döndürür, Fake basitleştirilmiş çalışan bir uygulamadır (örneğin, bellek içi DB). IT Sectr'da, kritik iş mantığı için TDD ve kabul senaryoları için BDD kullanıyoruz.
Test Çiftleri, testlerde gerçek bağımlılıkların yerini alan nesnelerin genel adıdır. Dört türü vardır: Dummy (parametreleri doldurmak için, kullanılmaz), Stub (belirtilen değerleri döndürür), Spy (doğrulama için çağrıları kaydeder), Mock (beklenen çağrıları önceden tanımlar). Farkı anlamak, doğru test tasarımı için kritik öneme sahiptir.
CI/CD — Sürekli Entegrasyon ve Sürekli Teslimat: her kod değişikliğinde mobil uygulamaları otomatik olarak derleme ve test etme pratiği. Mobil geliştirmede, CI/CD boru hattı şunları içerir: linting, birim testleri, entegrasyon testleri, APK/IPA derlemesi ve UI testleri. GitHub Actions ve Bitrise, mobil CI/CD için popüler platformlardır. Testler hızlı çalışmalıdır: birim testleri 1–2 dakikada, entegrasyon testleri 5–10'da, UI testleri 15–30 dakikada.
Device Farm, testler için gerçek cihazlardan oluşan bir çiftliktir. Firebase Test Lab (Android) ve Xcode Cloud (iOS), yüzlerce cihaz modeline bulut erişimi sağlar. Device Farm, öykünücülerde görünmeyen sorunları ortaya çıkarır: farklı ekran boyutları, eski cihazlarda performans, uyumluluk sorunları. IT Sectr'da, düzenli olarak Android için Firebase Test Lab ve iOS için Xcode Cloud kullanıyoruz.
Sıkça Sorulan Sorular
Ticari projeler için iş mantığının en az %70–80 kapsamı. UI kodunu kapsamak daha zordur — %50 yeterlidir. Önemli olan yüzde değil testlerin kalitesidir: kritik senaryoları, sınır durumlarını ve hata yönetimini test edin.
Mock etkileşimi doğrular — belirli bir yöntemin belirli parametrelerle çağrılıp çağrılmadığını. Stub önceden tanımlanmış verileri döndürür. Mock davranışı, Stub durumu kontrol eder.
Evet, ancak yalnızca kritik senaryolar için: giriş, kayıt, sipariş tamamlama, ödeme. UI testleri yavaş ve kırılgandır — her ekran için test yazmayın. Kullanıcının E2E senaryolarına odaklanın.
Anlık Görüntü Testi (Golden Test), işlenmiş bir UI bileşenini referans görüntüyle karşılaştırır. Görünüm değişirse (yazı tipi, dolgu, renk), test başarısız olur — geliştirici değişikliğin kasıtlı olup olmadığını kontrol eder. Bileşen kitaplıkları için idealdir.
E2E testlerini birden çok cihazda paralel olarak çalıştırın, Cloud Device Farm kullanın ve testleri bağımsız gruplara ayırın. Testleri optimize edin: beklemeleri en aza indirin, ağ istekleri için mock kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.