一键导入
bdd-practices
Cucumber/Gherkin BDD 最佳實踐指導技能,提供 Gherkin 撰寫規範、情境設計原則、Discovery Workshop 引導與常見反模式識別,協助團隊撰寫高品質的行為驅動開發規格。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Cucumber/Gherkin BDD 最佳實踐指導技能,提供 Gherkin 撰寫規範、情境設計原則、Discovery Workshop 引導與常見反模式識別,協助團隊撰寫高品質的行為驅動開發規格。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
API 開發流程引導技能,協助開發者選擇合適的開發流程(API First 或 Code First),並提供 OpenAPI 規格管理、程式碼產生等自動化支援。
BDD 測試實作技能,協助開發者使用 Reqnroll 撰寫行為驅動開發測試,包含 Gherkin 語法、測試步驟實作與 Docker 測試環境設定。
EF Core 操作與最佳化技能,協助開發者正確使用 Entity Framework Core,包含 DbContextFactory 模式、查詢最佳化、Migration 管理與反向工程。
錯誤處理與 Result Pattern 技能,協助開發者實作統一的錯誤處理機制,包含 Result Pattern 應用、Failure 物件建立與分層錯誤處理策略。
Handler 業務邏輯層實作技能,協助開發者實作符合專案規範的 Handler,包含業務邏輯處理、流程協調、Result Pattern 錯誤處理與跨 Repository 操作。
中介軟體實作技能,協助開發者實作符合專案規範的中介軟體,包含 TraceContext 管理、Exception Handling、Request Logging 與管線配置。
| name | bdd-practices |
| description | Cucumber/Gherkin BDD 最佳實踐指導技能,提供 Gherkin 撰寫規範、情境設計原則、Discovery Workshop 引導與常見反模式識別,協助團隊撰寫高品質的行為驅動開發規格。 |
Cucumber/Gherkin BDD 最佳實踐指導技能,整合 Cucumber 官方文件與業界專家經驗,提供完整的 BDD 實踐指引,包含 Discovery、Formulation、Automation 三階段最佳實踐,協助團隊撰寫易讀、易維護的行為規格。
"軟體系統建構中最困難的部分是精確決定要建構什麼。" - Fred Brooks
目的:透過結構化對話建立共識,減少需求誤解
工作坊方法:
工作坊原則:
產出:
目的:將範例結構化為可執行文件,建立共同語言
撰寫原則:
# ✅ 良好範例 - 宣告式(Declarative)
Feature: 訂閱者根據訂閱等級看到不同文章
Scenario: 免費訂閱者只能看到免費文章
Given Free Frieda 擁有免費訂閱
When Free Frieda 使用有效憑證登入
Then 她看到一篇免費文章
# ❌ 不良範例 - 命令式(Imperative)
Feature: 訂閱者根據訂閱等級看到不同文章
Scenario: 免費訂閱者只能看到免費文章
Given 使用者在登入頁面
When 我在 Email 欄位輸入 "free@example.com"
And 我在密碼欄位輸入 "password123"
And 我按下「送出」按鈕
Then 我在首頁看到 "FreeArticle1"
關鍵差異:
目的:用自動化範例引導開發,建立安全網
實踐方式:
把讀者當作你希望被對待的方式。撰寫 Gherkin 時,讓不了解功能的人能夠理解它。
一個情境,一個行為!
# ❌ 錯誤:步驟順序混亂
Scenario: 錯誤的步驟順序
Given 初始狀態
When 執行動作
Then 驗證結果
When 再執行動作 # ❌ When 不能跟在 Then 後面
Then 再驗證結果
# ✅ 正確:拆分成兩個情境
Scenario: 第一個行為
Given 初始狀態
When 執行第一個動作
Then 驗證第一個結果
Scenario: 第二個行為
Given 初始狀態
When 執行第二個動作
Then 驗證第二個結果
# ✅ 正確:一律使用現在式 + 第三人稱
Given Google 首頁已顯示
When 使用者在搜尋列輸入 "panda"
Then 顯示與 "panda" 相關的連結
# ❌ 錯誤:混合時態和人稱
Given 使用者導航到 Google 首頁 # ❌ 暗示動作,不是狀態
When 使用者輸入了 "panda" # ❌ 過去式
Then 將會顯示 "panda" 相關連結 # ❌ 未來式
# ✅ 正確:完整的主詞述詞結構
Given 使用者導航到 Google 首頁
When 使用者在搜尋列輸入 "panda"
Then 結果頁面顯示與 "panda" 相關的連結
And 結果頁面顯示 "panda" 的圖片連結
And 結果頁面顯示 "panda" 的影片連結
# ❌ 錯誤:缺少主詞或述詞
Given 使用者導航到 Google 首頁
When 使用者在搜尋列輸入 "panda"
Then 結果頁面顯示與 "panda" 相關的連結
And "panda" 的圖片連結 # ❌ 缺少主詞和述詞
And "panda" 的影片連結 # ❌ 無法複用
# ❌ 錯誤:將傳統測試步驟套用 BDD 關鍵字
Feature: Google 搜尋
Scenario: Google 圖片搜尋顯示圖片
Given 使用者開啟網頁瀏覽器
And 使用者導航到 "https://www.google.com/"
When 使用者在搜尋列輸入 "panda"
Then 結果頁面顯示與 "panda" 相關的連結
When 使用者點擊頂部的「圖片」連結 # ❌ 出現第二個 When-Then
Then 結果頁面顯示與 "panda" 相關的圖片
# ✅ 正確:每個情境一個行為
Feature: Google 搜尋
Scenario: 從搜尋列搜尋
Given 網頁瀏覽器位於 Google 首頁
When 使用者在搜尋列輸入 "panda"
Then 顯示與 "panda" 相關的連結
Scenario: 圖片搜尋
Given 顯示 "panda" 的 Google 搜尋結果
When 使用者點擊頂部的「圖片」連結
Then 顯示與 "panda" 相關的圖片
# ❌ 錯誤:過度描述實作細節
Scenario: 使用者登入
Given 我訪問 "/login"
When 我在 "使用者名稱" 欄位輸入 "Bob"
And 我在 "密碼" 欄位輸入 "tester"
And 我按下 "登入" 按鈕
Then 我應該看到 "歡迎" 頁面
# ✅ 正確:宣告式描述行為
Scenario: 使用者登入
Given Bob 是註冊使用者
When Bob 使用有效憑證登入
Then Bob 看到歡迎頁面
# ❌ 錯誤:過多不必要的變化
Scenario Outline: 搜尋
Given 使用者在搜尋頁面
When 使用者搜尋 "<query>"
Then 顯示與 "<query>" 相關的結果
Examples:
| query |
| panda |
| elephant | # ❌ 未增加測試價值
| tiger | # ❌ 等價類重複
| lion | # ❌ 浪費執行時間
# ✅ 正確:聚焦於有意義的變化
Scenario Outline: 不同訂閱等級的存取權限
Given <user> 擁有 <subscription> 訂閱
When <user> 登入
Then <user> 可存取 <accessible> 文章
Examples:
| user | subscription | accessible |
| Free | 免費 | 免費文章 |
| Basic | 基本付費 | 免費和付費文章 |
| Pro | 專業付費 | 所有文章 |
# ❌ 錯誤:硬編碼可能變更的資料
Scenario: Google 搜尋建議
When 使用者搜尋 "panda"
Then 顯示以下相關結果
| 相關搜尋 |
| Panda Express | # ❌ 如果企業倒閉會失敗
| 大貓熊 |
| panda 影片 |
# ✅ 正確:防禦性驗證
Scenario: Google 搜尋建議
When 使用者搜尋 "panda"
Then 顯示與 "panda" 相關的連結
And 每個結果包含 "panda" 關鍵字
功能需求屬於特性,程序屬於實作細節
# ✅ 功能需求(描述「做什麼」)
When Bob 登入
# ❌ 程序參考(描述「怎麼做」)
Given 我訪問 "/login"
When 我在 "user name" 欄位輸入 "Bob"
And 我在 "password" 欄位輸入 "tester"
And 我按下 "login" 按鈕
Then 我應該看到 "welcome" 頁面
問自己:「如果實作改變,這個措辭需要改變嗎?」
# 命令式 - 8 步
When 使用者將滑鼠捲動到搜尋列
And 使用者點擊搜尋列
And 使用者輸入字母 "p"
And 使用者輸入字母 "a"
And 使用者輸入字母 "n"
And 使用者輸入字母 "d"
And 使用者輸入字母 "a"
And 使用者按下 ENTER 鍵
# 宣告式 - 1 步
When 使用者在搜尋列輸入 "panda"
# ❌ 暴露所有細節
Given 使用者擁有 Email "user@example.com"
And 使用者擁有姓名 "張三"
And 使用者擁有電話 "0912345678"
When 使用者註冊
# ✅ 隱藏在步驟定義中
Given 張三是新使用者
When 張三使用有效資料註冊
使用 Scenario Outline 時,問自己以下問題:
# ✅ 良好標題
Scenario: 免費會員只能看到免費內容
Scenario: 付費會員可存取進階功能
Scenario: 搜尋結果依相關性排序
# ❌ 不良標題
Scenario: 測試 1
Scenario: 檢查權限
Scenario: 驗證 API 端點回應
# ❌ 硬編碼驗證
Then 結果包含 "Panda Express"
# ✅ 模式驗證
Then 每個結果與搜尋詞 "panda" 相關
Scenario: 搜尋結果連結
Given 顯示 "panda" 的 Google 搜尋結果
When 使用者點擊第一個結果連結 # 未明確命名連結值
Then 顯示所選結果連結的頁面 # 步驟定義傳遞連結資料
# ✅ 一致的風格
Feature: 使用者認證
Scenario: 成功登入
Given 使用者擁有有效帳號
When 使用者輸入正確憑證
Then 使用者看到儀表板
# ❌ 不一致的風格
Feature: 使用者認證
Scenario: 成功登入
Given 我有一個帳號 # ❌ 第一人稱
When 使用者輸入了憑證 # ❌ 過去式
Then 將會顯示儀表板 # ❌ 未來式
當使用者尋求協助時,依循以下流程:
Q1: 這個 User Story 的主要使用者是誰?
Q2: 使用者想達成什麼目的?
Q3: 有哪些規則或約束?
Q4: 你能舉一個具體的例子嗎?
Q5: 有沒有邊界情況或例外?
檢查清單:
□ 情境是否描述行為而非實作?
□ 是否使用宣告式而非命令式?
□ 每個情境是否只涵蓋一個行為?
□ 步驟是否依照 Given-When-Then 順序?
□ 是否使用第三人稱現在式?
□ 標題是否清晰簡潔?
掃描以下反模式:
- [ ] 多個 When-Then 配對
- [ ] UI 實作細節(按鈕、欄位、URL)
- [ ] 硬編碼可能變更的資料
- [ ] 過長的情境(>10 步)
- [ ] 過度使用 Scenario Outline
### 🔴 發現問題
[描述問題]
### ❌ 原始版本
```gherkin
[原始 Gherkin]
[解釋為什麼這是問題]
[修正後 Gherkin]
[解釋為什麼這樣更好]
## 參考資源
### 官方文件
- [Cucumber BDD 文件](https://cucumber.io/docs/bdd/)
- [Gherkin 參考](https://cucumber.io/docs/gherkin/reference/)
- [Better Gherkin](https://cucumber.io/docs/bdd/better-gherkin/)
- [Discovery Workshop](https://cucumber.io/docs/bdd/discovery-workshop/)
### 最佳實踐文章
- [Automation Panda - BDD 101: Writing Good Gherkin](https://automationpanda.com/2017/01/30/bdd-101-writing-good-gherkin/)
- [Should Gherkin Steps Use First-Person or Third-Person?](https://automationpanda.com/2017/01/18/should-gherkin-steps-use-first-person-or-third-person/)
- [Good Gherkin Scenario Titles](https://automationpanda.com/2018/01/31/good-gherkin-scenario-titles/)
## 使用範例
### 請求範例 1:審查情境
使用者:請審查這個 Gherkin 情境: Scenario: 使用者登入 When 我訪問登入頁面 And 我輸入帳號密碼 Then 我看到首頁
助手:[使用修正建議範本提供回饋]
### 請求範例 2:引導 Discovery
使用者:我們要開發「購物車結帳」功能,但不確定如何開始
助手:[使用 Discovery 階段協助流程引導]
### 請求範例 3:轉換傳統測試
使用者:如何將這個傳統測試轉換為 BDD 情境? [傳統測試步驟]
助手:[識別行為、拆分情境、轉換為宣告式 Gherkin]
## 注意事項
- 永遠優先考慮**可讀性**而非簡潔性
- 記住受眾包含**非技術人員**
- Gherkin 是**溝通工具**,不只是測試
- 保持**行為驅動思維**,避免程序驅動
- 持續**重構**情境,如同重構程式碼