Test piramidi nedir? Unit, integration ve end-to-end testler arasındaki farklar nelerdir?

Cevap

Test piramidi, Mike Cohn'un ortaya koyduğu bir modeldir: tabanda çok sayıda hızlı unit test, ortada daha az integration test, tepede az sayıda yavaş end-to-end (E2E) test bulunmalıdır. Yukarı çıktıkça testler gerçekçiliği artar ama yavaşlar, kırılganlaşır ve bakım maliyeti yükselir.

UnitIntegrationEnd-to-end
KapsamTek fonksiyon veya sınıfBirkaç bileşen veya gerçek DB/kuyrukTüm sistem, kullanıcı gözünden
HızMilisaniyeSaniyeSaniyeler-dakikalar
BağımlılıklarMock/stubGerçek veya container (Testcontainers)Gerçek ortam, tarayıcı
Hata bulduğundaSorunun yeri netBileşenler arası uyumsuzluk"Bir yer bozuk", bulmak zor
AraçlarJUnit, pytest, Jest, xUnitTestcontainers, Spring Boot Test, SupertestPlaywright, Cypress, Selenium

Örnek (pytest)

# Unit: saf iş kuralı, bağımlılık yok
def calculate_discount(total, is_member):
    return total * 0.9 if is_member and total > 100 else total

def test_member_discount():
    assert calculate_discount(200, True) == 180

def test_no_discount_under_threshold():
    assert calculate_discount(50, True) == 50

# Unit + mock: dış servis taklit edilir
from unittest.mock import Mock

def test_order_sends_email():
    mailer = Mock()
    OrderService(mailer=mailer).place(order_id=1)
    mailer.send.assert_called_once()

Test double türleri

  • Stub: sabit cevap döner.
  • Mock: çağrıların nasıl yapıldığını doğrular.
  • Fake: basit ama çalışan bir implementasyon (bellek içi veritabanı).
  • Spy: gerçek nesneyi sarıp çağrıları kaydeder.

Anti-pattern: dondurma külahı (ice cream cone)

Az unit test, çok manuel ve E2E testi. Sonuç: yavaş CI, rastgele kırılan (flaky) testler ve geliştiricilerin testlere güvenmemesi.

Modern görüş

Kent C. Dodds'un testing trophy modeli, özellikle frontend'de integration testlere daha fazla ağırlık verir. Önemli olan oranlar değil, testlerin hızlı geri bildirim verip gerçek hataları yakalamasıdır. Code coverage yüzdesi tek başına kalite göstergesi değildir; %100 coverage ile anlamsız assert'ler yazılabilir.

  1. Testi olmayan büyük bir legacy kod tabanında değişiklik yapmanız gerekiyor. Nasıl ilerlersiniz?ZorYazılım Geliştirme SüreçleriYazılım Müh.
  2. Semantic Versioning (SemVer) nedir? 2.4.1 sürümündeki her sayı neyi ifade eder?KolayYazılım Geliştirme SüreçleriYazılım Müh.
  3. Teknik borç (technical debt) nedir? Ekipte teknik borcu nasıl yönetir ve iş tarafına nasıl anlatırsınız?ZorYazılım Geliştirme SüreçleriYazılım Müh.
  4. CI/CD nedir? Continuous delivery ile continuous deployment arasındaki fark nedir? Tipik bir pipeline'da hangi adımlar olur?OrtaYazılım Geliştirme SüreçleriYazılım Müh.
  5. TDD (Test-Driven Development) nedir? Red-Green-Refactor döngüsünü bir örnekle anlatın.OrtaYazılım Geliştirme SüreçleriYazılım Müh.
  6. Code review'da nelere dikkat edersiniz? İyi bir pull request nasıl hazırlanır?OrtaYazılım Geliştirme SüreçleriYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle