Given-When-Then验收场景与测试用例设计 - 第1节

1.1 起源与背景:从行为驱动到验收标准的结构化革命

Given-When-Then(GWT)并不是凭空诞生的理论模型。它最早出现在 行为驱动开发(BDD, Behavior-Driven Development) 方法论中,由 Dan North 在21世纪初提出,旨在解决“需求与分析人员在文档里写长篇大论、开发与测试在代码里各自猜意”这一经典协作断裂问题。

传统验收标准的常见写法是:

系统应具备用户登录功能。
用户输入正确凭证后可以成功登录。
对于无效凭证系统应给出错误提示。

问题很明显——谁触发?在什么上下文?期望什么结果?边界含糊不清。Given-When-Then 通过固定的“前置条件→操作触发→结果验证”结构,将验收标准从散文体转为“可执行剧本”,彻底消除了歧义。

要点: GWT 不是测试用例,而是验收剧本——它描述的是系统外在可见的行为结果,而非内部实现细节。

1.2 核心三要素解构

每一条 Given-When-Then 验收标准都必须包含三个部分,缺一不可:

要素 英文 含义 回答的问题
Given 上下文与前置条件 系统处于什么初始状态?有哪些前置数据、权限或配置已就位? “故事发生前,世界是怎样的?”
When 操作或事件 用户(或其他参与者)执行了哪个具体动作?或外部触发了什么事件? “发生了什么?”
Then 期望结果 系统应产生哪些可见的输出、状态变更或返回值? “世界变成了什么样子?”

完整示例(用户注册功能):

Given 系统邮箱“test@example.com”尚未被注册
  And 用户已同意平台服务协议
When 用户在注册页面填写邮箱“test@example.com”
  And 用户设置密码“Pass@123456”
  And 用户点击“注册”按钮
Then 系统为该用户创建账户,状态为“待激活”
  And 系统向“test@example.com”发送一封确认邮件
设计提示: 一个 When 至多对应 1 个核心触发动作。如果一条验收标准里出现了多个连续操作(如“点击保存,然后点击提交”),应拆为多条 GWT 场景,或使用 And/But 显式连接。

1.3 适用验收场景

GWT 格式并非万能,但它在六个领域表现出极强的结构化优势:

  • 用户故事验收(BDD + Scrum) —— 作为 Sprint 验收的“通过/失败”判定依据。
  • 接口/API 契约测试 —— 定义请求触发与响应结构的精确匹配规则。
  • 状态机与工作流 —— 验证触发事件后状态迁移是否符合设计。
  • 配置类与开关类功能 —— “当功能开关为 ON 时,行为应为 X”。
  • 异常与错误边界 —— “Given 余额不足,When 扣款,Then 返回错误码”。
  • 数据管道/ETL 校验 —— 描述输入数据格式、转换动作与输出表断言。
避免滥用: 纯 UI 排版检查、非功能性需求(性能/安全性规程)以及跨系统长链路集成场景,GWT 格式会让验收标准变得笨重。这些场景应优先选用检查表或工作流图,而非硬套 GWT 句式。

1.4 GWT 三要素关系结构图

Given-When-Then 验收标准结构 Given 前置条件与状态 When 事件与触发操作 Then 期望结果与断言 必须遵循的句式契约 每个场景只有一个 Given 上下文、一个 When 动作、一个 Then 结果组(可用 And 扩展) 起源背景 BDD 方法论 → Dan North 提出 主要适用场景 用户故事验收 · API 契约 · 状态机 · 异常边界

1.5 本章总结:GWT 作为验收标准域语言

Given-When-Then 的结构优势在于它强制每一个验收标准都回答三个问题:

  • 起点(Given)—— 把隐性假设显式化,消除“我以为系统已经登录/配置了XXX”的幻觉。
  • 触发(When)—— 锁定唯一的动作边界,防止一个验收标准包含多个潜在的判定路径。
  • 终点(Then)—— 只关心外部可见反馈,不绑死内部实现。