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的核心思想是:

  1. 从用户故事开始:以用户的角度描述功能需求
  2. 使用自然语言:用Given-When-Then格式描述行为
  3. 测试先行:先写测试,再写实现
  4. 持续集成:确保代码质量

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。流程大概是这样:

  1. 写需求场景

  2. 使用“Given-When-Then”描述行为

  3. AI 生成代码

  4. 可以直接生成功能实现或者测试桩

  5. 运行测试验证

  6. 自动检查功能是否符合场景

  7. 迭代优化

  8. 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 如何指导实现

  1. 编写功能文件(可执行规范)
  2. 实现步骤定义,将 Gherkin 步骤绑定到 Go 代码
  3. 实现最小代码以使场景通过
  4. 在保持场景为绿色的同时进行重构

该示例展示了紧密的反馈循环:特性文件阐明期望行为;步骤断言期望;代码演进直至满足行为。

参考

  • 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 国际许可协议进行许可。