验收标准编写规范
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 200AC-2: 密码错误提示
GIVEN 用户已注册 AND 用户输入正确手机号但密码错误WHEN 用户点击"登录"按钮THEN 输入框下方显示红色提示"密码错误,请重试" AND 页面不跳转 AND 密码输入框内容被清空AC-3: 账号不存在提示
GIVEN 用户输入未注册的手机号WHEN 用户点击"登录"按钮THEN 页面显示"该手机号未注册" AND 登录接口返回 HTTP 404AC-4: 连续错误锁定
GIVEN 用户已注册 AND 用户连续 5 次输入错误密码WHEN 用户第 6 次点击"登录"按钮THEN 页面显示"账号已锁定,请 15 分钟后重试" AND 锁定期间登录接口返回 HTTP 423AC-5: 未注册手机号登录
GIVEN 用户输入未注册的手机号和任意密码WHEN 用户点击"登录"按钮THEN 页面显示"该手机号未注册,请先注册"AC-6: 密码传输加密
GIVEN 用户在登录页输入密码WHEN 用户点击"登录"按钮THEN 请求体中密码字段为密文(非明文传输) AND 服务端日志不记录明文密码AC-7: 登录接口响应时间
GIVEN 系统正常运行WHEN 用户点击"登录"按钮THEN 登录接口响应时间 P95 ≤ 500ms AND 并发 100 用户同时登录时无超时