TD
測試驅動開發(TDD)工作流程 - 實作前必須參考
Install
mkdir -p .claude/skills/tdd-isbrian && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/15615" && unzip -o skill.zip -d .claude/skills/tdd-isbrian && rm skill.zipInstalls to .claude/skills/tdd-isbrian
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
測試驅動開發(TDD)工作流程 - 實作前必須參考25 charsno explicit “when” trigger
About this skill
[!IMPORTANT] 通訊規範:在執行此技能的過程中,所有與用戶的溝通及回覆均必須使用「繁體中文」。
測試驅動開發 (TDD)
鐵律
沒有測試,禁止編寫正式程式碼
在寫測試前先寫了程式碼?刪掉它,然後重新開始。
Red-Green-Refactor 循環
flowchart LR
RED[🔴 RED<br/>撰寫必將失敗的測試] --> VERIFY_RED{確認失敗}
VERIFY_RED -->|正確失敗| GREEN[🟢 GREEN<br/>編寫最簡代碼]
VERIFY_RED -->|錯誤失敗| RED
GREEN --> VERIFY_GREEN{確認通過}
VERIFY_GREEN -->|全部通過| REFACTOR[🔵 REFACTOR<br/>代碼重構]
VERIFY_GREEN -->|失敗| GREEN
REFACTOR --> NEXT[下一個測試]
NEXT --> RED
階段詳情
🔴 RED - 撰寫必將失敗的測試
每次只測試一個行為:
public function test_rejects_empty_email(): void
{
$result = $this->validator->validate(['email' => '']);
$this->assertFalse($result->isValid());
$this->assertEquals('Email required', $result->getError());
}
要求:
- 只有一個行為
- 明確的命名
- 使用真實程式碼(模擬 Mock 最少化)
確認:目擊失敗
npm run test # 或 phpunit
確認事項:
- 測試失敗(而非編譯錯誤)
- 錯誤訊息符合預期
- 確實是因為功能未實作而失敗(而非拼寫錯誤等)
🟢 GREEN - 編寫最簡代碼
編寫能讓測試通過的最少代碼:
public function validate(array $data): ValidationResult
{
if (empty($data['email'])) {
return new ValidationResult(false, 'Email required');
}
return new ValidationResult(true);
}
禁止事項:
- 添加額外功能
- 在此階段重構其他代碼
- 做超過測試要求的任何事
確認:目擊通過
npm run test
確認事項:
- 測試通過
- 舊有的其他測試依然通過
🔵 REFACTOR - 重構清理
僅在 GREEN 改完後進行:
- 消除重複
- 改善命名
- 提取輔助函數
確保測試始終保持綠燈狀態。
常見藉口與現實
| 藉口 | 現實 |
|---|---|
| 「太簡單了不需要測試」 | 簡單的程式碼也會壞。寫測試只要 30 秒。 |
| 「稍後再補測試」 | 補寫已過測試毫無意義。 |
| 「我手動測試過了」 | 隨機測試 ≠ 系統化。無法重複執行。 |
| 「TDD 會變慢」 | TDD 比除錯快得多。 |
驗證檢查清單
作業完成前確認:
- 所有新函數/方法都有對應測試
- 確認每個測試在實作前確實失敗過
- 每個測試的失敗原因都符合預期
- 使用最小量的代碼使測試通過
- 所有測試均通過
- 涵蓋了邊界情況與錯誤處理
無法全部勾選?說明你跳過了 TDD,請重新開始。
相關工作流程
/run-tests- 執行測試/systematic-debugging- 遭遇 Bug 時/verification- 完成前驗證