Ünite 9 / 11

Regresyon Testi, Test Bakımı ve Kırılgan Testlerle Mücadele

Kazanimlar:

  • Regresyon testinin amacını kavrayıp yapay zeka ile değişikliğe göre test seçimi ve regresyon vakası üretimi yapabilme
  • Kırılgan testlerin kök nedenlerini (zamanlama, sıra bağımlılığı, paylaşılan durum, dış bağımlılık) teşhis edip semptomu bastırmadan kalıcı çözüm uygulayabilme
  • Regresyon paketini yinelenen testlerden arındırıp hızlı, bağımsız ve güvenilir tutarken sürüm öncesi tam paketi çalıştırma disiplinini koruyabilme

Yazılım durmadan değişir; her yeni özellik, her düzeltme, daha önce çalışan bir şeyi bozabilir. Eskiden çalışan bir işlevin sonradan bozulmasına regresyon (regression — geriye gidiş, önceden düzgün çalışan davranışın bir değişiklikle bozulması) denir. Regresyon testi, bu bozulmaları yakalamak için mevcut işlevleri her değişiklikte yeniden sınamaktır. Zamanla bu test paketleri büyür — binlerce test — ve iki büyük dert başlar: paket yavaşlar ve kırılgan testler (flaky tests — aynı kodda bazen geçip bazen kalan, güvenilmez testler) ekibin test sonuçlarına olan güvenini yok eder. Yapay zeka (YZ), regresyon paketini bakımlı, hızlı ve güvenilir tutmakta güçlü bir yardımcıdır. Ama merkez uyarı geçerli: YZ kırılgan bir testi "geçer hâle getirmeyi" önerirken, çoğu zaman gerçek bir hatayı örten bir yama üretebilir. Sizin işiniz, kararsızlığın kök nedenini bulmaktır, semptomu bastırmayı değil.

Kırılgan testlerin kök nedenleri

Kırılgan test, en sinsi test sorunudur: geçtiğinde de kaldığında da güvenilmezdir, ekibi "herhâlde yine takıldı, tekrar çalıştır" alışkanlığına iter — ve bu alışkanlık bir gün gerçek bir hatayı da "flaky" sanıp görmezden getirir. Başlıca kök nedenler:

  • Zamanlama/yarış (race condition): Test, bir işlemin bitmesini beklemeden sonucu kontrol eder. En yaygın neden.
  • Sıra bağımlılığı: Testler birbirinin bıraktığı veriye bağlı; sıra değişince kırılır.
  • Paylaşılan durum: Aynı test verisini/kullanıcıyı birden çok test kullanır, çakışır.
  • Dış bağımlılık: Gerçek ağ, üçüncü taraf servis, sistem saati, rastgele değer.
  • Ortam farkı: Yerelde geçer, CI'da (sürekli entegrasyon ortamı) kalır.
Dikkat: Kırılgan bir testi "birkaç kez tekrar dene" (retry) ile geçirmek çoğu zaman gerçek bir eşzamanlılık hatasını örter. Retry bir teşhis aracıdır, tedavi değil. Önce kök nedeni bulun; retry'yi ancak nedeni belgelenmiş, gerçekten dış kaynaklı kararsızlıklar için son çare olarak kullanın.

Test bakımı: paketi sağlıklı tutmak

Regresyon paketi bir bahçe gibidir; bakılmazsa yabani otlar sarar. YZ üç bakım işinde yardımcıdır:

1. Yinelenen/gereksiz test temizliği. Zamanla aynı şeyi test eden çok sayıda vaka birikir. YZ, benzer testleri gruplayıp birleştirme önerir.

2. Kırılgan test teşhisi. YZ'ye test kodunu ve kararsızlık desenini verirsiniz; olası kök nedenleri ve kalıcı çözümü önerir.

3. Test seçimi/önceliklendirme. Her değişiklikte tüm paketi çalıştırmak pahalıdır. Test etki analizi (değişen koda göre yalnızca ilgili testleri seçme) ile YZ, hangi testlerin öncelikle çalışması gerektiğini önerir. Yine de sürüm öncesi tam paket şarttır.

Karantina: kırılgan testi doğru yönetmek

