REACT TESTING STRATEJİSİ

React test piramidi: unit, integration ve e2e katmanlarının üç kademeli görsel şeması

State of JS 2023 raporuna göre React ekosisteminde test yazan geliştiricilerin %84'ü React Testing Library tercih ediyor, Enzyme'ın payı %12'ye düşmüş durumda. Aynı raporda dikkat çeken başka bir veri var: ekiplerin %47'si testlerinin "yanlış yerde" yoğunlaştığını söylüyor — yani snapshot ve UI ayrıntılarına gömülmüş, davranışı doğrulamayan testler. Test pyramid bu dengesizliği çözmek için var: çok sayıda hızlı unit test, ortada davranış odaklı integration, tepede az sayıda kritik e2e.

Test Pyramid Oranları ve React Bağlamı

Mike Cohn'un orijinal test pyramid önerisi yaklaşık %70 unit, %20 integration, %10 e2e şeklindeydi. Ancak React gibi component tabanlı kütüphanelerde bu oran kayıyor. Kent C. Dodds'un "Testing Trophy" yaklaşımı, integration testlerin tepe noktası olduğunu savunuyor çünkü bir component'in render edilmesi, prop alması ve event tetiklemesi zaten birden fazla birim kapsar.

  • Unit (%30-40): Pure function, custom hook, util — Jest yeterli
  • Integration (%50-60): Component + state + DOM etkileşimi — React Testing Library bölgesi
  • E2E (%5-10): Cypress veya Playwright ile kritik kullanıcı akışları

Bu dağılım sabit değil; SaaS dashboard'u ile e-ticaret sepeti aynı oranlarda test edilmez. Önemli olan, "hızlı geri bildirim" ile "gerçek davranış doğrulaması" arasındaki dengeyi konuya göre ayarlamak.

React Testing Library Neden Standart Oldu

RTL'nin yükselişi tesadüf değil. Enzyme component'in iç state'ine erişip setState çağırırken, RTL kullanıcı gibi davranır: getByRole, getByLabelText, userEvent.click. Bu fark, React 18 ile concurrent rendering geldiğinde belirleyici oldu — Enzyme bu API'leri zamanında destekleyemedi ve ekipler hızla göç etti. Daha fazla bilgi için konuya ilişkin kaynaklar başvurulabilir.

Testing Trophy modeli: statik analiz, unit, integration ve e2e katmanları kupa formunda

"Implementation Detail" Tuzağı

RTL'nin Guiding Principle'ı şu: "Testleriniz yazılıma ne kadar benziyorsa kullanıma, o kadar güven verir." Yani expect(wrapper.state().count).toBe(1) yerine expect(screen.getByText('1 öğe')).toBeInTheDocument(). İlki refactor'da kırılır, ikincisi kullanıcı görene kadar kırılmaz. React temellerini ve component davranışını derinleştirmek isteyenler uygulamalı React eğitimi üzerinden ilerleyebilir.

Unit Test: Hook ve Util Katmanı

Bir useDebounce hook'unu RTL'nin renderHook API'si ile test etmek tipik unit senaryosu:

  • Saf fonksiyonlar (formatter, validator, reducer) — saniyenin altında çalışır
  • Custom hook'lar — act() ile state güncellemeleri sarmalanır
  • Context provider'ların initial state üretimi

Burada hız kritiktir. 500 unit testin 3 saniyede koşması beklenir; aksi halde geliştirici testi atlama refleksi geliştirir.

Integration: Test Trophy'nin Altın Bölgesi

Bir form component'ini düşünün: input değişir, validation çalışır, submit butonu enable olur, API çağrısı tetiklenir. Bu akışın tek tek unit testi 6-7 dosya gerektirirken, MSW (Mock Service Worker) ile yapılan tek bir integration testi tüm zinciri doğrular ve refactor'a dayanıklıdır.

MSW'nin kritik avantajı: fetch veya axios mock'lamak yerine network katmanını yakaladığı için kütüphane değişikliği teste yansımaz. 2024 itibarıyla npm haftalık indirme sayısı 4 milyonu aştı.

E2E: Az ama Doğru

E2E testler pahalı. CI'da 15 dakika koşan bir Cypress suite'i ekibin merge hızını yarıya düşürür. Bu yüzden e2e için seçici olunur:

  1. Login/signup akışı
  2. Ödeme veya kritik transactional işlem
  3. Multi-step wizard veya checkout
  4. Auth gerektiren protected route geçişleri

Playwright son iki yılda Cypress'in pazar payını ciddi şekilde aşındırdı; State of JS 2023'te Playwright kullanım niyeti %45'e ulaştı, Cypress %39'da kaldı. Sebep: paralel browser, daha hızlı koşum, native mobile emulation.

Test piramidi katmanlarında her seviyenin önerilen yüzde dağılımını gösteren oransal diyagram

Coverage Metriği Yanıltıcı Olduğunda

%80 coverage hedefi kulağa hoş gelir ama hangi %80 olduğu önemlidir. Try-catch bloklarının happy path'i, log satırları ve getter'lar coverage'ı kolayca şişirir. Onun yerine "kritik kullanıcı akışlarının %100'ü test ediliyor mu?" sorusu daha sağlıklı. RTL'nin screen.debug() ve Testing Playground gibi araçlarına yapılandırılmış bir akış içinde alışmak için React eğitim programı materyalleri yol gösterebilir.

Pratik Kurulum Önerisi

  • Test runner: Vitest (Vite projeleri için) veya Jest
  • Component testi: React Testing Library + @testing-library/user-event v14
  • Network mock: MSW v2
  • E2E: Playwright
  • Visual regression: Chromatic veya Percy (opsiyonel ama UI library projelerinde kritik)

Bu yığın, küçük bir startup'tan enterprise ölçekli React uygulamasına kadar ölçeklenir. Önemli olan araç seçimi değil, hangi testin hangi katmanda yaşadığını netleştiren disiplindir. Pyramid mi trophy mi tartışmasından önce, ekibin "biz neyi doğruluyoruz?" sorusunda hemfikir olması gerekir.