从零开始掌握BDD行为驱动开发
BDD 起源与沟通
沟通的鸿沟
想象一下,你想盖一座房子。你告诉建筑师:“我想要一个舒适、现代的家。”建筑师转身对施工团队说:“我们需要用 C30 混凝土和 HRB400 钢筋来建造承重结构。”
你听得懂吗?可能不懂。同样,施工团队可能也不完全理解你对“舒适”和“现代”的主观感受。这就是软件开发中经常上演的一幕。
业务人员(比如产品经理、市场分析师)用客户需求和商业目标的语言来描述软件。他们会说:“用户需要一个简单的方式来搜索我们的产品。”
而技术人员(开发人员、测试工程师)则用技术术语来思考和沟通。他们会讨论:“我们需要建立一个 RESTful API,用 Elasticsearch 来索引数据,并在前端实现一个响应式搜索组件。”
两者之间存在一道巨大的鸿沟。业务人员不理解技术细节,技术人员可能误解业务的真实意图。这种“语言不通”的后果很严重:开发出来的功能可能并非用户真正想要的,导致时间和资源的巨大浪费。
寻求一种通用语言
为了解决这个问题,行为驱动开发(BDD)应运而生。它不是一种新的编程语言或复杂的工具,而是一种旨在弥合沟通鸿沟的软件开发方法论。
BDD 的核心思想很简单:让项目中的每个人,无论是业务人员、开发人员还是测试人员,都使用同一种简单、自然的语言来描述软件应该如何工作。这种描述不关心软件“内部”是如何实现的,只关注从用户角度看,软件“外部”应该表现出什么行为。
行为驱动开发
noun
一种软件开发方法,它鼓励团队成员(包括技术和非技术人员)通过围绕软件预期行为的对话进行协作。
通过这种方式,软件的需求不再是一份长篇大论、充满歧义的文档,而是一系列清晰、具体、可执行的行为描述。这些描述就像一份活的文档,既能指导开发,又能作为测试的标准。
行为驱动开发(BDD)通过为所有参与者建立一种共享语言,弥合了这一关键的鸿沟。
从 TDD 到 BDD 的演变
BDD 的思想并非凭空出现,它源于并扩展了另一种流行的开发实践:测试驱动开发(TDD)。
测试驱动开发(TDD)是一种以开发人员为中心的技术。其流程是:
- 编写一个失败的测试:针对一个即将开发的小功能,先编写一个自动化测试,这个测试因为功能尚未实现,所以会运行失败。
- 编写刚好能通过测试的代码:编写最少的代码,让刚才那个失败的测试通过。
- 重构:清理和优化代码,同时确保测试仍然通过。
TDD 极大地提高了代码质量和可靠性,但它的语言是纯技术的。测试用例通常是函数名和断言,比如 test_user_login_with_invalid_password()。业务人员很难看懂这些测试,也无法参与其中来验证软件的行为是否符合他们的预期。
BDD 的创始人丹·诺斯(Dan North)意识到了这个问题。他提出,我们应该将测试的重点从“测试代码”转向“描述行为”。他建议用更自然的句子结构来命名测试,比如“用户使用无效密码登录时应该看到错误提示”。这个小小的转变,让测试变得对所有人可见且可理解,从而为 BDD 铺平了道路。
| 特性 | 测试驱动开发 (TDD) | 行为驱动开发 (BDD) |
|---|---|---|
| 核心焦点 | 单元的功能实现是否正确 | 软件的整体行为是否符合预期 |
| 使用语言 | 技术语言(代码、函数名) | 自然语言(业务术语) |
| 主要参与者 | 开发人员 | 开发人员、测试人员、业务分析师等 |
| 目标 | 确保代码质量和健壮性 | 促进团队协作,确保构建正确的产品 |
协作是核心
归根结底,BDD 的精髓在于“沟通”与“协作”,而非工具。
在传统的软件开发流程中,需求分析、开发和测试往往是孤立的阶段。业务分析师写完需求文档就交给了开发团队,开发团队完成编码后又交给了测试团队。信息在传递过程中很容易失真或遗漏。
BDD 提倡一种贯穿整个软件生命周期的协作模式。在项目开始之初,业务人员、开发人员和测试人员就坐在一起,通过对话来共同定义软件的行为。这个过程被称为“三方会谈”(Three Amigos)。
通过这些早期的、持续的对话,团队可以:
- 澄清模糊不清的需求:确保每个人对功能的理解都是一致的。
- 发现隐藏的逻辑错误和边界情况:在编写代码之前就考虑到各种可能性。
- 建立共享的理解:团队成员对要构建什么以及为什么构建它有共同的认识。
这种协作文化能够从根本上减少返工,避免在项目后期才发现重大偏差,从而更高效地交付真正满足用户需求的软件。
行为驱动开发(BDD)旨在解决的主要问题是什么?
根据文中所述,行为驱动开发(BDD)是从哪种开发实践演变而来的?
BDD 将重点从技术实现转移到了业务价值,确保团队中的每一个人都在为同一个目标努力。
