Mobil uygulama geliştirmede UI testleri, kullanıcı arayüzünün beklendiği gibi çalıştığından emin olmanın en kritik yollarından biridir. Android dünyasında Google'ın resmi test çerçevesi Espresso, iOS'ta ise Apple'ın XCUITest öne çıkar. Peki, hangisini tercih etmelisiniz? Bu yazıda iki çerçeveyi performans, yazım kolaylığı, bakım maliyeti ve platform özellikleri açısından karşılaştırıyoruz.
Espresso ve XCUITest'in Temel Farkları
| Özellik | Espresso (Android) | XCUITest (iOS) |
|---|---|---|
| Dil Desteği | Java, Kotlin | Swift, Objective-C |
| Çalışma Prensibi | UI thread ile senkronize, otomatik bekleme mekanizması | UI otomasyonu için XCTest framework'ü, async bekleme (expectations) |
| Öğrenme Eğrisi | Düşük-orta: Activity ve View yapısına hakimiyet gerekir | Orta: UIKit/SwiftUI bilgisi, asenkron test yazma alışkanlığı |
| Test Hızı | Hızlı, çünkü UI thread'de çalışır ve idle resource kullanır | Orta-hızlı, ancak async bekleme süreleri eklenebilir |
| Entegrasyon | Android Studio, Gradle, Firebase Test Lab | Xcode, CI/CD (Bitrise, GitHub Actions), Xcode Cloud |
| Assertion Kütüphaneleri | Hamcrest, Truth, ViewAssertions | XCTAssert, custom helperlar |
| UI Element Bulma | onView(withId()), onData(), custom matchers | app.buttons["login"], app.staticTexts, element query |
| Güvenilirlik | Yüksek: idle resource ile flaky test azalır | Yüksek: async yönetimi doğru yapılırsa |
Performans ve Güvenilirlik
Espresso'nun en büyük avantajı, otomatik bekleme mekanizmasıdır. UI thread boşta kalana kadar bekler, bu sayede testler daha az flaky olur. XCUITest ise beklemeleri developer'ın yönetmesini bekler; XCTWaiter veya expectations kullanılmazsa testler rastgele başarısız olabilir. Özellikle animasyonlar ve ağ çağrıları sırasında waitForExpectations ile zaman aşımı sürelerini doğru ayarlamak kritiktir.
Her iki çerçeve de platforma özel avantajlar sunar. Örneğin Espresso, RecyclerView gibi karmaşık liste görünümlerinde onData ile kolayca veri odaklı test yazmanıza olanak tanır. XCUITest ise iOS'un erişilebilirlik etiketlerine (accessibility identifier) dayanır; doğru identifier'lar kullanıldığında testler oldukça kararlı hale gelir. Bu nedenle, UI elementlerine unique identifier eklemek her iki platformda da iyi bir uygulamadır.
Yazım Kolaylığı ve Okunabilirlik
Espresso testleri tipik olarak aşağıdaki gibi yazılır:
onView(withId(R.id.login_button))
.perform(click())
.check(matches(isDisplayed()));
XCUITest Swift tarafında daha doğal bir sözdizimi sunar:
app.buttons["login"].tap()
XCTAssertTrue(app.staticTexts["welcome"].exists)
Espresso'nun Hamcrest matcher'ları esneklik sağlarken, XCUITest'in query yapısı daha basittir. Ancak Swift'in optional ve type safety yapısı, test yazarken biraz daha dikkat gerektirebilir. Kotlin ile Espresso kullanıyorsanız, lambda ifadeleri sayesinde kod daha kısa ve okunabilir hale gelir.
Entegrasyon ve CI/CD
Her iki çerçeve de popüler CI/CD araçlarıyla kolayca entegre olur. Android için Firebase Test Lab, Espresso testlerini bulutta paralel olarak çalıştırmanıza olanak tanırken, XCUITest testleri Xcode Cloud veya GitHub Actions üzerinde çalıştırılabilir. Özellikle cross-platform projelerde (örneğin React Native ile yapılmış bir uygulama) her iki çerçeveyi ayrı ayrı entegre etmek gerekebilir. Bu noktada React Native vs Flutter karşılaştırması size platform seçiminde yardımcı olabilir. Ayrıca, test performansını izlemek için Flipper gibi araçlar kullanılabilir.
Hangi Durumda Hangi Çerçeve Seçilmeli?
Eğer sadece Android uygulaması geliştiriyorsanız, Espresso tartışmasız en iyi seçenektir. Google tarafından desteklenir, sürekli güncellenir ve Android Studio ile sıkı entegrasyona sahiptir. iOS tarafında da XCUITest, Apple'ın resmi çerçevesi olduğu için ilk tercih olmalıdır. Üçüncü taraf çerçeveler (örneğin Appium, Calabash) multiplatform olsa da, çoğu zaman native çerçeveler kadar hızlı ve güvenilir değildir.
Cross-platform bir projede (React Native, Flutter) her iki platform için ayrı testler yazmanız gerekecektir. Bu durumda Espresso ve XCUITest'i birlikte kullanmak en sağlıklı yaklaşımdır. Ancak test bakım maliyetini düşürmek için kimlik doğrulama gibi ortak modülleri tek bir test senaryosuyla ele almak isteyebilirsiniz. Detector testleri (örneğin Detox) bu işi daha kolaylaştırsa da, native performansı yakalayamaz.
Başlangıç İçin Pratik İpuçları
- Android'de: Espresso kullanırken test sınıflarınızda
ActivityTestRuleveyaActivityScenariokullanın. Gereksiz bekleme süreleri eklemekten kaçının; idle resource'ları doğru yapılandırın. - iOS'ta: Erişilebilirlik identifier'larını storyboard veya kod içinde atayın.
XCTWaiterkullanarak bekleme sürelerini yönetin ve testleri@MainActorile işaretleyin. - Ortak: Testlerinizi küçük ve odaklı tutun. Bir testte birden fazla UI akışını test etmekten kaçının. CI/CD'de testleri paralel çalıştırmak için fiziksel cihaz veya simülatör kullanın.
Sonuç: İkisi de Kendi Platformunda En İyisi
Espresso ve XCUITest, kendi platformları için en olgun ve güvenilir UI test çerçeveleridir. Seçim yaparken projenizin hangi platform(ler)i hedeflediğine ve ekibin mevcut bilgi birikimine karar vermelisiniz. Eğer hem Android hem iOS geliştiriyorsanız, iki çerçeveyi de öğrenmek kaçınılmazdır. Bu yatırım, uygulamanızın kalitesini uzun vadede artıracaktır. Unutmayın, iyi testler yazmak, mutsuz kullanıcılarla karşılaşmanızı engellemenin en etkili yoludur.
Sık Sorulan Sorular
Espresso ve XCUITest arasındaki temel fark nedir?
Espresso Android için Google, XCUITest ise iOS için Apple tarafından geliştirilmiştir. Espresso otomatik bekleme sunarken XCUITest async beklemeleri geliştiricinin yönetmesini bekler. Her ikisi de platforma özel avantajlar sağlar.
Cross-platform projelerde hangi test çerçevesini kullanmalıyım?
React Native veya Flutter gibi cross-platform projelerde hem Espresso hem XCUITest kullanmanız önerilir. Ancak Detox gibi araçlar da alternatif olabilir, fakat native çerçeveler kadar hızlı ve güvenilir olmayabilir.
Espresso testleri XCUITest'ten daha hızlı mı?
Genelde evet. Espresso'nun idle resource mekanizması sayesinde testler daha az bekler, bu da daha hızlı çalışmasını sağlar. XCUITest'te async bekleme süreleri test süresini uzatabilir.
UI testlerinde flaky testleri nasıl azaltırım?
Her iki çerçevede de flaky testleri azaltmak için unique identifier'lar kullanın, animasyonları kapatın, ağ istekleri için mock kullanın ve beklemeleri doğru yapılandırın. Espresso ile idle resource, XCUITest ile expectations kullanmak faydalıdır.
Hangi dilde test yazmalıyım?
Android için Kotlin veya Java, iOS için Swift veya Objective-C. Kotlin ve Swift modern diller olduğu için tercih edilir. Her ikisi de daha okunabilir ve kısa kod yazmanıza olanak tanır.






