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(重构)阶段: 在不改变功能的前提下优化代码结构。重构过程中应持续运行测试,确保代码质量提升的同时不破坏功能。

流程图如下所示:

tdd


3. BDD 核心理念

BDD 的核心目标是建立技术与非技术人员之间的协作桥梁,确保软件开发始终围绕业务需求进行。

它鼓励使用自然语言和领域特定语言(DSL)来描述系统行为,从而提升沟通效率。从技术角度看,BDD 是 TDD 与领域驱动设计(DDD)的结合体。

3.1 基本原则

BDD 有三个核心原则:

  1. Enough is enough(适可而止)
    • 只做必要的分析、设计和规划。避免一次性定义整个项目范围,因为需求会随时间变化。
  2. Deliver value to stakeholders(为利益相关者创造价值)
    • 所有活动都应体现业务价值。没有价值的开发行为应避免。
  3. It’s all behavior(一切都是行为)
    • 所有参与者都应使用统一语言描述系统行为。这种语言应贯穿代码、应用、业务需求等各个层面。

3.2 开发流程

BDD 的典型开发流程如下:

  1. 识别业务功能
  2. 定义场景和验收标准
  3. 拆解场景为具体步骤
  4. 编写失败的测试步骤
  5. 实现代码使测试通过
  6. 重构代码
  7. 生成报告

流程开始于业务分析师与利益相关者之间的讨论,明确业务需求。随后与测试人员一起形成用户故事(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(前端常用)

流程图如下:

BDD


4. BDD vs TDD

对比维度 TDD BDD
关注点 实现过程 行为描述
主要参与者 开发人员 业务、测试、开发共同参与
起点 编写单元测试 编写用户故事与场景
文档形式 测试代码 业务可读语言(如 Gherkin)
变更影响 功能变化影响大 场景贴近用户行为,受功能变化影响小
实施难度 相对简单,主要依赖开发团队协作 实施成本较高,需多方协作
是否包含 TDD 流程 是,包含红-绿-重构流程

📌 总结:
BDD 是一种更广泛、更注重协作的开发方式,适合以用户行为为核心的项目,如电商、银行系统、游戏等。
而 TDD 更适合底层模块、API 或框架开发,BDD 在这类项目中可能显得过于复杂。


5. 总结

BDD 和 TDD 是两种不同的开发理念:

  • TDD 更注重技术实现,适合开发人员主导的项目。
  • BDD 更强调业务协作,适合涉及多方利益相关者的项目。

选择哪种方式,取决于项目性质与团队结构。在实际开发中,两者可以结合使用,取长补短。

📌 适用场景建议:

  • BDD 推荐用于: 电商平台、银行系统、游戏、用户交互密集型应用
  • TDD 推荐用于: API、中间件、工具库、框架开发

📌 踩坑提醒:
BDD 虽好,但不要为了写“场景”而写“场景”。如果业务方不参与,或测试人员不具备业务理解能力,BDD 很容易流于形式。


原始标题:Understanding BDD