Test Yazma, TDD ve Coverage Stratejileri
Claude'la test yazmanın akışı: birim, entegrasyon, property-based, snapshot. Coverage hedefleri ve hangi testleri yazmamak.
Şükrü Yusuf KAYA
12 dakikalık okuma
OrtaTest Piramidi (Hâlâ) Doğru
▲ ▲ ▲ e2e (~5%) ▲ ▲ entegrasyon (~25%) ▲ ▲ birim (~70%) ▲ ▲ ─────────
Claude'a test yazdırmadan önce hangi seviyede test gerektiğini sen belirle.
Tek bir fonksiyonun saf davranışını test eder. Dış efekt yok. Hızlı çalışır.
def test_normalize_phone_tr_format(): assert normalize_phone("+90 (555) 123-45-67") == "+90 555 123 45 67"
İdeal kapsama: %70-90 satır kapsama.
Claude'a Test Yazdırma Şablonu#
text
<role>Kıdemli test mühendisi.</role> <framework>pytest + hypothesis</framework> <unit_under_test>{{kaynak_kod}}</unit_under_test> <spec>{{davranış_kuralları}}</spec> <task>- 6-10 birim test üret.- Mutlaka happy path + 3 edge + 1 hata yolu.- Hypothesis ile en az 1 property-based test ekle.- Test isimleri: test_<function>_<senaryo>.</task> <output_format>- Tek dosya, modüler- Pytest fixture'ları kullan- Yorumda her testin amacı tek satırda</output_format>Test üretim prompt'u şablonu.
Coverage tek başına yalan söyler
%100 satır kapsama, davranışın doğru olduğunu göstermez. Ne testi yazıldığı kadar hangi davranışın test edildiği önemlidir. Snapshot ile şişen kapsama ölçütlerine kanma.
python
# Hızlı pytest mock setup — gerçek pytest'i ayrı çalıştırırsındef normalize_phone(raw, default_country="TR"): import re if not raw or not isinstance(raw, str): return None digits = re.sub(r"[^0-9]", "", raw) if len(digits) == 10 and digits.startswith("5"): digits = "90" + digits elif len(digits) == 11 and digits.startswith("0"): digits = "90" + digits[1:] elif len(digits) == 12 and digits.startswith("90"): pass else: return None return f"+{digits[:2]} {digits[2:5]} {digits[5:8]} {digits[8:10]} {digits[10:]}" # 6 mini-testASSERTIONS = [ ("+90 (555) 123-45-67", "+90 555 123 45 67"), ("905551234567", "+90 555 123 45 67"), ("05551234567", "+90 555 123 45 67"), ("", None), ("hello", None), (None, None),]for inp, exp in ASSERTIONS: got = normalize_phone(inp) print(f"{str(inp)!r:25} → {got!r:25} {'✅' if got == exp else '❌'}")6 mini test — pytest'e taşırsan idempotent kalır.
Boşluk doldur · text
Test piramidinde tabanı _____ , ortası _____ , tepesi _____ testlerdir. Property-based testler _____ ifade eder ve çerçeve rastgele girdi üretir.Sık Sorulan Sorular
Geçici prototip kodu, deneysel notebook çıktıları, throwaway script'ler. Yine de fonksiyon imzası kalıcılaşırsa test eklemeyi unutma.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...