Her ekibin tanıdığı bir test vardır: bazen yeşil, bazen kırmızı, yeniden çalıştırınca geçer. İlk gün hoş görülür, onuncu gün ekip o testi görmezden gelmeye başlar, otuzuncu gün kırmızının da anlamı kalmaz. Flaky testin gerçek bedeli budur: kırmızı ışığın değerini düşürür. Bir alarm her çaldığında sesini kısmaya başlarsanız, gerçek yangında kimse koşmaz. Bu yazı, semptomu susturmadan önce nedeni bulma disiplinini anlatıyor: hem av yöntemini hem de çiftliği kapatmayı.

Retry, ilaç değil uyuşturucu

Çoğu CI, adım başına retry sunar. İlk refleks onu açmaktır. Retry flaky testi görünürlükten çıkarır; sorunu çözmez, saklar. Altında yatan yarış durumu, saat bağımlılığı veya paylaşılan duruma sahip test, üretimde de aynı davranışı gösterecektir — daha kötü bir anda, daha pahalı bir şekilde.

# Bunu yapmayın: sorunu kapatır
steps:
  - run: npm test -- --retry=3

Retry, yalnızca dışa bağımlı uçtan uca testlerde geçici önlem olarak kabul edilebilir; birim katmanında asla. Ve her retry, kayda geçen bir borçtur: üzerinde "neden retry'a ihtiyacımız var?" sorusu cevaplanmamış bir retry, bir sonraki sprintin sessiz hata listesidir. Retry sayısını haftalık raporlarsanız, flaky testlerin gerçek sayısını ilk kez görürsünüz; gizlenen retry, gizlenen hatadır.

Av yöntemi

Flaky avının ilk kuralı, testin tekrarlanabilir ortamda kırılmaya zorlanmasıdır. Aynı testi yüz kez, sıralı ve paralel, farklı saatlerde çalıştırmak çoğu zaman nedeni görünür kılar. Kırılma yakalanamıyorsa ortamı değiştirin: farklı işletim sistemi, farklı saat dilimi, farklı veri büyüklüğü. Flaky test, çoğu zaman koşulların kesişiminde yaşar; tek koşullu ortamda yakalanması zaten zor bir hata, iyi koşul seçimiyle birkaç dakikada görünür olur.

# Tek testi 100 kez koş, ilk kırılmada dur
npx vitest run --repeat=100 --bail=1 yorum-onay.test.ts

İkinci adım, kırılmanın koşullarını sınıflandırmaktır. Saat ve zaman dilimi kullanımı, rastgelelik, sıra bağımlılığı, ağ zaman aşımı, paylaşılan dosya. Her sınıfın bilinen bir tedavisi vardır: sahte saat, sabit seed, izole veri kurulumu, sözleşme testi. Sınıflandırma önemlidir çünkü tedavi yanlış seçilirse semptom değişir, kök neden yerinde kalır. Örneğin saat bağımlılığını "bekleme süresini büyüterek" çözmeye çalışmak, testi yavaşlatır ama gece yarısı saat dilimi değişiminde yine kırar.

Önlemek, avlamaktan ucuz

Flaky test avı, sorunu çözmekten pahalıdır. Önlemek daha ucuzdur: testlerde asla gerçek saate, gerçek ağa, gerçek rastgeleliğe bağlanmayın. Sahte saat kullanın, seed sabitleyin, her teste kendi verisini kurun. Uçtan uca testlerde beklemeleri sabit sürelerle değil, koşulla tanımlayın; sabit sleep bekleme, flaky testin en üretken çiftçisidir.

Ayrıca ekibe bir kural verin: flaky test kaydı açıldığında ya kök neden yazılır ya da test, kayıt kapanana kadar güvenilir kabul edilmez. "Yeniden çalıştır, geçer" cümlesi bir analiz değildir. Bu kuralın arkasında bir kültür vardır: flaky test, geliştiricinin kişisel kusuru değil, ekibin ortak teknik borcudur; kim düzeltirse borç kapanır, kim görmezden gelirse borç faiziyle büyür.

Son söz: flaky test avının amacı avı öldürmek değil, çiftliği kapatmaktır. Semptomu susturmadan önce nedeni bulmak, ekip kırmızıya bakmayı bıraktığında geri dönmesi imkânsız olan yolu engeller.