行为驱动开发BDD(Behavior Driven Development )

观看本文后,你将能够定义行为驱动开发(BDD),解释BDD如何推动满足客户期望,并描述BDD的主要优势。

行为驱动开发(BDD),顾名思义,它从外向内聚焦于系统的行为。这与测试驱动开发不同,测试驱动开发关注系统内部的工作细节。

BDD非常适合用于集成测试,以查看所有组件是否协同工作。它促使你"从外向内"思考。换句话说,你只实现那些对业务成果有最直接贡献的行为。

BDD的优势之一在于,它用一种统一的表示法来描述行为,领域专家、测试人员、开发人员和客户都能直接理解。这改善了团队间的沟通。

如果将BDD与TDD进行比较,我们会发现它们的切入点正好相反。BDD从外向内描述系统行为,就像系统的使用者那样看待系统;而TDD从内向外测试系统功能,它确保每个组件正常工作,而BDD则在更高层面上确保所有组件协同工作。

换句话说,BDD确保你构建的东西是正确的,即具备正确的功能和行为;TDD确保你正确地构建东西,即每个功能都能完成其预期任务。

BDD的工作流程是这样的:开发人员、测试人员和客户首先探索问题领域,并通过协作给出具体示例,描述他们期望的行为。他们使用一种名为Gherkin的语言记录这些行为,这是一种自然语言表示法,我稍后会详细介绍。

接下来,团队使用BDD工具(如Python的Behave、Java的jBehave或Ruby的Cucumber)将这些示例作为自动化验收测试来运行。在团队解决问题的过程中,BDD工具会告知他们哪些示例已实现并能正常工作,同时提醒他们哪些还未完成。

不知不觉中,你就拥有了一份既是软件规格说明又是测试用例的文档。

Gherkin是一种易读的自然语言语法,采用常见的"Given...When...Then..."结构。技术人员和非技术人员都很容易理解。如果你想知道Gherkin这个名字的由来,最初使用这种语法的工具叫Cucumber(黄瓜),而Gherkin指腌黄瓜,腌黄瓜是用黄瓜制作的。工具常常会起这样有趣的名字。

下面介绍一下Gherkin语法的使用方法。

  • Given some context(给定某种上下文):这是在为测试设置上下文或前置条件,目的是在用户(或外部系统)开始与系统交互之前,将系统置于已知状态。
  • When some event happens(当某个事件发生时):这是描述正在执行的主要操作,它将系统从初始状态转变为新的可观察状态。
  • Then some testable outcome or behavior is validated(然后验证某个可测试的结果或行为):"Then"用于观察结果,这些观察结果应与功能的业务价值或益处相关。"And"用于延续条件,例如"Given this And that...""Then this And that..."等等,它为你提供了一种自然的方式来添加更多的上下文、事件或结果。

让我们来看一个零售店的例子。这些被称为功能文件或功能文档,每个文档对应一个功能,并且有许多场景来描述这个功能。在这个例子中只有一个场景,但为了涵盖所有可能的情况,肯定会有更多场景。

这个功能叫"退货入库",它描述了客户退回所购商品时系统的行为。注意,它使用了"As a(作为)""I need(我需要)""So that(以便)"的语法,我们在编写用户故事时会用到这种语法。你可以把它看作是带有验收标准的用户故事,其中验收标准就是这些场景。

第一个场景叫"退款商品应退回库存",内容如下:假设一位顾客之前从我这里购买了一件黑色毛衣,并且我的库存中有3件黑色毛衣,当他们退回这件黑色毛衣要求退款时,我的库存中应该有4件黑色毛衣。这相当直观。

相关利益者看到这个场景时应该能够判断:"是的,这就是退货入库的正常流程。"或者也可能会说:"还有另一种可能的情况。"这时你就需要为"退货入库"这个功能记录一个新场景。

关键在于,相关利益者实际上是在帮你用一种正式的语法定义系统行为,而你现在可以根据这种语法来执行测试用例。我再说一遍:你实际上可以根据这份文档执行测试用例。

像Behave和Cucumber这样的BDD工具可以直接使用这份文档,无需进一步编辑或处理,就能执行测试用例,以证明系统确实表现出预期的行为。这会让你的客户满意。

这就是为什么我在每个用户故事中都添加验收标准,我使用Gherkin语法在我们编写的用户故事中定义验收标准。这样一来,在冲刺阶段结束时,就不会对"完成"的定义产生争议,因为这是无可争议的:代码要么表现出这种行为,要么没有。

BDD改善了开发人员、测试人员、产品负责人和其他相关利益者之间的沟通,它通过提供一种接近日常语言的通用语法,相比TDD工具学习曲线更平缓,从而为系统应有的行为提供更精确的指导。

采用BDD方法的工具通常能根据BDD功能规范自动生成技术文档和最终用户文档。清晰的行为可见性有助于生成更高质量的代码,这降低了维护成本并消除了风险。

最后,由于在实际开发之前,BDD的验收标准就已经转化为用户故事和测试场景,因此,自动化测试用例甚至可以在产品测试之前就开始创建测试流程。

在本文中,你了解到BDD从外向内聚焦于系统行为,它站在系统使用者的角度看待系统。BDD使用一种通俗易懂的语法,其主要优势包括改善沟通、统一语法,以及为用户故事提供验收标准。

相关推荐
Natsume17102 天前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
S,D2 天前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
Despacito0o3 天前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
小米里的大麦12 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
Svan.14 天前
Portable Watch:基于STM32的便携智能手表
arm开发·驱动开发·stm32·嵌入式硬件·硬件工程·pcb工艺·智能手表
楼台的春风15 天前
【Linux驱动开发 ---- 4_驱动开发框架和 API】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu
楼台的春风15 天前
【Linux驱动开发 ---- 1.1_Linux 基础操作入门】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu
sukalot16 天前
window显示驱动开发—输出合并器阶段
驱动开发·算法
sukalot16 天前
window显示驱动开发—使用状态刷新回调函数
驱动开发
车载操作系统---攻城狮16 天前
[驱动开发篇] SPI 驱动开发 - 原理解析篇
驱动开发