test-driven-developmentlisted
Install: claude install-skill shumingyang-opencode/superpowers-zh-tw
# 測試驅動開發(TDD)
## 總覽
先寫測試。看著它失敗。寫最少的程式碼讓它通過。
**核心原則:** 如果你沒親眼看到測試失敗,你就不知道它測試的是不是對的東西。
**違反規則的字面,就是違反規則的精神。**
## 使用時機
**一律使用:**
- 新功能
- 修 bug
- 重構
- 行為變更
**例外(問你的真人夥伴):**
- 用完即丟的原型
- 產生的程式碼
- 設定檔
心裡想「這次就跳過 TDD 吧」?停。那就是合理化藉口。
## 鐵律
```
沒有先寫失敗的測試,就不准有正式程式碼
```
在測試之前先寫了程式碼?刪掉。重新開始。
**沒有例外:**
- 不要把它留著當「參考」
- 不要邊寫測試邊「改寫」它
- 不要看它
- 刪掉就是刪掉
從測試開始全新實作。就這樣。
## 紅-綠-重構
```dot
digraph tdd_cycle {
rankdir=LR;
red [label="RED\nWrite failing test", shape=box, style=filled, fillcolor="#ffcccc"];
verify_red [label="Verify fails\ncorrectly", shape=diamond];
green [label="GREEN\nMinimal code", shape=box, style=filled, fillcolor="#ccffcc"];
verify_green [label="Verify passes\nAll green", shape=diamond];
refactor [label="REFACTOR\nClean up", shape=box, style=filled, fillcolor="#ccccff"];
next [label="Next", shape=ellipse];
red -> verify_red;
verify_red -> green [label="yes"];
verify_red -> red [label="wrong\nfailure"];
green -> verify_green;
verify_green -> refactor [label="yes"];
verify_green -> green [label="no"];
refactor -> verify_green [label="stay\ngreen"];
verify_green -> next;
next -> red;
}
```
### 紅 - 寫失敗的測試
寫一支最小的測試,顯示應該發生什麼事。
<Good>
```typescript
test('retries failed operations 3 times', async () => {
let attempts = 0;
const operation = () => {
attempts++;
if (attempts < 3) throw new Error('fail');
return 'success';
};
const result = await retryOperation(operation);
expect(result).t