跳转到内容

验收标准编写规范

GIVEN/WHEN/THEN 格式、可测试性要求


规则:验收标准是需求”完成”的唯一裁判,必须具体、可观察、可判定,不能是主观感受。

[Requirement] 每条验收标准必须能被测试人员直接执行,输出明确的”通过/失败”结论,不允许”差不多""体验好”这类主观描述。

[Requirement] 验收标准须在开发启动前定稿,开发过程中如需修改必须走需求变更流程(见需求管理规范)。

[Standard] 一个需求至少覆盖正常路径、异常路径、边界条件三类验收标准。

[Standard] 验收标准须独立编号,如 AC-1、AC-2,便于在测试用例与缺陷中引用。

[Default] 未指定格式时,默认使用 GIVEN/WHEN/THEN(下文)。

好的验收标准的特征:

特征说明正例反例
具体有明确的输入与输出“输入 11 位手机号”“输入手机号”
可观察结果可被看到/检测到“页面显示红色提示”“体验流畅”
可判定有明确的通过/失败边界“响应时间 ≤ 2 秒”“响应要快”
独立每条只验证一件事“登录成功后跳转首页”“登录成功并跳转首页并显示欢迎语”

规则:每条验收标准使用 GIVEN/WHEN/THEN 三段式描述,对应”前置条件/触发动作/预期结果。

[Requirement] 必须包含 GIVEN(前置条件)、WHEN(触发动作)、THEN(预期结果)三个要素,缺一不可。

[Standard] 复杂条件用 AND 连接多个 GIVEN 或多个 THEN,避免一条标准出现多个 WHEN。

[Standard] THEN 中不允许出现”应该""可能”等模糊词,必须是确定的结果。

格式定义:

GIVEN <前置条件>
AND <补充前置条件>
WHEN <触发动作>
THEN <预期结果>
AND <补充预期结果>

字段说明:

关键字含义要求
GIVEN系统在什么状态下描述已存在的数据、配置、用户登录态
WHEN用户/系统做了什么动作单一动作,不要包含多个步骤
THEN应该得到什么结果可观察、可判定
AND连接多个并列条件/结果同类型关键字之间用 AND

示例:

AC-1: 正常登录
GIVEN 用户已注册且账号未冻结
AND 用户输入正确的手机号和密码
WHEN 用户点击"登录"按钮
THEN 系统校验通过并跳转至首页
AND 首页顶部显示用户昵称
AC-2: 密码错误
GIVEN 用户已注册
AND 用户输入正确手机号但密码错误
WHEN 用户点击"登录"按钮
THEN 页面显示"密码错误,请重试"
AND 登录按钮可再次点击
AND 不跳转页面

规则:验收标准必须能转化为可执行的测试用例,无法自动化或无法手动复现的标准视为不合格。

[Requirement] THEN 中的预期结果必须包含具体的界面元素、数据值、状态码或日志内容,禁止使用”正常""正确""成功”等无明确判定标准的词。

[Requirement] 涉及数值型指标必须给出明确阈值,如”响应时间 ≤ 2 秒”,不能写”响应要快”。

[Standard] 每条验收标准须标注测试类型:功能测试 / 接口测试 / 性能测试 / 安全测试。

[Standard] 涉及数据校验类标准,须明确数据来源与数据格式。

[Suggestion] 验收标准总数控制在 5-15 条之间;超过 15 条说明需求粒度过大,应拆分。

可测试性对照表:

不可测试可测试改进点
页面加载要快首屏加载时间 ≤ 2 秒(95 分位)加阈值
列表显示用户信息列表展示昵称、头像、注册时间三列明确字段
支持多种支付方式展示微信支付、支付宝、银行卡三种支付入口枚举具体方式
错误提示友好错误提示文案为”网络异常,请稍后重试”明确文案
数据要安全用户密码以 bcrypt 哈希存储,不返回明文明确技术要求

