Herhangi bir feature ya da bugfix uygulamaya başlamadan önce kullanın.
cd ~/.claude/skills
git clone https://github.com/obra/superpowers.git superpowers mkdir -p ~/.claude/skills/test-driven-development
curl -fsSL https://raw.githubusercontent.com/obra/superpowers/HEAD/skills/test-driven-development/SKILL.md \
-o ~/.claude/skills/test-driven-development/SKILL.md Önce testi yazın. Başarısız olduğunu görün. Minimal kod yazarak geçirin.
Temel ilke: Testi başarısız olduğunu görmediyseniz, doğru şeyi test edip etmediğinizi bilemezsiniz.
Kuralların harfini ihlal etmek, ruhunu ihlal etmektir.
Her Zaman:
İstisnalar (insan ortağınıza sorun):
"Sadece bu kez TDD'yi atla" diye düşünüyor musunuz? Durun. Bu rasyonalizasyondur.
BAŞARIŞIZ BİR TEST OLMADAN ÜRETİM KODU YAZMA
Testen önce kod yazıldı mı? Sil. Baştan başla.
Hiçbir istisna:
Testlerden temiz başla. Nokta.
digraph tdd_cycle {
rankdir=LR;
red [label="RED\nBaşarısız test yaz", shape=box, style=filled, fillcolor="#ffcccc"];
verify_red [label="Başarısızlığı\ndoğrula", shape=diamond];
green [label="GREEN\nMinimal kod", shape=box, style=filled, fillcolor="#ccffcc"];
verify_green [label="Başarısını doğrula\nHepsi yeşil", shape=diamond];
refactor [label="REFACTOR\nTemizle", shape=box, style=filled, fillcolor="#ccccff"];
next [label="Sonraki", shape=ellipse];
red -> verify_red;
verify_red -> green [label="evet"];
verify_red -> red [label="yanlış\nbaşarısızlık"];
green -> verify_green;
verify_green -> refactor [label="evet"];
verify_green -> green [label="hayır"];
refactor -> verify_green [label="yeşil\nkalmak"];
verify_green -> next;
next -> red;
}
Ne olması gerektiğini gösteren minimal bir test yazın.
const result = await retryOperation(operation);
expect(result).toBe('success'); expect(attempts).toBe(3); });
Açık ad, gerçek davranış, bir şey
</Good>
<Bad>
```typescript
test('retry works', async () => {
const mock = jest.fn()
.mockRejectedValueOnce(new Error())
.mockRejectedValueOnce(new Error())
.mockResolvedValueOnce('success');
await retryOperation(mock);
expect(mock).toHaveBeenCalledTimes(3);
});
Belirsiz ad, mock'u test eder, kodu değil
Gereksinimler:
ZORUNLU. Hiçbir zaman atlamayın.
npm test path/to/test.test.ts
Doğrulayın:
Test geçti mi? Var olan davranışı test ediyorsunuz. Testi düzeltin.
Test hata verdi mi? Hatayı düzeltin, doğru başarısızlığa kadar yeniden çalıştırın.
Testi geçmek için en basit kodu yazın.
Özellik eklemeyin, diğer kodu refactor etmeyin veya testin ötesine "iyileştirme" yapmayın.
ZORUNLU.
npm test path/to/test.test.ts
Doğrulayın:
Test başarısız mı? Kodu düzeltin, testi değil.
Diğer testler başarısız mı? Şimdi düzeltin.
Sadece green'den sonra:
Testleri yeşil tutun. Davranış eklemeyin.
Sonraki özellik için sonraki başarısız test.
| Kalite | İyi | Kötü |
|---|---|---|
| Minimal | Bir şey. Adında "ve" var mı? Ayırın. | test('validates email and domain and whitespace') |
| Açık | Ad davranışı açıklar | test('test1') |
| Niyeti göster | İstenilen API'yi gösterir | Kodun ne yapması gerektiğini gizler |
"Çalıştığını doğrulamak için sonra testleri yazarım"
Koddan sonra yazılan testler hemen geçer. Hemen geçmek hiçbir şey kanıtlamaz:
Testin önce yazılması, testi başarısız görmesi ile gerçekten bir şeyi test ettiğini kanıtlarsınız.
"Zaten tüm kenar durumları manuel olarak test ettim"
Manuel test geçicidir. Her şeyi test ettiğinizi düşünürsünüz ama:
Otoomatik testler sistematiktir. Her seferinde aynı şekilde çalışırlar.
"X saat çalışma silmek israftır"
Gömülü maliyet safsatası. Zaman zaten geçti. Şimdi seçiminiz:
"İsraf" güvenilmez kodu tutmaktır. Gerçek testler olmayan çalışan kod teknik borçtur.
"TDD dogmatik, pragmatik olmak uyarlamayı demektir"
TDD pragmatiktir:
"Pragmatik" kısayollar = üretimde hata ayıklama = daha yavaş.
"Sonra testler aynı hedeflere ulaşır - ruh içinde, ritüel değil"
Hayır. Sonra testler "bu ne yapar?" sorusunu cevaplar. Önce testler "bu ne yapmalı?" sorusunu cevaplar.
Sonra testler uygulamanız tarafından önyargılı. Yaptığınız şeyi test edersiniz, gerekli olanı değil. Hatırlanan kenar durumlarını, keşfedilenleri değil doğrularsınız.
Testler-önce kenar durumu keşfini uygulama öncesinde zorlar. Testler-sonra hatırlattığınız her şeyi doğrular (doğru olmadınız).
30 dakika sonra test ≠ TDD. Kapsam elde edersiniz, testlerin çalıştığını kanıtlamayı kaybedersiniz.
| Bahane | Gerçek |
|---|---|
| "Çok basit test etmek için" | Basit kod kırılır. Test 30 saniye sürer. |
| "Sonra test ederim" | Testler hemen geçmek hiçbir şey kanıtlamaz. |
| "Sonra testler aynı hedeflere ulaşır" | Testler-sonra = "bu ne yapar?" Testler-önce = "bu ne yapmalı?" |
| "Zaten manuel test ettim" | Geçici ≠ sistematik. Kayıt yok, yeniden çalıştıramazsınız. |
| "X saat silmek israftır" | Gömülü maliyet safsatası. Doğrulanmamış kodu tutmak teknik borçtur. |
| "Referans olarak tut, testleri önce yaz" | Bunu uyarlayacaksınız. Bu testleri sonra yazmaktır. Sil demek sil demektir. |
| "Önce keşfetmem lazım" | Tamam. Keşfi at, TDD ile başla. |
| "Test zor = tasarım net değil" | Teste dinle. Test zor = kullanmak zor. |
| "TDD beni yavaşlatacak" | TDD hata ayıklamadan hızlıdır. Pragmatik = testler-önce. |
| "Manuel test daha hızlı" | Manuel kenar durumları kanıtlamaz. Her değişikliği yeniden test edeceksiniz. |
| "Var olan kodun testleri yok" | Bunu iyileştiriyorsunuz. Var olan kod için testler ekleyin. |
Tümü şu anlama gelir: Kodu silin. TDD ile baştan başlayın.
Hata: Boş email kabul edildi
RED
test('rejects empty email', async () => {
const result = await submitForm({ email: '' });
expect(result.error).toBe('Email required');
});
RED'i Doğrula
$ npm test
FAIL: expected 'Email required', got undefined
GREEN
function submitForm(data: FormData) {
if (!data.email?.trim()) {
return { error: 'Email required' };
}
// ...
}
GREEN'i Doğrula
$ npm test
PASS
REFACTOR Gerekirse birden çok alan için validation çıkarın.
İş tamamlandı olarak işaretlemeden önce:
Tüm kutuları işaretleyemedi misiniz? TDD'yi atladınız. Baştan başlayın.
| Problem | Çözüm |
|---|---|
| Test etme hakkında bilmiyorum | Umut edilen API'yi yazın. Assertion'ı önce yazın. İnsan ortağınıza sorun. |
| Test çok karışık | Tasarım çok karışık. Arayüzü basitleştirin. |
| Her şeyi mock etmek gerekir | Kod çok kuplajlı. Bağımlılık injection kullanın. |
| Test kurulumu çok büyük | Yardımcılar çıkarın. Hala karışık? Tasarımı basitleştirin. |
Hata bulundu mu? Bunu yeniden oluşturan başarısız test yazın. TDD döngüsünü izleyin. Test düzeltmeyi kanıtlar ve regresyonu engeller.
Hiçbir zaman testleri olmadan hataları düzeltmeyin.
Mock'lar veya test yardımcıları eklerken, yaygın tuzakları önlemek için testing-anti-patterns.md oku:
Üretim kodu → test var ve önce başarısız oldu
Aksi takdirde → TDD değil
İnsan ortağınızın izni olmadan hiçbir istisna.
2 veya daha fazla bağımsız görevin paralel olarak yürütülebileceği ve aralarında state paylaşımı ya da sıralı bağımlılık olmadığı durumlarda kullanın.
Ayrı bir oturumda inceleme kontrol noktaları ile yürütülecek yazılı bir uygulama planınız olduğunda kullanın.
Mevcut oturumda bağımsız görevlerle uygulama planlarını yürütürken kullanın
Herhangi bir hata, test başarısızlığı veya beklenmeyen davranışla karşılaştığınızda, çözüm önerisi sunmadan önce kullanın.
Yeni beceriler oluştururken, mevcut becerileri düzenlerken veya dağıtımdan önce becerileri doğrularken kullanın.
Claude API / Anthropic SDK için referans — model kimlikleri, fiyatlandırma, parametreler, streaming, tool use, MCP, agents, caching, token sayma ve model migration hakkında bilgiler içerir. ÖNEMLİ — hedef dosyayı açmadan önce okuyun; Claude/Anthropic ile ilgili herhangi bir isim geçtiğinde (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*` vb.) bu referansı atlayın.