嚴謹 TDD 流程:讀取 gherkin(e2e/specs/*.feature)→ Plan mode 規劃測試 → 建立 Git 分支 → 啟動 Wallaby → Red-Green-Refactor 迴圈 → 重構(JetBrains MCP: get_file_problems, reformat_file, ESLint)→ commit(commitlint)。整合 Wallaby...
本 skill 引導你遵循嚴謹的 TDD 流程進行功能開發,整合 Wallaby MCP 即時測試監控和 JetBrains MCP 程式碼品質檢查。
核心原則:
必備工具:
wallaby_allTests, wallaby_runtimeValues)get_file_problems, reformat_file, rename_refactoring)目標: 分析 gherkin 案例,規劃所有單元測試
執行步驟:
列出所有 gherkin 檔案:
{
"tool": "find_files_by_glob",
"arguments": {
"pattern": "e2e/specs/*.feature"
}
}
讀取未完成的 gherkin 案例(查找 # TODO 或未實作的 scenarios)
進入 Plan Mode 分析該 scenario:
/plan
4. 在 plan mode 中:
- 分析 Given-When-Then 的業務邏輯
- 識別需要的單元測試檔案
- 為每個測試案例規劃:
- 測試描述
- Input 參數
- 預期 Output
- 識別需要 mock 的依賴
5. 將 plan 輸出為結構化格式(詳見 [phases/1-plan.md](phases/1-plan.md))
6. **提交給人類審查**,等待確認後繼續
**輸出範例**:
```markdown
## Gherkin: 使用者可以購買活動票券
### 單元測試計畫
#### 測試檔案: frontend/src/server/services/__tests__/order.test.ts
1. **測試案例**: 成功建立訂單
- Input: { eventId, tickets, customer }
- Expected: { orderId, status: 'pending' }
- Mocks: db.insertOrder, payment.createPaymentIntent
2. **測試案例**: 庫存不足時拋出錯誤
- Input: { quantity: 100 } (超過庫存 10)
- Expected: throw Error('庫存不足')
- Mocks: db.getTicketTypes
...
目標: 根據 Gherkin scenario 建立功能分支,遵循分支命名規範
執行步驟:
檢查當前 Git 狀態:
git status
確保工作目錄乾淨(無未提交變更):
main 分支拉取最新代碼:
git pull origin main
根據 Gherkin scenario 建立分支:
分支命名規則:
A. 功能或 Bug 相關 - 格式: {prefix}/{gherkin-scenario}
從 Gherkin scenario 標題提取關鍵字,轉換為 kebab-case:
# Scenario: 使用者可以購買活動票券
git checkout -b feature/user-can-purchase-event-tickets
# Scenario: 修復結帳頁面顯示錯誤金額
git checkout -b bugfix/fix-checkout-page-incorrect-amount
# Scenario: 緊急修復生產環境登入失敗
git checkout -b hotfix/fix-production-login-failure
# Scenario: 增加單元測試覆蓋率
git checkout -b test/increase-unit-test-coverage
Prefix 選擇指南:
feature/ - 新功能實作bugfix/ - Bug 修復(非緊急)hotfix/ - 緊急 Bug 修復(生產環境)test/ - 測試補充或測試重構B. 非程式碼異動 - 格式: {prefix}/{description}
文件、設定、維護等非 scenario 相關工作:
# 更新專案文件
git checkout -b docs/update-api-documentation
# 專案維護工作
git checkout -b chore/upgrade-dependencies
Prefix 選擇指南:
docs/ - 文件更新chore/ - 維護工作(依賴升級、設定調整等)驗證分支建立成功:
git branch --show-current
分支命名轉換範例:
| Gherkin Scenario 標題 | 分支名稱 | Prefix 原因 |
|---|---|---|
| 使用者可以查看活動詳情 | feature/user-can-view-event-details |
新功能 |
| 管理員可以編輯活動資訊 | feature/admin-can-edit-event-info |
新功能 |
| 修復訂單狀態更新失敗 | bugfix/fix-order-status-update-failure |
Bug 修復 |
| 緊急修復支付流程中斷 | hotfix/fix-payment-process-interruption |
緊急修復 |
| 增加訂單服務測試覆蓋率 | test/increase-order-service-coverage |
測試補充 |
檢查清單:
錯誤處理:
目標: 啟動 Wallaby 即時測試監控
執行步驟:
取得 Wallaby run configuration:
mcp__jetbrains__get_run_configurations()
執行 Wallaby:
mcp__jetbrains__execute_run_configuration('wallaby')
驗證 Wallaby 正常運作:
mcp__wallaby__wallaby_allTests()
預期輸出: 顯示所有測試的執行狀況(passing/failing/pending)
詳細指引請見 phases/3-wallaby-setup.md
目標: 寫一個必須失敗的測試
嚴格規則:
執行步驟:
mcp__wallaby__wallaby_failingTests()
詳細指引請見 phases/4-red.md
目標: 用最少的程式碼讓測試通過
嚴格規則:
執行步驟:
mcp__wallaby__wallaby_allTests()
wallaby_runtimeValues 除錯:mcp__wallaby__wallaby_runtimeValues(file, line, lineContent, expression)
詳細指引請見 phases/5-green.md
目標: 改善程式碼品質,同時保持測試通過
執行步驟:
git status
確認哪些檔案被修改,是否需要重構
Loop Iteration:
1️⃣ 檢查問題 (get_file_problems)
# 取得異動檔案(透過 git status)
git status --short
處理新增檔案:
# 如果有 ?? (Untracked files),先 git add
git add <new-files>
逐一檢查每個異動檔案:
mcp__jetbrains__get_file_problems(file, errorsOnly: false)
2️⃣ 格式化 (reformat_file)
mcp__jetbrains__reformat_file(file)
3️⃣ ESLint 檢查
npm run lint -w frontend
npx eslint --fix <file>
4️⃣ 驗證測試仍通過
mcp__wallaby__wallaby_allTests()
5️⃣ 重複
get_file_problems 無問題 + ESLint 通過 + 測試全綠rename_refactoring)詳細指引請見 phases/6-refactor.md
目標: 提交乾淨的 commit,符合 commitlint 規範
執行步驟:
確認所有測試通過:
mcp__wallaby__wallaby_allTests()
查看異動:
git status
git diff
Stage 檔案:
git add <files>
撰寫 commit message(符合 Conventional Commits):
git commit -m "$(cat <<'EOF'
<type>(<scope>): <description>
<body>
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
EOF
)"
Type 規則:
test: 新增或修改測試feat: 新增功能refactor: 重構程式碼Push:
git push origin <branch-name>
處理 Git Hooks 失敗:
判斷方式: 檢查 git hook 錯誤訊息中是否包含測試失敗關鍵字(test failed, FAIL, Error:, Vitest/Playwright 錯誤)
詳細指引請見 phases/7-commit.md
判斷:
CRITICAL: Gherkin scenario 的完成不只是「測試執行通過」,必須確保 所有 BDD step 實作都已完成。
執行步驟:
讀取對應的 step definitions 檔案:
# 找出對應的 steps 檔案
ls e2e/tests/bdd-steps/*.steps.ts
檢查是否有未實作的 stub: // 使用 search_in_files_by_text or search_in_files_by_regex 搜尋 stub 註解 // AI 內部呼叫的 MCP 參數
{
"tool": "search_in_files_by_text",
"arguments": {
"text": "// Stub",
"include": "e2e/tests/bdd-steps/**"
}
}
分析檢查結果:
🔴 未完成(需繼續實作):
// ❌ 發現 stub 實作
When('I view the event {string}', async (_eventTitle: string) => {
// Stub: open event detail page in Phase 3.
});
🟢 已完成:
// ✅ 有完整實作
When('I view the event {string}', async (eventTitle: string) => {
const page = pageFixture.page;
await page.goto(`/events/${eventTitle}`);
await page.locator('h1').waitFor({state: 'visible'});
});
如果發現 stub,進入實作流程:
檢查清單:
e2e/tests/bdd-steps/**.steps.ts 檔案// Stub: 註解只有在 7.1 確認所有 step 實作完成後,才執行 BDD 測試:
npm run test:bdd -w e2e -- --name "<scenario name>"
預期結果:
如果測試失敗:
完整完成條件(所有項目必須全部符合):
下一步:
詳細紀律守則請見 rules/tdd-discipline.md
wallaby_allTests() - 取得所有測試狀況wallaby_failingTests() - 取得失敗的測試wallaby_runtimeValues(file, line, lineContent, expression) - 除錯變數值wallaby_coveredLinesForFile(file) - 取得程式碼覆蓋率詳見 mcp-tools/wallaby-reference.md
get_file_problems(filePath, errorsOnly) - 取得檔案問題reformat_file(path) - 格式化檔案rename_refactoring(pathInProject, symbolName, newName) - 重命名重構get_symbol_info(filePath, line, column) - 取得 function 說明詳見 mcp-tools/jetbrains-reference.md
詳見 examples/gherkin-to-tests.md
判斷失敗類型:
檢查錯誤訊息
# Git hook 失敗後,查看錯誤輸出
git commit # 如果失敗,會顯示 pre-commit hook 錯誤
測試失敗 - 回到 TDD 迴圈(Step 4)
識別關鍵字:
FAIL (Vitest 測試失敗)test failed (測試失敗訊息)Error: 搭配測試檔案路徑FAILED (Playwright 失敗)X failed (X 個測試失敗)處理步驟:
品質問題 - 進入重構迴圈(Step 6)
識別關鍵字:
ESLint 錯誤TypeScript type errorsFormatting 問題Warning (非測試相關)處理步驟:
execute_run_configurationwallaby_runtimeValues 檢查變數值wallaby_failingTests 取得詳細錯誤訊息