反模式:

  • ❌ “系统运行稳定”——稳定无定义。
  • ❌ “用户体验好”——好的标准是什么?
  • ❌ “支持常见浏览器”——常见是哪些?版本范围?

规则:以下反模式会导致验收标准无法执行或引发争议,必须避免。

[Caution] 一条验收标准包含多个 WHEN(多个动作),导致失败时无法定位是哪一步出错。

[Caution] 验收标准与实现细节耦合(如”调用 UserService.login 方法”),应描述行为而非实现。

[Caution] 验收标准遗漏异常路径,导致边界 bug 无法被发现。

反模式一:一条标准多个动作

❌ 错误:
GIVEN 用户已登录
WHEN 用户进入个人中心,点击编辑,修改昵称,点击保存
THEN 昵称更新成功
✅ 正确:拆分为多条
AC-1:
GIVEN 用户已登录
WHEN 用户进入个人中心
THEN 页面显示当前昵称
AC-2:
GIVEN 用户在个人中心编辑页
WHEN 用户修改昵称并点击保存
THEN 昵称更新为新值

反模式二:描述实现而非行为

❌ 错误:
GIVEN 用户输入手机号
WHEN 系统调用 validatePhone() 方法
THEN 返回 true
✅ 正确:
GIVEN 用户输入 11 位以 1 开头的手机号
WHEN 用户点击"获取验证码"
THEN 系统发送验证码至该手机号

反模式三:缺少异常路径

❌ 错误:只写了正常登录
GIVEN 用户输入正确账号密码
WHEN 点击登录
THEN 登录成功
✅ 正确:补充异常路径
GIVEN 用户输入错误密码
WHEN 点击登录
THEN 提示"密码错误"
GIVEN 用户连续输错 5 次密码
WHEN 点击登录
THEN 账号锁定 15 分钟

反模式四:主观形容词无阈值

❌ 错误:
THEN 页面加载很快
✅ 正确:
THEN 页面首屏加载时间 ≤ 2 秒(P95)

完整需求验收标准示例:用户登录功能

编号类型验收标准
AC-1功能正常登录成功
AC-2功能密码错误提示
AC-3功能账号不存在提示
AC-4功能连续错误锁定
AC-5功能未注册手机号登录
AC-6安全密码传输加密
AC-7性能登录接口响应时间

AC-1: 正常登录成功

GIVEN 用户已注册且账号状态正常
AND 用户输入正确的手机号和密码
WHEN 用户点击"登录"按钮
THEN 系统跳转至首页
AND 首页右上角显示用户昵称
AND 登录接口返回 HTTP 200

AC-2: 密码错误提示

GIVEN 用户已注册
AND 用户输入正确手机号但密码错误
WHEN 用户点击"登录"按钮
THEN 输入框下方显示红色提示"密码错误,请重试"
AND 页面不跳转
AND 密码输入框内容被清空

AC-3: 账号不存在提示

GIVEN 用户输入未注册的手机号
WHEN 用户点击"登录"按钮
THEN 页面显示"该手机号未注册"
AND 登录接口返回 HTTP 404

AC-4: 连续错误锁定

GIVEN 用户已注册
AND 用户连续 5 次输入错误密码
WHEN 用户第 6 次点击"登录"按钮
THEN 页面显示"账号已锁定,请 15 分钟后重试"
AND 锁定期间登录接口返回 HTTP 423

AC-5: 未注册手机号登录

GIVEN 用户输入未注册的手机号和任意密码
WHEN 用户点击"登录"按钮
THEN 页面显示"该手机号未注册,请先注册"

AC-6: 密码传输加密

GIVEN 用户在登录页输入密码
WHEN 用户点击"登录"按钮
THEN 请求体中密码字段为密文(非明文传输)
AND 服务端日志不记录明文密码

AC-7: 登录接口响应时间

GIVEN 系统正常运行
WHEN 用户点击"登录"按钮
THEN 登录接口响应时间 P95 ≤ 500ms
AND 并发 100 用户同时登录时无超时