Skip to content

[Daily Questions Challenge 04]
BDD (Behavior-Driven Development)

BDD,中文為行為驅動開發。它是一種軟體開發方法,核心精神是:先用使用者或業務能理解的語言,描述系統應該有哪些行為,再根據這些行為去設計測試與實作程式。


BDD 常見格式:Given、When、Then

BDD 最常見的寫法是 Given / When / Then

Given 使用者已經登入
When  使用者點擊「加入購物車」按鈕
Then  系統應該將商品加入購物車

三個部分分別代表:

Given:前提條件 描述目前系統或使用者的狀態,例如「使用者已登入」、「商品仍有庫存」。

When:觸發行為 描述使用者或系統做了什麼動作,例如「點擊加入購物車」、「送出付款表單」。

Then:預期結果 描述系統應該產生什麼結果,例如「購物車數量增加」、「顯示錯誤訊息」、「訂單狀態變成已付款」。


BDD vs. TDD

BDD 是 TDD(Test-Driven Development)的延伸。BDD 鼓勵開發者、QA、非技術人員與業務方共同討論預期的軟體行為,並用自然語言撰寫非工程師也能理解的測試案例。

通常 PM 說的是需求,工程師想的是程式邏輯,QA 想的是測試案例,最後大家對同一個功能的理解可能不完全一致。BDD 用自然語言的方式,讓所有成員都可以參與定義驗收標準。

項目TDDBDD
關注重點透過 Test Cases 描述預期行為,再透過紅燈、綠燈、重構的循環驅動設計與實作系統行為是否符合需求
描述方式測試程式碼自然語言情境
主要對象開發者開發者、QA、PM、業務方
常見粒度function、class、module使用者情境、功能流程
核心問題程式這樣寫對不對?使用者做這件事時,系統應該怎麼反應?

BDD vs. SDD

在 AI 輔助開發或 Vibe Coding 的討論中,SDD(Specification-Driven Development)常被用來表示「先寫清楚規格,再讓 AI 或工程師依照規格實作」。

BDD 和 SDD 都可以幫助把需求描述得更精確:BDD 偏向描述「行為故事」,SDD 則偏向定義「規格與技術骨架」,例如系統架構、資料結構、技術選型、開發規範與非功能需求。

項目BDDSDD
核心問題使用者做某件事時,系統應該怎麼反應?系統應該怎麼設計、有哪些規格與限制?
描述重點行為、情境、驗收條件架構、資料格式、API、技術規範
使用語言偏自然語言偏規格文件與技術文件
適合對象PM、QA、工程師、業務方工程師、架構師、AI Coding Agent
常見產出Given / When / Then、Feature、Scenariospec.md、design.md、API 文件、資料結構定義

BDD、TDD、SDD 三者可以一起使用嗎?

可以,而且實務上三者常常是互補的。

一個比較完整的流程可以是:

SDD 定義系統規格與技術限制

BDD 定義使用者情境與驗收條件

TDD 撰寫測試並驅動程式實作

例如開發一個付款功能:

  • SDD 先定義付款 API、資料表、錯誤碼、安全限制。
  • BDD 接著描述使用者付款成功、付款失敗、餘額不足、重複付款等情境。
  • TDD 則針對 payment service、order service、transaction repository 撰寫測試,確保程式邏輯正確。

所以三者不是互斥關係,而是關注層次不同:

SDD:規格與設計層
BDD:行為與驗收層
TDD:程式與測試實作層

GitHub 的開源工具 OpenSpec,雖然本身為撰寫 SDD 的工具,但它產出的規格內容可以自然銜接 BDD 與 TDD:

- Spec / Design / Tasks:偏向 SDD,用來描述規格、設計與實作計畫。
- Acceptance Criteria / Scenario:可以承接 BDD 的情境與驗收條件。
- Test Plan / Test Cases:可以銜接 TDD 或一般自動化測試。

總結

BDD 的重點不是「多寫一種測試格式」,而是讓團隊先釐清:

  • 使用者是誰?
  • 他在什麼情境下做什麼事?
  • 系統應該給出什麼結果?
  • 這個結果是否符合業務價值?

參考