Flaky test, ayni kod ve ortamda bazen gecip bazen kalan testtir. Ekip guvenini asindirir: yesil pipeline anlamini yitirir, kirmizi build ignore edilir ve gerçek regresyonlar uretime sizar. Google ve Microsoft arastirmalari büyük kod tabanlarinda flaky oraninin %1-15 arasinda oldugunu gösterir. Bu makalede flaky testlerin kok neden analizi, deterministik test yazma teknikleri, altyapi iyilestirmeleri ve kurumsal flaky yönetim surecini kapsamlı şekilde ele aliyoruz.
Flaky test tanimi ve ölçümü
Bir test en az iki kez calistirildiginda farklı sonuç veriyorsa flaky'dir. Ölçüm: son N kosuda basarisizlik orani, veya ayni commit'te retry ile gecen testler. Flaky rate = flaky test sayisi / toplam test sayisi izlenmeli. Hedef: %0.5 alti ve dusus trendi.
Flaky ile broken test ayrilir: broken her zaman kirmizi, flaky ara sıra. Quarantine'a alinan testler merge'i bloklamaz ama borc listesinde takip edilir.
Kok neden kategorileri
Zaman ve async
Race condition: assertion DOM guncellenmeden çalışır. Thread.Sleep sabit sure yetersiz kalir. Çözüm: polling with timeout, Playwright auto-wait, await async işlemler, IClock enjeksiyonu.
Test izolasyonu
Paralel testler ayni veritabanı kaydini gunceller. Paylasilan static state, singleton cache kirilir. Çözüm: benzersiz test verisi, transaction rollback, collection bazli seri çalıştırma.
Dis bağımlılıklar
Gerçek API rate limit, DNS gecikmesi, e-posta kutusu gecikmesi. Çözüm: mock server, test double, sandbox ortami, retry sinirli ve kok neden duzeltme.
Sistem kaynaklari
CI agent CPU throttling, disk dolu, out of memory. Çözüm: worker sayisi azaltma, container resource limit, agir testleri ayirma.
- Locator instabilitesi: XPath ile dinamik ID.
- Siralama bagimliligi: Test B, Test A'nin biraktigi veriye bağlı.
- Tarih/saat: Gece yarisina denk gelen testler.
- Rastgelelik: Seed'siz Random kullanımı.
Deterministik test yazma
Sabit seed: Random(42) veya test framework seed yapilandirmasi. Sabit zaman: 2024-01-15T10:00:00Z freeze. Benzersiz veri: Guid veya test adi prefix ile collision onleme.
// Kotuawait Task.Delay(3000);Assert.True(element.Visible);// Iyiawait WaitUntil(() => element.IsVisible, timeout: TimeSpan.FromSeconds(10));Assertion'lar dis gozlemlenebilir duruma odaklanmali: HTTP status, DB kaydi, görünür metin. Dahili private state assert etmek hem kirilgan hem flaky yapar.
Locator ve UI stabilitesi
data-testid yalnizca gerekli yerlerde; öncelik role, label, text. Animasyonlar test CSS'de kapatilir: prefers-reduced-motion veya test-only class. Lazy load içerik icin scroll into view veya network idle bekleme bilincli kullanılır.
Veritabanı ve veri stratejisi
- Her test kendi Arrange verisini oluşturur.
- Cleanup garanti: try/finally veya container destroy.
- Paralel icin schema veya database per worker.
- Sequence ve identity collision icin yüksek aralik ID.
Shared fixture verisi anti-pattern'dir. Factory pattern ile minimal veri; yalnizca testin ihtiyaci kadar.
CI ortami iyilestirmeleri
Tutarlı Docker image, pinned browser surumu, cache warm-up. Network: dis internet bagimliligini azalt; internal mock servis. Retry policy: max 2 retry yalnizca bilinen geçici hatalarda; her retry loglanir ve flaky aday olarak isaretlenir.
Test sharding dengesiz ise bazı shard'lar timeout'a duser; test suresi analizi ile bolme duzeltilir.
Flaky yönetim süreci
Tespit: CI otomatik flaky dedeksiyonu (aynı test son 10 kosuda %20 başarısız). Quarantine: Test ayri job'a tasinir, ana pipeline'i bloklamaz. Ticket: Sahip atanir, SLA 2 sprint. Düzenleme veya silme: Kok neden giderilmezse test silinir; yanlış guven tehlikelidir.
Flaky budget: ekip ayni anda en fazla N quarantined test. Uzerinde yeni flaky kabul edilmez once mevcut kapatilir.
Araclar
BuildPulse, Trunk Flaky Tests, Azure Test Plans flaky analizi. pytest-rerunfailures, jest retry, Playwright trace. Git bisect ile flaky'yi tetikleyen commit bulunur. Metrik dashboard: en flaky 10 test listesi haftalik review.
Kultur ve ekip davranisi
"Retry until green" kulturu yasaklanmali. Flaky test merge'i bloke eden degil, duzelten sorumluluk paylasilir. Yeni test PR'da en az bir kez stress çalıştırma (--repeat-each=10) onerilir. Code review'da Sleep, hard-coded wait, paylasilan state sorulur.
Onleme checklist
- Async tamamlanana kadar bekle (framework primitive).
- Test bagimsiz; siralama önemli degil.
- Dis servis mock veya sandbox.
- Zaman ve rastgelelik enjekte edilebilir.
- Locator erisilebilirlik öncelikli.
- Paralel güvenli veri modeli.
Uzun vadeli yatırım
Test piramidi dengesi flaky yukunu azaltir: birim testler neredeyse hic flaky degildir. E2E sayisini makul tutmak flaky yuzey alanini kucultir. Contract test ile dis servis belirsizligi azalir. Observability: test loglarinda correlation ID ile üretim logu karsilastirmasi.
Olum ve yeniden yazim
6 ay quarantine'da kalan test silinir veya birim+entegrasyona parcalanir. Flaky E2E yerine API testi yeterli mi degerlendirilir. Test degeri dusukse kaldirma cesareti gosterilir; sahte guven daha kotudur.
Örnek vaka analizi: zaman asimi
Bir E2E testi gece yarisina denk gelen tarih filtresi nedeniyle ara sıra başarısız oluyordu. Kok neden: test verisi "bugun" kullaniyordu; UTC ve yerel saat farki gece 00:00'da kayıt dusuyordu. Çözüm: IClock enjeksiyonu ve sabit test tarihi. Ders: zaman her zaman enjekte edilebilir olmali.
Örnek vaka analizi: paralel cakisma
Iki entegrasyon testi ayni e-posta adresiyle kullanıcı olusturuyordu; paralel kosuda unique constraint hatasi flaky yaratiyordu. Çözüm: test basina Guid suffix ile benzersiz e-posta. Ders: paylasilan global veri anti-pattern'dir.
Metrik hedefleri ve SLA
Flaky rate aylik %1 altina indirilmeli. Quarantine'daki test sayisi toplam E2E'nin %5'ini gecmemeli. Ortalama retry sayisi dusus trendinde olmali. Bu metrikler sprint retrospective'de QA ve geliştirme birlikte incelenir.
Akilli test seçimi ve impact analysis
Her commit'te tüm E2E yerine değişen modül ile ilişkili testler calistirilir; flaky yuzey alani kuculur. Machine learning tabanli test seçimi büyük monorepo'larda deneysel olarak kullanılır. Impact analysis yanlış negatif uretirse kritik smoke her zaman kosar.
Manuel QA ile denge
Otomasyon her senaryoyu kapatamaz; exploratory test manuel kalir. Flaky otomasyonu manuel tekrarlamak çözüm degildir. Manuel bulgular otomasyon backlog'una eklenir; kararlı otomatik teste donusturulur.
Flaky test post-mortem sablonu
Her quarantine testi icin post-mortem doldurulur: kok neden, etkilenen pipeline, duzeltme PR linki, tekrar etme riski. Bilgi tabani birikir; benzer hatalar ayni cozumle kapatilir. Post-mortem olmadan quarantine'dan çıkış yapilmaz.
Load test ile karistirilmamali
Flaky test ile load test farklı problemlerdir. Yük altinda timeout artabilir ancak bu performans testi kapsamina girer. Performans testleri ayri pipeline ve metriklerle yönetilir; flaky olarak etiketlenmemeli. Her iki sorun tipi icin ayri sahip ve dashboard kullanılır.
Ortam paritesi ve configuration drift
Staging ile production node surumu, tarayici surumu ve TLS yapilandirmasi farkliysa flaky uretilir. CI image versiyonu Dockerfile ile pinlenir. Feature flag varsayilanlari staging ile esitlenir. Config drift tespiti icin haftalik ortam diff scripti calistirilir; beklenmeyen farklar build oncesi raporlanir.
Ag kosullari simulasyonu
Playwright route gecikme ile yavas ag simule edilir. Timeout degerleri gercekci ag altinda da gecmeli; yalnizca localhost hizina gore yazilan testler staging'de flaky olur. Offline ve reconnect senaryolari service worker uygulamalarinda zorunludur. Gecikme enjekte edilmeden yazilan E2E guvenilmez kalir.
Istatistiksel flaky tespiti
Tek kosuda gecen test güvenilir degildir. Merge oncesi --repeat-each=5 veya dedicated flaky hunter job ayni commit'i tekrar calistirir. Binomial dagilim ile flake probability hesaplanir; %5 uzeri öncelikli backlog'a alinir. Rastgele ignore edilen yesil build istatistikle maskelenir.
Eventual consistency assert pattern
Event-driven sistemlerde okuma hemen yazim sonrasi bos donebilir. Assert oncesi polling: en fazla 30 saniye 500ms aralikla koşul kontrolu. Ham Sleep yerine expect.poll Playwright'ta bu deseni uygular. Consistency penceresi dokumante edilmeli; test bekledigi gecikmeyi asiri acmamali.
Flaky testler cozulmeden biriktirildiginde CI guvenilirligi coker. Sistematik kok neden analizi, deterministik tasarım, izolasyon ve kurumsal quarantine süreci ile flaky orani dusurulebilir ve yesil build tekrar anlam kazanir.