Kararsız Testler — Kod Değişmedi, Test Neden Bir Kırmızı Bir Yeşil?
Önce şunu oku: Test Piramidi, JUnit 5 ve Mockito
30 saniyede özet
Aynı kodla bazen geçen bazen kırılan test, ekibin testlere olan güvenini yer. Sebep neredeyse her zaman dört yerden biridir: saat, sıra, paylaşılan durum, beklemek. Tekrar deneme kırmızıyı gizler; sebebi bulup kapatmak gerekir.
Bir kafede oturuyorsun ve masa arada bir sallanıyor. Altına katlanmış bir peçete koyarsın, sallanma durur. Ama yarın başka biri aynı masaya oturduğunda kısa ayak hâlâ orada olacak.
-
Bayt: CI kırmızı. Ama bu sabah hiçbir şeye dokunmadım!
-
Sen: 'Tekrar çalıştır'a bas. Geçer.
-
Bayt: Geçti! Tamam, birleştiriyorum.
-
Bayt: Ama dün de böyle olmuştu. Testlerimiz bize artık doğruyu söylemiyor olabilir mi?
Neden bazen kırılır?
flakyKod değişmediği hâlde bazen geçen bazen kalan test. Verdiği bilgiyi yok eder: artık "geçti" ne anlama geliyor bilmezsin.Sebebi neredeyse her zaman üç şeyden biridir: paylaşılan durum, zamanlama (sabit bekleme), ya da test sırası bağımlılığı. Retry eklemek semptomu gizler ve bazen üründeki gerçek bir yarış durumunu örter.Sözlükte gör →, aynı kodla bazen geçen bazen kırılan testtir. Kod değişmediyse, değişen şey testin dışarıdan aldığı bir şeydir.
En sık dört şey: o anki saat, garanti edilmeyen bir sıra (örneğin HashSet), başka bir testin bıraktığı durum ve “100 milisaniye yeter” diye konan bir bekleme.
Kafam karıştı, daha basit anlat
Kod değişmediyse, testin dışarıdan aldığı bir şey değişmiştir: saat, sıra, başka testin bıraktığı durum ya da bekleme süresi.
Kararsız (flaky) test nedir?
Kod değişmediği hâlde test kırıldıysa ne değişmiş olabilir?
Her sebebin kendi ilacı
CI'da kırılan testleri bir kez otomatik tekrar deneyen bir ayar açtık. On koşunun hepsi yeşil. Testler artık güvenilir mi? Cevabı göster
Hayır. Sebeplerin hiçbiri değişmedi; yalnızca kırmızıyı artık görmüyorsun. Aynı ayar, ara sıra ortaya çıkan gerçek bir hatayı da yeşile çevirir.
Adım adım oku
- Masa bazen sallanıyor, bazen sallanmıyor.
- Altına peçete: bugünlük durdu.
- Ama kısa ayak hâlâ orada.
- Sebebi bul, ayağı düzelt.
Saati koda bir Clock olarak ver; testte sabit bir saat kullan. Sırası garanti olmayan bir koleksiyonu sırasız karşılaştır.
Her teste taze bir durum ver; buna test yalıtımıHer testin kendi taze durumuyla başlaması; bir testin sonucu başka bir testin bıraktığı veriye ya da çalışma sırasına bağlı olmaz.Sözlükte gör → denir. Asenkron işi sabit süre bekleme; koşul gerçekleşene kadar kısa aralıklarla sor.
Kafam karıştı, daha basit anlat
Sabit saat, sırasız karşılaştırma, her teste taze durum, süre yerine koşul.
LocalDate.now() kullanan bir test gece yarısı kırılıyor. En iyi çözüm nedir?
Asenkron bir işin bitmesini beklemek için hangisi doğrudur?
Kendin gör
Aynı kod, on CI koşusu
Tohum 678486| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|
| faizBugünHesaplanır | |||||||||
| hesapListesiDöner | |||||||||
| havaleKaydedilir | |||||||||
| ekstreGönderilir | |||||||||
| ibanDoğrulanır | |||||||||
✕ kırmızı koşu: 0/0 · ↻ gizlenen kırılma: 0 · ✓ geçti, ✕ kırıldı, ↻ tekrar denemede geçti
Şu an ne oldu?
Kod hiç değişmiyor
Aynı test seti 10 kez koşuyor. Kırmızı her koşu, düzeltilmemiş bir sebebi gösterir.
Görevler0/3
Bütün koşular yeşil olsun ama hiçbir sebep düzelmesinaçık
İpucu
Tekrar deneme.
Yalnızca 7. koşu kırmızı kalsınaçık
İpucu
Saat dışındaki her şeyi düzelt.
Tekrar deneme olmadan on koşunun hepsi yeşil olsunaçık
İpucu
Dört sebebi de kapat.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Kod hiç değişmeden on koşudan sekizi kırmızı. Hangi testin hangi koşuda kırıldığına bak.
- Yalnızca “tekrar dene”yi aç. On koşunun hepsi yeşil, ama sekiz kırılma gizlendi.
- Tekrar denemeyi kapat, saat dışında her şeyi düzelt. Yalnızca 7. koşu kırmızı: gece yarısı.
- Dördünü de düzelt. On koşu yeşil, hiçbir şey tekrar denenmedi.
Otomatik tekrar deneme açıldı, on koşu da yeşil. Ne olmuştur?
Bir test yalnızca başka bir testten sonra çalışınca kırılıyor. Sebep büyük ihtimalle nedir?
Tuzaklar
Kararsız testi silmek ya da kapatmak. Test bir şeyi koruyordu. Önce sebebini bul; gerekiyorsa kısa süreliğine karantinaya al ama bir sahibi ve bir tarihi olsun.
Yerelde hep geçtiği için CI’ı suçlamak. CI makinesi daha yavaş, saat dilimi farklı, testler başka sırada. Bu farklar sebebi gösterir.
Testleri hep aynı sırada çalıştırmak. Paylaşılan durum gizli kalır. Sırayı karıştırınca sorun erken ve tekrarlanabilir şekilde ortaya çıkar.
Kafam karıştı, daha basit anlat
Silme, sebebini bul. CI’daki fark bir ipucudur. Sırayı karıştır, gizli bağımlılık ortaya çıksın.
HashSet'ten gelen elemanları bir listeyle containsExactly ile karşılaştıran test neden kararsızdır?
Derinleş · Faiz ve ekstre testleri: kararsızlığın dört ilacı 4 dosya · ~53 satır · ilk okumada atlayabilirsin
Kendini sına
Kod değişmediyse kırılan test mutlaka CI'ın hatasıdır.
Testleri her koşuda karışık sırada çalıştırmanın faydası nedir?
Aklında kalacak üç şey
- 1 Kararsız bir testin her zaman bir sebebi vardır. En sık dört sebep: o anki saat, garanti edilmeyen bir sıra, testler arasında paylaşılan durum ve sabit süre beklemek.
- 2 Her sebebin kendi ilacı var: saati enjekte et, sırasız karşılaştır, her teste taze durum ver, süre yerine koşulu bekle.
- 3 Tekrar deneme kırmızıyı yeşile çevirir ama sebebi bırakır. Gerçek bir hata da aynı şekilde gizlenebilir.
4 kart sonraki derste seni bekliyor