Bir testin kırılgan olduğunu tespit ettiniz ama kök nedeni hemen çözecek vaktiniz yok. Ne yapmalı? İki yanlış yol vardır: testi tamamen silmek (o davranış artık hiç korunmaz) veya retry ile susturmak (gerçek hatayı örter). Doğru yol karantinadır (quarantine — kırılgan testi ana paketten geçici olarak ayırıp ayrı bir listede takip etmek). Karantinaya alınan test, sürüm birleştirmesini engellemez ama görünür bir borç olarak kalır ve düzenli olarak ele alınır. Kritik nokta şudur: karantina bir çöp kutusu değil, bir bekleme odasıdır. Karantina listesi büyüyorsa, bu ekibin test sağlığının bozulduğunun bir alarmıdır. YZ, karantina listenizi periyodik olarak inceleyip kök neden kalıplarına göre gruplayabilir; örneğin "bu 6 testin hepsi aynı paylaşılan test kullanıcısına bağlı" gibi ortak nedenleri ortaya çıkararak toplu çözüm imkânı verir.

İpucu: Her karantina kaydına bir "sahip" ve bir "son inceleme tarihi" ekleyin. Sahipsiz karantina, kalıcı çöplüğe dönüşür; hiç kimse ilgilenmediği için kırılgan testler orada sonsuza dek yaşar.

Regresyon stratejisi tablosu

Durum

Strateji

YZ'nin rolü

Küçük düzeltme

Etkilenen alan + duman testi

İlgili testleri seçme

Yeni özellik

İlgili modül + entegrasyon

Yeni regresyon vakası önerme

Büyük refactor

Tam regresyon paketi

Kapsam boşluğu analizi

Sürüm öncesi

Tam paket + keşif

Öncelik ve süre tahmini

Acil canlı düzeltme

Odaklı + kritik yol

Minimum güvenli test seti

Zayıf prompt / Güçlü prompt

Zayıf: "Bu test bazen kalıyor, düzelt."
Güçlü: "Bu test 10 çalıştırmanın 3'ünde kalıyor, kodu değişmedi. Kararsızlığın kök nedenini teşhis et: zamanlama/yarış, sıra bağımlılığı, paylaşılan durum, dış bağımlılık veya ortam farkı olabilir. Her olası nedeni testteki hangi satırın işaret ettiğini göster. Kalıcı çözüm öner; 'retry ekle' gibi semptomu bastıran çözüm ÖNERME — eğer kaçınılmazsa gerekçesini açıkça yaz. Test: [kod]. Hata izi: [log]."

Güçlü prompt; teşhisi kök nedene yöneltir ve semptom bastırmayı açıkça yasaklar.

Dört kopyalanabilir şablon

1) Kırılgan test teşhisi:

Bu test kodu değişmeden bazen geçip bazen kalıyor.Kök neden adaylarını (yarış, sıra bağımlılığı, paylaşılan durum,dış bağımlılık, saat/rastgele, ortam farkı) sırala ve her biriiçin testteki kanıt satırını göster. Kalıcı çözüm öner;retry gibi bastırıcı çözümü son çare olarak ve gerekçeyle işaretle.Test: [kod] / Kararsızlık deseni: [kaç çalıştırmada kaç kez]

2) Regresyon vakası önerme:

Şu değişiklik yapıldı: [değişiklik/PR özeti].Bu değişikliğin bozabileceği MEVCUT davranışları listele ve herbiri için bir regresyon test vakası öner. Özellikle yan etki vepaylaşılan bağımlılık taşıyan alanları vurgula.

3) Yinelenen test temizliği:

Aşağıdaki test paketini incele. Aynı davranışı test eden yinelenenveya birbirini kapsayan vakaları grupla; her grup için hangilerinitutup hangilerini birleştirmemi öner. Kapsam kaybı riski varsa uyar.Testler: [liste/kod]

4) Test etki seçimi:

Şu dosyalar/fonksiyonlar değişti: [liste].Mevcut test paketinden öncelikle çalıştırmam gereken testleri(değişen koda doğrudan/dolaylı bağlı olanlar) seç ve gerekçelendir.Not: sürüm öncesi tam paketi yine de çalıştıracağımı hatırlat.

