TDD (Test-Driven Development) nedir? Red-Green-Refactor döngüsünü bir örnekle anlatın.
Cevap
TDD, kodu yazmadan önce o kodun davranışını tanımlayan başarısız bir test yazdığınız bir geliştirme disiplinidir. Kent Beck tarafından popülerleştirilmiştir ve üç adımlık kısa bir döngüyle ilerler:
- Red: istenen davranış için küçük bir test yaz; çalıştır ve başarısız olduğunu gör.
- Green: testi geçirecek en basit kodu yaz.
- Refactor: testler yeşilken kodu (ve testleri) temizle, tekrarları kaldır.
Örnek: FizzBuzz benzeri bir kural
Red:
def test_returns_number_as_string():
assert fizzbuzz(1) == "1"fizzbuzz tanımlı değil, test kırmızı.
Green:
def fizzbuzz(n):
return str(n)Red (yeni davranış):
def test_multiple_of_three_returns_fizz():
assert fizzbuzz(3) == "Fizz"Green:
def fizzbuzz(n):
if n % 3 == 0:
return "Fizz"
return str(n)Ardından 5 ve 15 için testler eklenir; her adımda kod biraz genelleşir. Refactor aşamasında kurallar bir listeye taşınabilir.
Faydaları
- Test edilebilir, küçük ve gevşek bağlı (loosely coupled) tasarımı zorlar.
- Refactoring için güvenlik ağı oluşturur.
- Gereksinimi kod yazmadan önce netleştirmeye iter.
- Hata ayıklama süresini azaltır; bir şey bozulduğunda son birkaç dakikadaki değişiklik suçludur.
Eleştiriler ve sınırlamalar
- Keşif aşamasındaki prototiplerde veya belirsiz UI işlerinde yavaşlatabilir.
- Uygulama detayına bağlı testler (aşırı mock kullanımı) refactoring'i zorlaştırabilir; davranışı test edin, implementasyonu değil.
- Disiplin ister; ekipte sadece bir kişi uygularsa fayda sınırlı kalır.
İlişkili kavramlar
- BDD (Behavior-Driven Development): testleri iş diliyle yazar (Given-When-Then, Cucumber/Gherkin).
- ATDD: kabul kriterlerini önce test olarak yazmak.
İlgili Yazılım Geliştirme Süreçleri soruları
- Testi olmayan büyük bir legacy kod tabanında değişiklik yapmanız gerekiyor. Nasıl ilerlersiniz?
- Semantic Versioning (SemVer) nedir? 2.4.1 sürümündeki her sayı neyi ifade eder?
- Teknik borç (technical debt) nedir? Ekipte teknik borcu nasıl yönetir ve iş tarafına nasıl anlatırsınız?
- CI/CD nedir? Continuous delivery ile continuous deployment arasındaki fark nedir? Tipik bir pipeline'da hangi adımlar olur?
- Test piramidi nedir? Unit, integration ve end-to-end testler arasındaki farklar nelerdir?
- Code review'da nelere dikkat edersiniz? İyi bir pull request nasıl hazırlanır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.