行为驱动开发(BDD)的原理及实践
一、行为驱动开发是什么
行为驱动开发(Behavior-Driven Development,简称 BDD):
是一种敏捷软件开发方法,它强调从业务行为和期望结果出发编写测试用例,
使用自然语言描述系统行为,从而促进业务人员、开发人员和测试人员之间的沟通与协作。
二、BDD的核心构成
BDD的核心构成通常包括以下几个部分:
1.需求文档,一般使用自然语言规范(例如 Gherkin 语言):
编写需求文档,使用一种结构化的、接近自然语言的语法来描述功能行为,典型格式为:
Feature(功能):概括要测试的功能模块。
Scenario(场景):描述一个具体的行为示例。
Given-When-Then(给定-当-那么)步骤:
Given:初始上下文(前置条件)
When:触发动作(事件)
Then:期望的结果(验证)
2.根据需求文档的测试,自动化测试/手工测试
自动化测试:将需求文档中的每个自然语言步骤映射到实际的代码逻辑,编写测试代码,执行时会调用被测系统并检查输出。
手工测试:根据需求文档进行手工测试
三、PRD:Product Requirements Document(产品需求文档)
PRD是对功能进行描述,开发人员根据PRD进行功能开发,是对功能的详细描述。
PRD是对功能进行描述,我需要什么,他关注的是功能本身。
BDD是对交互场景进行描述,系统怎么响应,他关注的是用户和功能。
所以PRD适合开发阶段使用,BDD适合开发阶段加测试阶段使用,方便编写测试代码。
假设要描述“登录功能”:
PRD:
系统应提供密码登录功能。
用户输入邮箱和密码,点击登录按钮后,
系统验证凭证,
正确则跳转首页,
错误则显示错误提示。
BDD:
Given 我在登录页面
When 我输入邮箱 "user@example.com"
And 我输入密码 "123456"
And 我点击登录按钮
Then 我应该跳转到首页
可以看到只靠BDD来进行开发是不够的,
BDD的定位是“对齐业务理解”,而不是“替代所有文档”。
四、PRD加BDD的实践
需求:单机游戏的游戏商店,PRD+BDD
文档:单机游戏商店系统-PRD+BDD 联合规范
--------------------------------------------------------------
目录
--1.概述
--2.全局配置表(PRD)
----2.1 商品配置表
----2.2 折扣配置表
----2.3 刷新规则配置
----2.4本地存储结构:需要存储玩家购买记录
--3.用户故事+BDD场景
----Story 1:查看商店商品
----Story 2:购买普通商品
----Story 3:折扣商品购买
----Story 4:限购拦截
----Story 5:货币不足处理
----Story 6:商店刷新(每日/每周)
----Story 7:数据持久化
--4.边界与异常处理(PRD 补充)
--5.非功能需求
--6.附录:配置表示例
--------------------------------------------------------------
内容:
1.概述
本系统为单机游戏商店模块,玩家使用游戏内货币(金币/钻石)购买道具、皮肤或消耗品。
核心特征:
纯本地存储,无后端
支持永久限购、每日限购
支持时段性折扣
支持每日/每周商品刷新
所有行为必须可离线完成
//////////////////////////////////////////////////////////////
2.全局配置表
2.1商品配置表:GoodsConfig
......
2.2折扣配置表:DiscountConfig
......
2.3刷新规则配置:ShopRefreshConfig
......
2.4本地存储结构:需要存储玩家购买记录
//////////////////////////////////////////////////////////////
3.用户故事
每个故事对应一个可验收的功能,每个场景可直接转为测试用例,
有自动测试工具工具生成测试代码,没有功能完成后看时间,有时间手写单元测试。
Story 1:查看商店商品
作为玩家,我想打开商店时看到商品列表、价格和限购状态。
场景:商店初始化显示
Given 玩家首次进入游戏
When 打开商店界面
Then 商品列表至少包含 3 件商品
And 每件商品显示名称、图标、价格
And 价格旁标明货币类型(金币/钻石图标)
And 显示玩家当前金币和钻石余额
场景:限购商品显示剩余次数
Given 商品 1001 限购类型为 Permanent,限购次数 1
And 玩家尚未购买过该商品
When 打开商店
Then 该商品按钮显示“剩余 1 次”或“限购 1”
场景:已售罄商品的展示
Given 商品 1001 永久限购 1 次
And 玩家已购买过该商品
When 打开商店
Then 该商品按钮置灰或显示“已售罄”
And 点击按钮无效或弹出“已达购买上限”
......以下Story省略,根据具体需求编写。
//////////////////////////////////////////////////////////////
4. 边界与异常处理(PRD 补充)
以下情况不需要写 BDD,但开发和测试必须覆盖。
商品 ID 在配置表中不存在:不显示,打错误日志
折扣起始时间 > 结束时间:该折扣不生效
玩家本地时间被修改(回拨):以系统时间判断刷新,不做防作弊(单机)
同时多个折扣作用于同一商品:取最低价格(折扣率最小)
......
//////////////////////////////////////////////////////////////
5. 非功能需求
响应时间:打开商店 < 0.3 秒,购买操作反馈 < 0.1 秒
存储容量:购买记录 ≤ 1000 条不影响性能
......
//////////////////////////////////////////////////////////////
6. 附录:配置表示例

浙公网安备 33010602011771号