Üç mini vaka

Vaka 1 — Retry'nin örttüğü gerçek hata. Bir ekip, ara sıra kalan bir ödeme testine 3 retry eklemişti; test artık hep "geçiyordu". "Kırılgan test teşhisi" uygulandığında kararsızlığın gerçek bir yarış koşulundan geldiği görüldü: yüksek yükte ödeme onayı bazen çift işleniyordu. Retry, canlıda gerçek para kaybına yol açabilecek bir hatayı aylarca örtmüştü. Kök neden düzeltildi, retry kaldırıldı.

Vaka 2 — Paket küçüldü, hız arttı. 1.400 testlik bir regresyon paketi 55 dakika sürüyordu. "Yinelenen test temizliği" ile 380 test yinelenen veya kapsanmış çıktı; birleştirildi. Paket 900 teste indi, süre 34 dakikaya düştü, kapsam ölçülebilir biçimde azalmadı. Daha hızlı geri bildirim, ekibi daha sık test etmeye teşvik etti.

Vaka 3 — Sıra bağımlılığı. Bir test yerelde hep geçiyor, CI'da rastgele kalıyordu. YZ teşhisi, testin başka bir testin oluşturduğu kullanıcıya bağlı olduğunu, CI'da testler paralel/farklı sırada koştuğu için kırıldığını gösterdi. Her test kendi verisini kurar hâle getirildi; kararsızlık bitti.

Sık yapılan hatalar

  • Kırılgan testi retry ile susturmak. Kök nedeni aramadan tekrar denemek; gerçek hatayı örtmek.
  • "Yine takıldı" kültürü. Kırmızı sonuçları rutin olarak görmezden gelmek; bir gün gerçek hatayı da atlamak.
  • Paketi hiç budamamak. Yinelenen testlerin birikip paketi yavaşlatmasına izin vermek.
  • Testler arası bağımlılık. Testlerin ortak duruma/sıraya bağlı olması; kararsızlık kaynağı.
  • Yalnızca değişen kısmı test edip tam paketi atlamak. Sürüm öncesi kısayol; gizli yan etkiler kaçar.
  • Dış bağımlılığa dayanmak. Gerçek ağ/saat/rastgele değere bağlı testler; doğal olarak kararsız.

Özetle

Regresyon testi, değişikliklerin önceden çalışan işlevleri bozmasını yakalar; ama paketler büyüdükçe yavaşlık ve kırılgan testler güveni aşındırır. Kırılgan testin kök nedenleri genellikle zamanlama, sıra bağımlılığı, paylaşılan durum ve dış bağımlılıklardır. YZ teşhis, temizlik ve test seçiminde güçlü yardımcıdır; ama kararsızlığı retry ile bastırmak gerçek hataları örter. Kök nedeni bulun, testleri bağımsız ve deterministik kılın, paketi düzenli budayın, sürüm öncesi tam paketi çalıştırın.

Uygulama görevi

Kendi projenizden kırılgan olduğunu bildiğiniz (veya kararsız görünen) bir testi seçin. "Kırılgan test teşhisi" şablonuyla kök neden adaylarını çıkarın ve testteki kanıt satırlarını doğrulayın. Kök nedeni belirleyip retry'siz kalıcı bir çözüm uygulayın. Ardından paketinizden 10 test seçip "yinelenen test temizliği" ile birleştirilebilecekleri bulun. Kaç testin kararsızlığını kök nedeninden çözdüğünüzü ve paketten ne kadar gereksiz vaka çıkardığınızı raporlayın.

Kontrol listesi

  • [ ] Kırılgan testin kök nedenini teşhis ettim; semptomu bastırmadım.
  • [ ] Retry'yi tedavi değil, gerekçeli son çare olarak değerlendirdim.
  • [ ] Testleri bağımsız ve deterministik (dış bağımlılıktan yalıtık) kıldım.
  • [ ] Regresyon paketindeki yinelenen/gereksiz testleri budadım.
  • [ ] Değişikliğe göre test seçtim ama sürüm öncesi tam paketi çalıştırdım.
  • [ ] "Yine takıldı, geç" kültürüne karşı her kırmızıyı ciddiye aldım.