Unit Test Nedir?
Kodun en küçük birimlerini (fonksiyon, sınıf, modül) izole olarak test etme. Mantıksal hataları erken yakalar. 2026 itibarıyla unit testing, profesyonel mobil uygulama geliştirmenin standart parçasıdır ve CI/CD pipeline'larının temelini oluşturur.
Neden Önemli?
- Bug'ları erken tespit (production'dan çok daha ucuz - 100x maliyet farkı)
- Refactoring güveni (değişiklik sonrası her şey çalışıyor mu?)
- Dokümantasyon (test, kodun nasıl çalıştığını gösterir)
- CI/CD pipeline'ının temeli
- Yeni ekip üyeleri için living documentation
Platform Bazlı Araçlar
React Native
- Jest: Facebook'un test framework'ü (varsayılan)
- React Native Testing Library: Component test (render + query + fire event)
- Mock: jest.mock() ile modül mocklama
- Snapshot testing: Bileşen çıktısını snapshot ile karşılaştırma
@testing-library/react-nativeile kullanıcı odaklı testler
iOS (Swift)
- XCTest: Apple'ın yerleşik test framework'ü
- Quick/Nimble: BDD tarzı test (describe/it formatı)
- Xcode Test Navigator ile çalıştırma
- Swift Testing framework (Swift 5.9+): Modern, macro tabanlı test API
Android (Kotlin)
- JUnit 5: Standart Java/Kotlin test framework'ü
- Mockito / MockK: Mocklama (MockK Kotlin için daha idiomatic)
- Robolectric: Android framework'ü simüle (device olmadan)
- Android Studio Test Runner ile çalıştırma
Flutter
- flutter_test: Yerleşik test paketi
- mockito (Dart): Mock oluşturma
- Widget test ve unit test ayrımı
- Golden test: Visual snapshot testing
Ne Test Edilmeli?
Test Et
- İş mantığı (hesaplama, validasyon, dönüşüm)
- Veri modelleri (parse, serialize, fromJson/toJson)
- Utility fonksiyonlar (format, filter, sort)
- State management mantığı (reducer, action, selector)
- API response handling (başarılı, hatalı, edge case)
- Form validasyon kuralları
Test Etme (Unit ile)
- UI rendering (integration/e2e test)
- Platform API'ları (camera, GPS - mock kullan)
- Ağ çağrıları (mock kullan, gerçek API çağırma)
- Veritabanı (integration test)
- Navigasyon akışları
Test Yapısı (AAA Pattern)
- Arrange: Test verilerini hazırla
- Act: Test edilen fonksiyonu çağır
- Assert: Sonucu doğrula
// Jest Örneği
describe('formatPrice', () => {
it('should format number with currency symbol', () => {
// Arrange
const price = 29.99;
// Act
const result = formatPrice(price, 'TRY');
// Assert
expect(result).toBe('29,99 TL');
});
it('should handle zero price', () => {
expect(formatPrice(0, 'TRY')).toBe('0,00 TL');
});
});
Coverage (Kapsam)
- Line coverage: Kaç satır test edildi
- Branch coverage: Kaç koşul dalı test edildi
- Function coverage: Kaç fonksiyon test edildi
- Hedef: %70-80 (önemli iş mantığı %100)
- %100 coverage ≠ bug-free (yanlış güven vermesin)
- Coverage tool: Istanbul/nyc (JS), Xcode (iOS), JaCoCo (Android)
Mocking Stratejileri
Ne Zaman Mock?
- Dış servisler (API, database)
- Platformm API'ları (kamera, konum)
- Zaman bağımlı fonksiyonlar (Date.now, setTimeout)
- Rastgele değerler (Math.random)
Mock Türleri
- Mock: Davranış tanımlanan sahte nesne
- Stub: Sabit değer döndüren basit mock
- Spy: Gerçek fonksiyonu çağırıp çağrı bilgisini kaydeden
Best Practices
- Test adları açıklayıcı olsun ("should_return_error_when_email_invalid")
- Her test tek bir şeyi test etsin
- Test bağımsız olsun (sıra fark etmemeli)
- Mock'ları minimum tut (over-mocking = güvenilmez test)
- CI'da her PR'da otomatik çalıştır
- Hızlı olsun (tüm unit testler < 1 dakika)
- Test data factory/builder pattern kullan
- Flaky test'leri hemen düzelt (güven kaybı yaratır)
Unit test yazmak zaman alır ama yazmamak daha çok zaman alır. Her büyük bug bir eksik testtir.