AI x BDD 規格驅動全自動化開發術 - (3): 一個 Prompt 讓 AI 自己寫測試、自己寫程式!
規格驅動開發最重要的就是「情境導向的全自動化開發」。 這一篇,我要直接帶你動手操作,讓你親眼看到 AI 是如何根據 Feature file 全自動完成開發的。
前兩篇文章中,我們已經學會了兩件事:
- 實例化需求 (SBE):用情境案例來定義需求,而不是模糊的自然語言
- 可執行規格 (Executable Specification):用 Gherkin 語法撰寫 Feature file,讓規格變成可以執行的測試
現在你手上已經有一份完整的 Feature file,裡面列舉了所有情境的 Given / When / Then。
那接下來呢?
難道我們還要自己一個一個去實作測試步驟(Step Definitions)?然後再自己去寫 production code?
不!在 AI 時代,這些通通不需要了。
這一篇,我要直接帶你動手操作,讓你親眼看到 AI 是如何根據 Feature file 全自動完成開發的。
不講理論了,直接上手吧!
步驟 1:感受一下 AI x BDD 軟體全自動化開發的基本運作
好,現在讓我們來感受一下,當你有了一份完整的 Feature file 之後,AI 能幫你做到什麼程度。
下載範例專案:訂單優惠模組
首先,請下載這個 Github 目錄(訂單優惠模組)下的所有檔案。
你可以用 git clone 的方式:
git clone https://github.com/SDD-TW/SDD.tw-Examples
cd SDD.tw-Examples/入會任務/訂單優惠模組
這個專案包含了:
- order.feature:前兩篇文章提到的「電商訂單優惠」的完整 Feature file
- ERD.png:實體關係圖,定義了資料模型
- OOD.png:物件導向設計圖,提供設計參考
- BDD.prompt:預先寫好的 BDD 開發 Prompt
沒錯,就是我們前面講的那些情境實例:
- 單一商品無優惠 (Single product without promotions)
- 滿額折扣 (Threshold discount)
- 買一送一(不同商品)(Buy-one-get-one - multiple products)
- 買一送一(相同商品)(Buy-one-get-one - same product twice)
- 買一送一(與其他類別混合)(Buy-one-get-one - mixed categories)
- 滿額折扣 + 買一送一同時套用 (Multiple promotions stacked)
現在,我們要讓 AI 把這些情境全部實作出來。
本文使用 Python + Behave 技術堆來示範。
準備你的 AI Assistant
開啟你的 AI 開發工具,可以是:
- Cursor
- Windsurf
- Claude Code
- 或任何支援對話式 AI coding 的工具
然後,在專案目錄下準備執行我們提供的 BDD Prompt。
執行 BDD Prompt
在專案目錄下,把底下這段 Prompt 貼給你的 AI Assistant:
# Task
請你嚴格遵照「行為驅動開發 (BDD)」的方式,來完成 @order.feature 中所有驗收情境的開發。
不可同時進行 BDD 開發流程中多個步驟也不能略過任何一步驟,必須一步一步扎實執行並確認每一步的結果。
# Context
## Design Guideline
- 參考 entities ERD: @ERD.png 以及 OOD 設計圖:@OOD.png 。兩張圖中所指示的類別屬性及操作只是基準,你可視情況增加新的類別、屬性或行為。
## Tech Stack
1. Language Env:Python 3.11+
2. BDD Test framework: Behave
3. Native test framework: pytest
## Application Environment
1. App 類型:純模組程式碼
2. 此 feature file 中的所有優惠邏輯存放至 OrderService 類別中
3. Source code root: src/
4. Feature files 位置: features/
5. Step definitions 位置: features/steps/
# BDD 開發流程
1. 先建置出 behave walking skeleton - 可順利運行 behave 以及至少一個 scenario,確認至少有一個 test case 被測試框架執行到。
2. 嚴格遵守 BDD 以及最小增量原則來開發所有程式碼,針對所有 scenario,一次開發一個 scenario,依序進行:
A. 一次選擇一個 scenario 實作,除此 scenario 之外的測試全部都用 @skip 標記忽略。撰寫此 scenario 對應的 Steps (given, when, then)、開啟相關類別,但是每個類別的行為都不實作,並且執行測試,確認測試失敗 (test fail),並且測試失敗的原因並非框架層級的錯誤,而是期望的「值」上的錯誤。嚴格確認這步驟完成後才能進行下一步的實作。
B. 為了通過上一步所撰寫的測試程式碼,請實作相關類別所需的程式碼,並確認能讓所有的測試程式碼都通過。請嚴格確認有執行到測試程式碼,從 test report 中覆述一次目前 test passed 的數量。
C. 遵守 clean code 原則,思考是否要重構每個類別的內部程式碼,如果必要重構的話,在重構完成之後,再執行一次測試,確保所有測試仍然通過,否則需修正邏輯直到測試全數通過。
這個 Prompt 的關鍵設計思維是什麼?
我們用「結果導向」的方式,只告訴 AI 要遵守 BDD 流程,以及參考 Feature file 和設計圖,其他的全部交給 AI 自己決定。
你沒有告訴 AI 要怎麼寫程式碼,也沒有告訴 AI 要怎麼實作優惠邏輯。
你只是告訴 AI:
- 嚴格遵照 BDD 方式開發
- 先建置 Cucumber walking skeleton(確保測試框架能運作)
- 一次開發一個 scenario
- 紅燈(寫測試)→ 綠燈(寫實作)→ 重構
- 不可略過任何步驟
剩下的,我們就交給 AI 自行測試驅動開發、自行搞定。
開始執行:體驗 AI x BDD
現在,在你的 AI Assistant 中執行你選擇的 Prompt。
這是本文最關鍵的部分,你要親自執行,親眼看到 AI 如何工作唷~
根據 BDD Prompt 的指示,AI 會一步一步完成開發流程。整個過程可能需要 10-20 分鐘,取決於你使用的 AI 模型。
預期 AI 會進行的執行流程:
-
建立專案結構
- AI 會建立 Python 專案,設定 Behave + pytest 環境
- 建立
src/目錄存放 production code - 建立
features/目錄存放 feature file 和 step definitions
-
讀取並理解需求
- AI 會讀取
order.feature,理解六個情境 - AI 會參考
ERD.png和OOD.png來設計類別結構
- AI 會讀取
-
逐一完成每個情境
- 選擇一個 Scenario(其他標記為
@skip) - 寫測試步驟(Step Definitions)→ 紅燈
- 寫實作(OrderService 等)→ 綠燈
- 重構(如果需要)
- 確認測試通過後,進入下一個 Scenario
- 選擇一個 Scenario(其他標記為
-
完成所有情境
- 所有六個情境的測試都通過
- AI 會覆述測試報告
實際執行結果
執行完成後,你會看到類似這樣的總結輸出:
(以下是 Claude Code 的執行範例)
## Summary
I have successfully completed all 6 scenarios in the order.feature file using strict BDD methodology:
### Results
- ✅ 1 feature passed
- ✅ 6 scenarios passed
- ✅ 25 steps passed
- ✅ 0 failures
### Implementation Details
**Entities Created:**
- `Product`: name, unit_price, category
- `OrderItem`: product, quantity
- `Order`: items, total_amount, original_amount, discount
- `OrderService`: Main business logic for checkout and promotions
- `Promotion` (base class)
- `ThresholdDiscountPromotion`: threshold, discount
- `BuyOneGetOnePromotion`: category
**Key Business Rules Implemented:**
1. Basic order calculation without promotions
2. Threshold discount (e.g., spend 1000, get 100 off)
3. Buy-one-get-one promotion for specific categories
4. Multiple promotions can stack
All code follows clean code principles with clear naming, single responsibility, and no duplication.
你可以執行 behave 指令來確認所有測試都通過:
behave --no-capture
輸出會顯示每個情境的執行細節:
@order_pricing
Feature: E-commerce Order Pricing Promotions
As a shopper
I want the system to calculate my order total with applicable promotions
So that I can understand how much to pay and what items I will receive
Scenario: Single product without promotions
Given no promotions are applied
When a customer places an order with:
| productName | quantity | unitPrice |
| T-shirt | 1 | 500 |
Then the order summary should be:
| totalAmount |
| 500 |
And the customer should receive:
| productName | quantity |
| T-shirt | 1 |
Scenario: Threshold discount applies when subtotal reaches 1000
Given the threshold discount promotion is configured:
| threshold | discount |
| 1000 | 100 |
When a customer places an order with:
| productName | quantity | unitPrice |
| T-shirt | 2 | 500 |
| 褲子 | 1 | 600 |
Then the order summary should be:
| originalAmount | discount | totalAmount |
| 1600 | 100 | 1500 |
And the customer should receive:
| productName | quantity |
| T-shirt | 2 |
| 褲子 | 1 |
# ... 其他情境
1 feature passed, 0 failed, 0 skipped
6 scenarios passed, 0 failed, 0 skipped
25 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.001s
AI 自動生成的檔案結構
AI 會自動建立以下完整的專案結構:
.
├── features/
│ ├── __init__.py
│ ├── order.feature # Feature 檔案
│ └── steps/
│ ├── __init__.py
│ └── order_steps.py # Step definitions
└── src/
├── __init__.py
├── product.py # 產品模型
├── order_item.py # 訂單項目模型
├── order.py # 訂單模型
├── promotion.py # 促銷模型(包含各種促銷類別)
└── order_service.py # 訂單服務(包含促銷邏輯)
各位軟工夥伴,你要觀察的重點大概是底下這些:
- AI 如何從 Feature file 中提取資訊
- AI 如何設計類別結構(Order, OrderItem, Promotion, OrderService 等)
- AI 如何實作不同的優惠邏輯(threshold discount, buy-one-get-one)
- AI 如何處理多重優惠疊加的複雜規則
然後,你也要特別關注,完成後你會得到什麼:
- 完整的測試步驟程式碼(Step Definitions)
- 完整的 production code(OrderService, Order, Promotion 等)
- 所有測試通過的綠燈報告
- 一個能正確計算訂單優惠的系統
感受「結果導向」的開發方式
看到這裡,你應該能感受到了:
這就是所謂的「結果導向」開發方法。
你只需要用 Feature file 這類 scenario-based 的格式來訂定極其清楚的系統行為預期結果,接著全部交給 AI 就行了。
基本上,你會慢慢地不再需要:
- 自己寫測試步驟
- 自己寫 OrderService 的邏輯
- 自己處理滿額折扣的計算
- 自己處理買一送一的邏輯
- 自己處理多重優惠疊加的複雜規則
那麼,身為軟體工程師的我們只需要做什麼呢?
那麼,身為軟體工程師的我們只需要做什麼呢?
很重要:只需要檢查一下測試程式碼有沒有寫對就好。
這部分對 AI 來說通常最簡單,因為「測試步驟」就是把 Feature file 中的描述翻譯成程式碼而已。
你只要快速對照一下值的部分沒錯就好:
- Given 的資料有沒有正確建立?
- When 的操作有沒有正確執行?
- Then 的驗證有沒有正確比對?
整個測試程式碼的意圖是否符合產品該情境的意圖?
至於 production code 的實作細節?不怎麼需要去看!
因為測試會幫你確保程式碼是否滿足「功能性需求」。只要測試通過,代表 AI 寫的 production code 就是符合規格中的「功能性需求」的,也就是功能至少都照著驗收條件進行啦!
那當然你可以稍微喵一下 production code 有沒有什麼愚蠢的設計問題,如果你是使用推理模型來實作業務邏輯程式碼的話,基本上不會有太大的問題。如果設計上有問題,那通常代表你的 Scenario 寫得不夠多,這部分符合測試驅動開發的初衷——用更多測試情境來驅動出更長久、成熟卻高效益的設計,不多不少,剛剛好滿足功能情境。
這就是「結果導向」的威力:我們不在乎 AI 怎麼寫程式碼,我們只在乎結果對不對。
步驟 2:迭代下一個 User Story——雙十一優惠
好,剛才你已經看到 AI 如何根據 Feature file 全自動完成開發了。
但那是我們幫你準備好的範例專案。
現在,輪到你自己動手了!
新需求來了:雙十一優惠
想像一下,你正在負責電商系統的開發,突然 PM 丟了一個新需求給你:
「欸,下個月要搞雙十一活動,老闆說要來個特別的優惠!規則是這樣的⋯⋯」
規則如下:
如果啟動了雙十一優惠活動,則訂單享有底下優惠規則:
- 同一種商品每買 10 件,則該 10 件同種商品的價格總和會享有 20% 的折扣
聽起來有點複雜?沒關係,PM 很貼心地給了你三個範例:
範例一:購買 12 件襪子
購買 12 件要價 100 元的襪子,則訂單總價為:
- 前 10 件:10 × 100 × 80% = 800 元
- 剩餘 2 件:2 × 100 = 200 元
- 總價:1000 元
範例二:購買 27 件襪子
購買 27 件要價 100 元的襪子,則訂單總價為:
- 第 1 個 10 件:10 × 100 × 80% = 800 元
- 第 2 個 10 件:10 × 100 × 80% = 800 元
- 剩餘 7 件:7 × 100 = 700 元
- 總價:2300 元
範例三:購買 10 件不同商品
購買商品 A, B, C, D, E, F, G, H, I, J 各一件(總共十件商品),每一件價格皆為 100 元,則訂單總價為:
- 10 件不同商品:10 × 100 = 1000 元
- 總價:1000 元(沒有折扣,因為並非同一種商品)
好,需求清楚了吧?
現在,在傳統開發方式下,你會怎麼做?
你可能會:
- 打開 OrderService 的程式碼
- 開始思考要怎麼實作這個邏輯
- 寫一堆 if-else 判斷
- 寫一堆迴圈來計算折扣
- 寫測試來驗證
- Debug 到天荒地老
但在 AI x BDD 的開發方式下,你完全不需要這樣做。
練習:將需求轉換成 Feature file
現在,請你自己動手,將上述優惠規則寫成 Feature file。
記得,每個範例都是一道情境(Scenario),需要用 Given / When / Then 的格式來描述。
這裡給你一些提示:
Scenario 標題
每個 Scenario 要有清楚的情境描述,好比:
Feature 雙十一優惠
Scenario: 雙十一優惠 - 購買 12 件相同商品
...
Scenario: 雙十一優惠 - 購買 27 件相同商品
...
Scenario: 雙十一優惠 - 購買 10 件不同商品
...
現在,試著把三個範例都寫成完整的 Scenario 吧!
如果你不確定怎麼寫,可以參考前兩篇文章中的 Feature file 範例,或是參考步驟 1 中下載的專案裡的 order.feature。
練習:用 BDD Prompt 讓 AI 實作
當你寫好 Feature file 之後,接下來就是見證奇蹟的時刻了。
請在你的專案目錄下,再次執行步驟 1 中的 BDD Prompt。
然後,就讓 AI 開始工作吧!
重點來了:你不需要去想怎麼實作這個邏輯,不需要去改既有的 OrderService 程式碼,只要寫好 Feature file,AI 就會自己搞定一切。
AI 會:
- 讀入你新增的雙十一優惠情境
- 撰寫對應的測試步驟(如果需要新的步驟)
- 修改 OrderService 來支援雙十一優惠邏輯
- 一個一個情境地完成測試
- 確保之前的六個情境測試也還是通過的
你只要坐著,看 AI 工作就好囉~這段時間當然可以去運動啊,什麼的...。
觀察結果:測試全部通過了嗎?
當 AI 完成工作之後,你會看到 AI 的總結報告:
## BDD Development Complete - Summary Report
### Test Results
**ALL SCENARIOS PASSING!**
- **1 feature passed**, 0 failed, 0 skipped
- **9 scenarios passed**, 0 failed, 0 skipped
- **37 steps passed**, 0 failed, 0 skipped, 0 undefined
### Scenarios Implemented
1. ✅ Single product without promotions
2. ✅ Threshold discount
3. ✅ Buy-one-get-one (multiple products)
4. ✅ Buy-one-get-one (same product twice)
5. ✅ Buy-one-get-one (mixed categories)
6. ✅ Multiple promotions stacked
7. ✅ Double Eleven (12 items)
8. ✅ Double Eleven (27 items)
9. ✅ Double Eleven (10 items)
執行 behave 指令可以看到詳細的測試結果:
behave --no-capture
1 feature passed, 0 failed, 0 skipped
9 scenarios passed, 0 failed, 0 skipped
37 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.001s
讓我們來驗證結果:
1. 所有新增的雙十一優惠情境測試都通過了
三個範例情境:
- 購買 12 件襪子 → 總價 1000 元 ✅
- 購買 27 件襪子 → 總價 2300 元 ✅
- 購買 10 件不同商品 → 總價 1000 元(無折扣)✅
2. 之前的六個訂單優惠情境測試也還是通過的
這很重要!這代表新功能沒有破壞舊功能。
- 單一商品無優惠 ✅
- 滿額折扣 ✅
- 買一送一(不同商品)✅
- 買一送一(相同商品)✅
- 買一送一(與其他類別混合)✅
- 滿額折扣 + 買一送一同時套用 ✅
如果測試失敗了怎麼辦?
沒關係,這是正常的!
把錯誤訊息複製下來,貼給 AI,然後說:
「測試失敗了,請根據錯誤訊息修正程式碼。」
AI 會分析錯誤訊息,找出問題,然後修正程式碼,直到測試通過為止。
這就是 BDD 的保護網:測試會告訴你哪裡錯了,AI 會根據測試失敗訊息自己 debug。
補充說明:AI Assistant 可能會中途停止工作
有些時候,你可能會遇到 AI Assistant 在開發到一半時就停下來等你的指示,測試還沒有完全通過就結束了工作。
這是正常的!
因為市面上的 AI 工具(如 Cursor、Windsurf)通常會擔心消耗太多 token 而造成你的費用負擔,所以當測試情境較多時,AI 可能會先完成一部分開發就暫停下來,等待你的進一步指示。
這個時候你只要繼續跟它說:
「請繼續開發,直到所有測試程式碼都通過。如果你判定測試的程式碼有問題,或是原始的 feature file 有問題,請停下來告訴我,並且主動釐清問題。」
AI 就會繼續工作,直到所有測試通過為止。
結語
好了,看到這裡,你已經親手體驗過完整的 AI x BDD 流程了。
讓我們回顧一下你做了什麼:
- 下載範例專案,執行 BDD Prompt,看到 AI 自動完成六個訂單優惠情境的開發
- 自己動手寫 Feature file,定義雙十一優惠的三個情境
- 再次執行 BDD Prompt,看到 AI 自動完成新需求的開發
你有沒有發現,整個過程中你完全沒有寫任何 production code?
你只是定義了需求(Feature file),剩下的全部是 AI 完成的。
那麼,問題來了:
你自己的專案呢?
你有沒有想過,哪些功能可以用這種方式開發?
也許是:
- 用戶註冊登入的各種情境
- 購物車的加減商品邏輯
- 訂單狀態的流轉規則
- 權限控制的各種角色情境
- 報表產生的各種篩選條件
- ⋯⋯
只要是能夠用「情境案例」清楚定義的功能,都可以用 AI x BDD 的方式來開發。
不用再花時間寫一堆 if-else,不用再想破頭怎麼實作複雜的業務邏輯,不用再 debug 到天荒地老。
你只需要學會一件事:如何把需求轉換成清楚的情境案例。
這就是前兩篇文章教你的「實例化需求 (SBE)」和「可執行規格 (Executable Specification)」。
最後,邀請你把練習完之後的心得分享至:Discord 社群
讓我們一起交流,看看大家在實踐 AI x BDD 的過程中遇到了什麼有趣的挑戰,又是如何解決的。
好了,現在你已經掌握完整的 AI x BDD 流程了。
去你的專案試試看吧!
對規格驅動開發而言,精準度,會是接下來最重要的戰場
上述的 AI x BDD 做法只是基本中的基本。
許多夥伴在體驗到 AI x BDD 的威力之後,應該已經開始感受到:也許解放雙手最好的方式,就是把你的關注點放在 scenario-based 的規格上,而不再是繼續在程式碼中進行瑣碎的開發工作。
不過,接下來你可能會擔心:
AI 寫出來的測試程式碼,它的精準度夠高嗎?
我還是需要一行一行去檢查測試程式碼是否真的滿足產品的意圖吧?
這部分當然還有得學。怎麼可能一篇文章就解決所有問題呢?
但這也不代表這些問題無法解決,只是你還有進階的技巧要學。如果想學的話,接下來我就大概跟你說一下怎麼做。
規格的光譜:達到 100% 測試程式碼正確率
主要的做法叫做 「規格的光譜」,這是水球老師我在規格驅動開發(SDD)中提出的超高精度做法。
核心概念是:透過一層一層的翻譯,來保證你的測試程式碼能夠絕對反映整個產品的測試意圖。
甚至可以做到:
今天你的 Feature file(可執行規格)一旦寫完,就能保證工具所產出的測試程式碼是 100% 的正確率。
不需要再一行一行檢查,不需要再擔心 AI 理解錯誤,完全自動化,完全可信,畢竟幾乎大多數主流的業務流程需求都可以被寫成可執行規格中。
水球我認為呢,市面上未來只會有兩種人而已,第一種人知道如何做到 100% 精準度,第二種人只知道一天到晚用 Vibe,但卻做到連精準度都算不來的程式。
我會和你說啊,如果你和我一樣想要把軟體工程師的價值無限延續,那精準度就是我們的戰場。
想學的話有兩種方式
如果你對這套方法有興趣,有兩種學習方式:
方式一:速成班 - AI x BDD 規格驅動全自動開發術課程
想要快速掌握完整技巧的話,可以直接來上我們的線上課程:
課程中會完整教你:
- 如何設計高精度的規格
- 規格的光譜是什麼
- 如何達到測試程式碼 100% 正確率
- 如何建立可維護的自動化開發流程
- 實戰演練各種複雜業務場景
方式二:加入 SDD.tw 讀書會 - 每周二線上研討
如果你想要免費學習、與社群一起成長,歡迎加入我們的線上讀書會:
台灣規格驅動開發研究組織 (SDD.tw)
- 時間:每周二晚上
- 形式:線上研討會
- 內容:AI x BDD、規格驅動開發、全自動化實踐經驗分享
- 對象:對全自動開發術有興趣的魔法初學者與資深開發者
加入方法寫在我們的官網上:sdd.tw
基本上最後都會導到水球軟體學院的 Discord 社群就是了,因為水球我辦的所有高含金量活動都會在我自己的社群中發生。
歡迎各位全自動開發術的魔法初學者,一起來探索 AI 時代的軟體開發新境界!