Flutter uygulamalarında test yazmak, kod kalitesini ve uygulama kararlılığını artırmanın en etkili yollarından biridir. Ancak widget test ve integration test arasında seçim yapmak kafa karıştırıcı olabilir. Bu yazıda, her iki test türünün ne olduğunu, temel farklarını ve hangi senaryoda hangisini kullanmanız gerektiğini adım adım ele alıyoruz.
Widget Test Nedir?
Widget test, Flutter'da tek bir widget'ın (veya küçük bir widget grubunun) izole edilmiş ortamda test edilmesidir. Gerçek cihaz veya emülatör gerektirmez; testler hızlı çalışır ve genellikle saniyeler içinde sonuç verir. Widget testleri, kullanıcı arayüzü öğelerinin doğru görüntülendiğini, kullanıcı etkileşimlerine doğru tepki verdiğini ve durum yönetiminin beklendiği gibi çalıştığını doğrulamak için idealdir. Örneğin, bir butona tıklandığında bir sayacın artması veya bir metin alanına yazıldığında görüntünün güncellenmesi gibi senaryolar widget test ile kolayca test edilebilir.
Integration Test Nedir?
Integration test (entegrasyon testi), uygulamanın birden fazla bileşeninin bir arada çalıştığı daha geniş senaryoları test eder. Gerçek bir cihaz veya emülatör üzerinde çalışır, uygulamanın tam akışını (örneğin giriş yapma, veri çekme, sayfalar arası geçiş) doğrular. Integration testler widget testlere göre daha yavaştır (dakikalar sürebilir) ancak gerçek kullanıcı deneyimine en yakın testi sağlar. Özellikle API çağrıları, veritabanı işlemleri ve navigasyon gibi birden fazla katmanın etkileşimini kontrol etmek için kullanılır.
Widget Test vs Integration Test: Temel Farklar
| Özellik | Widget Test | Integration Test |
|---|---|---|
| Çalışma Ortamı | Test ortamı (izole) | Gerçek cihaz/emülatör |
| Hız | Çok hızlı (saniyeler) | Yavaş (dakikalar) |
| Kapsam | Tek widget / küçük grup | Tüm uygulama akışı |
| Bağımlılıklar | Mock/stub kullanılabilir | Gerçek servisler veya mock |
| Bakım Maliyeti | Düşük | Yüksek |
| Hata Yakalama | UI/logik hataları | Entegrasyon/akış hataları |
Flutter'da Widget Test Ne Zaman Kullanılmalı?
Widget testleri, aşağıdaki durumlarda öncelikli tercih olmalıdır:
- Tekil widget'ların doğruluğunu kontrol etmek: Örneğin, özel bir butonun tıklanabilirliği, renk değişimi veya bir form alanının validasyonu.
- Hızlı geri bildirim almak: Geliştirme sırasında sık sık test çalıştırmak istediğinizde widget testler ideal çünkü saniyeler içinde sonuç alırsınız.
- Durum yönetimi mantığını doğrulamak: Provider, Bloc veya Riverpod gibi state management çözümlerinin widget üzerindeki etkisi widget testle kolayca test edilir.
- Küçük, izole edilmiş birimleri test etmek: Karmaşık iş mantığı olmayan, sadece görsel veya etkileşim odaklı widget'lar.
Integration Test Ne Zaman Tercih Edilmeli?
Integration testler, aşağıdaki senaryolarda devreye girer:
- Kritik kullanıcı akışlarını doğrulamak: Örneğin, kullanıcı kayıt olma, ürün arama, sepete ekleme ve ödeme yapma gibi uçtan uca işlemler.
- API ve backend bağımlılıklarını test etmek: Gerçek API çağrıları veya mock servislerle uygulamanın veri alışverişini kontrol etmek. Bu noktada REST API'lerde Input Validation prensiplerine uygunluk da test edilebilir.
- Navigasyon ve routing hatalarını yakalamak: Sayfalar arası geçişlerde veri aktarımı ve route yönetimi integration testle güvence altına alınır.
- Multi-platform tutarlılığını sağlamak: Aynı testin iOS ve Android'de çalıştırılarak platform farklılıklarını ortaya çıkarmak.
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
Hem widget test hem de integration test yazarken kaçınılması gereken bazı yaygın hatalar vardır:
- Testleri çok kırılgan hale getirmek: Widget testlerde özel anahtarlar (Key) kullanmamak veya integration testlerde bekleme sürelerini sabit değerler yerine koşullu bekleme ile yönetmemek sık karşılaşılan sorunlardır. Testlerin UI değişikliklerine karşı dayanıklı olması için Finder işlemlerinde mümkün olduğunca esnek seçiciler kullanın.
- Her şeyi integration testle kapsamaya çalışmak: Integration testler yavaş ve bakımı zordur. Temel iş mantığı ve widget davranışları için widget test, uçtan uca akışlar için integration test kullanarak dengeli bir strateji izleyin.
- Mock ve stub kullanımını ihmal etmek: Özellikle widget testlerde HTTP çağrıları veya veritabanı işlemleri mock'lanmalıdır. Aksi halde testler yavaşlar ve dış bağımlılıklara hassas hale gelir. GraphQL vs REST tercihinizde mock kolaylığını da göz önünde bulundurun.
- Güvenlik ve authentication senaryolarını atlamak: Kullanıcı girişi veya token yönetimi gerektiren akışlarda, integration testlerinizde JWT Token Yönetimi gibi güvenlik adımlarını test etmeyi unutmayın.
Performans ve Bakım Dengesi: Hangi Test Stratejisini Seçmeli?
Flutter projelerinde genel kabul gören yaklaşım, test piramidini takip etmektir: çok sayıda widget test (hızlı ve izole), orta sayıda integration test (kritik akışlar) ve az sayıda manuel test. Widget testlerin sayısı integration testlerden en az 10 kat fazla olmalıdır. Bu denge, hem hızlı geri bildirim almanıza hem de uygulamanızın kalitesini yüksek tutmanıza olanak sağlar. Örneğin, 200 widget test ve 20 integration test içeren bir proje, bakım maliyetini düşürürken kritik hataları erken yakalar.
Widget Test ve Integration Test Birlikte Nasıl Kullanılır?
İdeal bir test stratejisi, her iki test türünü birbirini tamamlayacak şekilde kullanır. Widget testlerle her bir widget'ın doğru çalıştığından emin olduktan sonra, integration testlerle bu widget'ların bir araya gelerek doğru akışı oluşturduğunu doğrulayabilirsiniz. Örneğin, bir giriş ekranı için önce widget testle kullanıcı adı ve şifre alanlarının validasyonunu, ardından integration testle başarılı giriş sonrası ana sayfaya yönlendirmeyi test edebilirsiniz. Bu yaklaşım, hataların kaynağını hızlıca bulmanıza yardımcı olur.
Sonuç olarak, Flutter projelerinde widget test ve integration test arasında seçim yaparken hız, kapsam ve bakım maliyeti dengesini gözetmek gerekir. Küçük, izole bileşenler için widget test; kritik, çok katmanlı akışlar için integration test kullanarak sağlam bir test altyapısı kurun. Unutmayın, test yazmaya harcadığınız zaman, ileride karşılaşabileceğiniz büyük sorunları önlemenin en etkili yoludur.
Sık Sorulan Sorular
Widget test nedir ve ne işe yarar?
Widget test, Flutter'da tek bir widget'ın izole edilmiş ortamda test edilmesidir. Kullanıcı arayüzü öğelerinin doğru görüntülenip etkileşimlere doğru yanıt verdiğini doğrulamak için kullanılır. Hızlı çalışır ve geliştirme sırasında sık sık çalıştırılabilir.
Integration test ile widget test arasındaki temel fark nedir?
Widget test izole ve hızlıyken, integration test gerçek cihaz/emülatör üzerinde çalışır, tüm uygulama akışını test eder ve daha yavaştır. Widget test tek bir bileşene odaklanırken, integration test birden fazla bileşenin etkileşimini doğrular.
Flutter projemde hangi test türüne daha fazla yer vermeliyim?
Test piramidine göre çok sayıda widget test (örneğin, 200+), orta sayıda integration test (20 civarı) ve az sayıda manuel test idealdir. Widget testler hızlı geri bildirim sağlarken, integration testler kritik akışları güvence altına alır.
Integration test ne zaman kullanılmalıdır?
Kritik kullanıcı akışları (kayıt, ödeme), API çağrıları, navigasyon ve multi-platform tutarlılığını doğrulamak için integration test kullanılmalıdır. Özellikle gerçek kullanıcı deneyimini test etmek istediğiniz senaryolarda tercih edilir.
Widget test yazarken sık yapılan hatalar nelerdir?
En sık yapılan hatalar: testlerde sabit bekleme süreleri kullanmak, mock/stub kullanmamak, kırılgan seçiciler (örneğin, metin içeren Finder) kullanmak ve her durumu widget testle kapsamaya çalışmaktır. Esnek ve dayanıklı testler yazmak için Key kullanımına dikkat edin.






