AI 编程时代,更加需要 BDD
Posted on Mon 01 September 2025 in Journal
Abstract | AI 编程时代,更加需要 BDD |
---|---|
Authors | Walter Fan |
Category | learning note |
Status | v1.0 |
Updated | 2025-09-01 |
License | CC-BY-NC-ND 4.0 |
AI 编程时代,更加需要 BDD
最近在调试 AI 辅助编程的项目,突然有种“人已麻”的感觉——代码写得飞快,但是很不放心
- 需求到底有没有理解对?
- 实现到底有没有偏差?
- 测试到底有没有覆盖重要的用例?
这时候,我忽然想起一个老朋友:BDD(行为驱动开发)。
很多人听到 BDD,第一反应是:“啊?那不是多年前的东西了吗?怎么又火了?”没错!它确实不新,但AI 编程时代,它的重要性比以前高多了
What:BDD,到底是什么?
简单说,BDD 就是把需求和测试“人性化”地表达出来! 用一句话概括:“先讲故事,再写代码,再跑测试”。
想象一下,如果你的需求文档是这样的:
用户点击按钮,系统弹出提示框
你可能直接上手写前端逻辑,然后写单元测试…… 但有了 BDD,你会先写 行为场景:
场景:用户点击保存按钮
假如用户填写了必填字段
当用户点击保存
那么系统应该显示“保存成功”的提示
是不是瞬间明白需求了?这就是 BDD 的魅力——人人都能读懂需求,代码和测试一条线走到底!
BDD的核心思想是:
- 从用户故事开始:以用户的角度描述功能需求
- 使用自然语言:用Given-When-Then格式描述行为
- 测试先行:先写测试,再写实现
- 持续集成:确保代码质量
Why:为什么 AI 时代特别需要 BDD
以前,程序员慢慢写,产品慢慢催……需求总是对不上号 现在,AI 直接帮你写代码,生成测试,甚至还能改 bug
听起来很爽,但问题来了:AI 能理解需求吗? 答案:不完全!AI 可以帮你写逻辑,但如果需求不清晰、场景没列全,它就可能写出“高大上”的垃圾代码……
这时候,BDD 就像一把“防火墙”:
- 需求更清晰:场景写好了,AI 按着场景生成代码和测试
- 测试更容易:测试脚本和需求天然一致,bug 少了
- 人人都是产品经理:不懂编码的人也能看懂场景,参与评审
而 AI 在 BDD 流程中可以发挥重要作用:
- 需求分析:AI帮助理解和分析用户故事
- 测试用例生成:AI根据用户故事自动生成测试用例
- 代码生成:AI根据测试用例生成实现代码
- 代码优化:AI帮助优化和重构代码
总之,有了 BDD,AI 代码不再是黑盒,而是“可验证的故事”!
How:AI + BDD,怎么玩?
现在流行用 Cucumber、Godog(Go 语言) 这类工具结合 BDD。流程大概是这样:
-
写需求场景
-
使用“Given-When-Then”描述行为
-
AI 生成代码
-
可以直接生成功能实现或者测试桩
-
运行测试验证
-
自动检查功能是否符合场景
-
迭代优化
-
AI + BDD,让开发和测试同步进行
简单一句话总结:写故事 → AI 写代码 → 自动验证 → 收获成就感
Example:真实案例演示
使用 godog
展示如何在 Go 语言中进行行为驱动开发(BDD)。
我们实现了一个简单的编码/解码器,支持 Base64、Hex 和 URL 编码。
Godog 是 Go 语言的 Cucumber 实现。它允许你用 Gherkin(.feature
文件)描述行为,并将每个步骤绑定到 Go 函数。Godog 执行这些场景并输出结果,使之成为可执行规格与验收测试。
常见使用方式:
- 作为独立 CLI 工具(直接运行特性)
- 集成到 go test
(在测试套件内运行)
在本项目中的用法
- 功能文件位于
bdd/*.feature
- 步骤定义与测试运行器位于
bdd/encoder_steps_test.go
- 通过
go test
集成:构造godog.TestSuite
并指向特性路径
可选:安装 Godog CLI 直接运行
go install github.com/cucumber/godog/cmd/godog@latest
# 在项目根目录下,运行 bdd/ 下的特性
godog bdd
项目结构
.
├── bdd
│ ├── encoder.feature # 功能与场景(Gherkin)
│ └── encoder_steps_test.go # 步骤定义 + 测试运行器
├── cmd
│ └── encoder
│ └── main.go # 手动使用的命令行工具
├── pkg
│ └── encoder
│ └── encoder.go # 编码/解码实现
└── go.mod
功能文件(Gherkin)
行为在 bdd/encoder.feature
中描述:
Feature: Encoding and decoding text
As a user of the encoder tool
I want to encode and decode strings using base64, hex, and url schemes
So that I can transform text reliably
Scenario Outline: Encode text
Given I have the text "<plain>"
When I encode using "<type>"
Then the result should be "<encoded>"
Examples:
| type | plain | encoded |
| base64 | hello world | aGVsbG8gd29ybGQ= |
| hex | hello | 68656c6c6f |
| url | hello world! | hello+world%21 |
Scenario Outline: Decode text
Given I have the text "<encoded>"
When I decode using "<type>"
Then the result should be "<plain>"
Examples:
| type | encoded | plain |
| base64 | aGVsbG8gd29ybGQ= | hello world |
| hex | 68656c6c6f | hello |
| url | hello+world%21 | hello world! |
运行 BDD 测试
先决条件: - Go 1.20+
安装依赖并运行测试:
go test ./...
你会看到 Godog 套件执行并通过。
只运行 BDD 包:
go test ./bdd -run TestGodog
命令行工具用法
构建并运行编码器 CLI:
go run ./cmd/encoder --mode encode --type base64 --text "hello world"
# 输出:aGVsbG8gd29ybGQ=
go run ./cmd/encoder --mode decode --type url --text "hello+world%21"
# 输出:hello world!
BDD 如何指导实现
- 编写功能文件(可执行规范)
- 实现步骤定义,将 Gherkin 步骤绑定到 Go 代码
- 实现最小代码以使场景通过
- 在保持场景为绿色的同时进行重构
该示例展示了紧密的反馈循环:特性文件阐明期望行为;步骤断言期望;代码演进直至满足行为。
参考
- Godog: https://github.com/cucumber/godog
- Cucumber BDD: https://cucumber.io/docs/bdd/
完整代码参见 https://github.com/walterfan/kata-go/tree/master/kata/kata-bdd
总结一下
AI 编程时代,代码变快了,但理解需求依然靠人。BDD 帮你把需求、测试、代码串起来,让 AI 真正成为你的“副手”,而不是“问题制造机”!
- BDD = 需求可读 + 测试自动化 + AI 驱动
- 场景写好,AI 不乱写
- 开发效率提升,bug 减少,心态稳稳的
最后,送大家一句话:写故事,不只是程序员的浪漫,也是 AI 编程的安全阀!
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。