1. 简介
行为驱动开发(Behavior-Driven Development,简称 BDD)是一种以满足业务需求为导向的软件开发流程。
在本教程中,我们将深入解析 BDD 的核心理念与流程。同时也会介绍它的前身——测试驱动开发(TDD),并对比两者的异同。
2. TDD 简述
BDD 和 TDD 有很多共通之处。要理解 BDD,我们首先需要了解 TDD。
测试驱动开发(Test-Driven Development,TDD)是一种以编写测试为核心的开发方式。 在 TDD 中,我们先为功能编写测试用例,再根据测试来实现功能代码。
2.1 红-绿-重构(Red/Green/Refactor)
TDD 的开发流程通常被称为红-绿-重构循环。 它包含三个关键阶段:
- Red(红)阶段: 编写一个失败的测试用例。此时功能尚未实现,所以测试应失败。如果测试通过,则说明测试本身存在问题。
- Green(绿)阶段: 编写最简实现,使测试通过。此时代码质量不是重点,只要满足测试即可。
- Refactor(重构)阶段: 在不改变功能的前提下优化代码结构。重构过程中应持续运行测试,确保代码质量提升的同时不破坏功能。
流程图如下所示:
3. BDD 核心理念
BDD 的核心目标是建立技术与非技术人员之间的协作桥梁,确保软件开发始终围绕业务需求进行。
它鼓励使用自然语言和领域特定语言(DSL)来描述系统行为,从而提升沟通效率。从技术角度看,BDD 是 TDD 与领域驱动设计(DDD)的结合体。
3.1 基本原则
BDD 有三个核心原则:
- Enough is enough(适可而止)
- 只做必要的分析、设计和规划。避免一次性定义整个项目范围,因为需求会随时间变化。
- Deliver value to stakeholders(为利益相关者创造价值)
- 所有活动都应体现业务价值。没有价值的开发行为应避免。
- It’s all behavior(一切都是行为)
- 所有参与者都应使用统一语言描述系统行为。这种语言应贯穿代码、应用、业务需求等各个层面。
3.2 开发流程
BDD 的典型开发流程如下:
- 识别业务功能
- 定义场景和验收标准
- 拆解场景为具体步骤
- 编写失败的测试步骤
- 实现代码使测试通过
- 重构代码
- 生成报告
流程开始于业务分析师与利益相关者之间的讨论,明确业务需求。随后与测试人员一起形成用户故事(Story)。
✅ 用户故事(Story)是业务需求的文档化表达。
每个故事通常包括标题、叙述和验收标准。叙述格式如下:
Feature: [功能标题]
As a [角色]
I want [想要的功能]
So that [期望带来的好处]
例如:
Feature: 账户注册
As a 用户
I want 注册一个账户
So that 我不需要每次购买都输入个人信息
✅ 验收标准(Acceptance Criteria)以场景(Scenario)形式定义。
标准格式如下:
Scenario: [场景标题]
Given [前提条件]
When [触发事件]
Then [预期结果]
例如:
Scenario: 邮箱格式验证
Given 我是一个未注册用户
When 我在注册页面输入邮箱地址
Then 邮箱地址必须合法且未被注册
⚠️ 故事与场景准备好后,就可以进入“红-绿-重构”的开发循环。
✅ BDD 支持生成可读性强的测试报告,便于团队共享。
常用 BDD 测试框架有:
- Cucumber(支持多种语言)
- Serenity
- Concordion
- Mocha(前端常用)
流程图如下:
4. BDD vs TDD
对比维度 | TDD | BDD |
---|---|---|
关注点 | 实现过程 | 行为描述 |
主要参与者 | 开发人员 | 业务、测试、开发共同参与 |
起点 | 编写单元测试 | 编写用户故事与场景 |
文档形式 | 测试代码 | 业务可读语言(如 Gherkin) |
变更影响 | 功能变化影响大 | 场景贴近用户行为,受功能变化影响小 |
实施难度 | 相对简单,主要依赖开发团队协作 | 实施成本较高,需多方协作 |
是否包含 TDD 流程 | 否 | 是,包含红-绿-重构流程 |
📌 总结:
BDD 是一种更广泛、更注重协作的开发方式,适合以用户行为为核心的项目,如电商、银行系统、游戏等。
而 TDD 更适合底层模块、API 或框架开发,BDD 在这类项目中可能显得过于复杂。
5. 总结
BDD 和 TDD 是两种不同的开发理念:
- ✅ TDD 更注重技术实现,适合开发人员主导的项目。
- ✅ BDD 更强调业务协作,适合涉及多方利益相关者的项目。
选择哪种方式,取决于项目性质与团队结构。在实际开发中,两者可以结合使用,取长补短。
📌 适用场景建议:
- ✅ BDD 推荐用于: 电商平台、银行系统、游戏、用户交互密集型应用
- ✅ TDD 推荐用于: API、中间件、工具库、框架开发
📌 踩坑提醒:
BDD 虽好,但不要为了写“场景”而写“场景”。如果业务方不参与,或测试人员不具备业务理解能力,BDD 很容易流于形式。