Flaky Test
Kararsız test
- Okunuşu
- fleyki test
Kısaca
Flaky test, koda hiçbir değişiklik yapılmadan bazen geçen bazen başarısız olan ve sonuçlarına güvenmeyi zorlaştıran otomatik bir testtir.
Flaky test nedir?
Flaky test, ne kod ne de test değişmiş olsa bile farklı çalıştırmalarda farklı sonuçlar verir. Dokuz kez geçip onuncuda başarısız olabilir; bu da bir başarısızlığın gerçek bir hataya mı yoksa yalnızca şanssızlığa mı işaret ettiğini anlamayı zorlaştırır.
Kararsızlık genellikle belirsizlikten (nondeterminism) kaynaklanır; yani testteki bir şey her çalıştırmada aynı değildir. Yaygın nedenler arasında asenkron koddaki zamanlama sorunları ve yarış koşulları (race condition), bazen çok kısa kalan sabit sleep çağrıları, birbirinin artık verisine ya da çalışma sırasına bağlı testler, gerçek ağ çağrıları, rastgele değerler ve geçerli tarih ya da saat dilimi sayılabilir. Uçtan uca testler tarayıcıları, ağları ve pek çok hareketli parçayı içerdiği için özellikle kararsızlığa yatkındır.
Flaky test, rastgele çalan bir duman dedektörüne benzer: birkaç yanlış alarmdan sonra gerçek bir yangın çıksa bile insanlar tepki vermeyi bırakır. Hatları rastgele başarısız olan ekiplerde de aynısı olur; geliştiriciler yeniden çalıştır düğmesine tıklamayı öğrenir ve gerçek hatalar gözden kaçar.
Çözüm, rastgeleliğin kaynağını bulup ortadan kaldırmaktır: sabit bir süre yerine belirli bir koşulu bekleyin, her testten önce veriyi sıfırlayın, saati ve harici servisleri mock'layın ve rastgele sayı üreteçlerine sabit bir seed verin. Pek çok ekip, incelerken kararsız bir testi geçici olarak zorunlu test takımının dışına taşıyarak karantinaya alır. Otomatik yeniden denemeler belirtiyi gizleyebilir, ama nedeni çözmez.
Önemli noktalar
- Flaky test, kod değişmeden rastgele geçer ve başarısız olur.
- Yaygın nedenler zamanlama sorunları, paylaşılan durum, test sırası, ağ çağrıları ve tarihlerdir.
- Flaky testler tüm test takımına olan güveni aşındırır.
- Otomatik yeniden denemelere güvenmek yerine asıl nedeni düzeltin.
Örnek
// Flaky: assumes the data always arrives within 100 ms
test("shows the user's name", async () => {
loadUser();
await sleep(100);
expect(getPageText()).toContain("Ada");
});
// Stable: waits for the actual condition, up to a timeout
test("shows the user's name", async () => {
loadUser();
await waitFor(() => expect(getPageText()).toContain("Ada"));
});Sık sorulan sorular
Flaky testlere ne sebep olur?
En yaygın nedenler asenkron koddaki zamanlama sorunları, veriyi paylaşan ya da çalışma sırasına bağlı testler, gerçek ağlara ya da servislere yapılan çağrılar ve rastgele değerlere veya geçerli zamana bağımlılıktır. Her çalıştırmada aynı olmayan herhangi bir şey bir testi kararsız hâle getirebilir.
Flaky testleri sadece yeniden denemek yeterli mi?
Yeniden denemeler kısa vadede hattın akmasını sağlayabilir, ancak sorunu gizler ve kodunuzdaki gerçek aralıklı hataları maskeleyebilir. Flaky testleri takip edin, gerekirse karantinaya alın ve asıl nedeni düzeltin.
İlgili sayfalar
- Uçtan Uca TestTest ve Kalite, s. 35Uçtan uca test, kullanıcı arayüzünden veritabanına ve geri dönüşe kadar tam bir kullanıcı yolculuğunu uygulamanın tamamında çalıştıran otomatik bir testtir.
- Entegrasyon TestiTest ve Kalite, s. 7Entegrasyon testi, kod, veritabanı ve API gibi bir sistemin birkaç parçasının birlikte doğru çalışıp çalışmadığını kontrol eden otomatik bir testtir.
- MockingTest ve Kalite, s. 16Mocking, kodu yalıtılmış biçimde test etmek için veritabanı ya da API gibi gerçek bir bağımlılığı kontrol ettiğiniz bir sahteyle değiştiren test tekniğidir.
- EşzamanlılıkProgramlamanın Temelleri, s. 19Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- Async/AwaitProgramlamanın Temelleri, s. 2Async/await, asenkron kodu sıradan adım adım kod gibi okunur biçimde yazmayı sağlayan, her await'te bir promise ya da görev bitene dek duran sözdizimidir.
- CI/CDDevOps ve Bulut, s. 9CI/CD, kod değişikliklerini sık sık derleyen, test eden ve yayınlayan otomatik pratikler bütünüdür; yazılım kullanıcılara hızlı ve güvenli biçimde ulaşır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin