İçeriğe geç

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
Orta
Test piramidi: birim, entegrasyon, e2e

Test 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ın
def 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-test
ASSERTIONS = [
("+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...

İlgili İçerikler