Skip to content

GWT 需求描述法:让 AI 听懂你的 Bug 和需求

向 AI 描述一个 Bug 或需求,本质上是在写一份可执行的验收测试。GWT(Given/When/Then)就是这份测试的语法。

问题:程序员为什么说不清需求

写过代码的人都有这种体验:明明脑子里已经跑通了整个流程,说出来却支离破碎。

「那个按钮点完之后要弹个框」 「列表加载太慢了优化一下」 「登录有时候不行」

这些话对同事说,对方能用点头和「懂的懂的」弥补信息缺口。但 AI 不会点头——它只会忠实地执行你字面上的指令,而非你脑子里的设想。

你对 AI 说的AI 实际理解的你实际想要的
「列表加载太慢了优化一下」可能是加 loading 动画首屏 2 秒内渲染完毕
「登录有时候不行」不知道什么时候、什么情况错误密码时不跳转也不提示
「弹个确认框」弹了,内容是什么不知道显示记录名称 + 确认/取消双按钮

模糊需求的本质:Given(前置)、When(动作)、Then(结果)三者至少缺失其一。

GWT:一套被验证过的需求语法

GWT 源于行为驱动开发(BDD),核心就三个问题:

要素含义检验标准
Given系统当前状态、用户是谁、有哪些数据不依赖上下文就能复现场景
When用户做了什么操作、输入了什么具体到可以照做一遍
Then期望的结果是什么、怎么验证可观测、可量化、可自动化

这三个问题回答清楚了,需求就描述清楚了一次

对 AI 同样适用。

与 ROSCE 框架的关系

在《AI时代的精准沟通》中,我们提到 ROSCE 框架(Role/Objective/Spec/Context/Example)是与 AI 沟通的通用范式。GWT 是 ROSCE 在需求描述场景下的具体化:

ROSCE 要素映射到 GWT
Role + ContextGiven — 角色、场景、前置数据
Objective + ExampleWhen — 具体操作与输入
SpecThen — 预期的输出格式与行为约束

ROSCE 是「怎么写指令」,GWT 是「怎么描述场景」。二者可以叠加使用。

GWT 三段详解

Given — 前置条件

前置条件决定 AI 的上下文边界。缺了它,AI 只能猜。

必须回答的问题:

  • 用户是谁?(角色/权限)
  • 系统处于什么状态?
  • 已存在哪些数据?
  • 当前在哪个页面/视图?
✅ 好:已登录的普通用户,在订单列表页,有 3 条订单:「办公桌」「办公椅」「台灯」
❌ 差:在列表页

When — 触发动作

这是最容易被跳过的部分——很多人默认「AI 应该知道我怎么操作」。

必须回答的问题:

  • 用户做了什么操作?
  • 输入了什么内容?
  • 发生的顺序是什么?
✅ 好:在搜索框输入"办公",点击搜索按钮(或等 300ms 自动触发)
❌ 差:搜一下

Then — 预期结果

最难写清楚的一环。模糊的 Then 是需求返工的根源。

必须回答的问题:

  • 发生了什么变化?
  • 看到了什么?听到了什么?
  • 数据如何更新?
  • 有什么反馈(提示/跳转/错误)?
  • 正常路径、异常路径、边界值各是什么?
✅ 好:列表仅显示「办公桌」「办公椅」;顶部显示"共 2 条";
     搜索无匹配时显示空态图 + "未找到相关订单"
❌ 差:搜出来结果就行

10 个实战示例

以下是编程开发中最常见的 10 类需求场景,每条展示从「模糊描述 → 完整 GWT」的转化。

1. Bug 报告:登录失败无提示

❌ 模糊:「登录有时候不行,也没提示。」

Scenario: 用户使用错误密码登录

Given 普通用户,在登录页,已注册 [email protected] / Pass1234

When 输入邮箱 [email protected]、密码 WrongPass,点击「登录」

Then

  • 页面不跳转
  • 密码框下方显示红色"密码错误,请重试"
  • 密码框内容清空,光标聚焦到密码框
  • 登录按钮保持可点击

2. 功能请求:搜索筛选

❌ 模糊:「列表页加个搜索,能按名字搜就行。」

Scenario: 用户按名字搜索订单

Given 已登录普通用户,在订单列表页,存在 3 条订单:办公桌办公椅台灯

When 在搜索框输入"办公"

Then

  • 列表仅显示 办公桌办公椅
  • 显示结果计数"共 2 条"
  • 清空搜索框恢复全部 3 条
  • 搜索无匹配时显示"未找到相关订单"空态图

3. UI 交互:删除确认弹窗

❌ 模糊:「删除按钮点完后弹个确认框,别直接删了。」

Scenario: 用户删除一条记录

Given 已登录普通用户,列表中有记录「测试项目 A」

When 点击该记录右侧的「删除」按钮

Then

  • 弹出模态确认框
  • 标题:「确认删除」,内容包含记录名称,标注"不可恢复"
  • 两个按钮:「取消」(灰色)和「确认删除」(红色)
  • 点取消关闭弹窗,列表不变
  • 点确认删除关闭弹窗,记录消失,顶部绿色提示"已删除"

4. 表单验证:注册校验

❌ 模糊:「注册页要做校验,邮箱格式不对要提示。」

Scenario: 用户提交不合规注册信息

Given 未登录用户,在注册页面

When 输入邮箱 not-an-email、密码 123,点击「注册」

Then

  • 邮箱框下方提示"请输入有效的邮箱地址"
  • 密码框下方提示"密码至少 6 位,需包含字母和数字"
  • 不发送请求,按钮无 loading 状态
  • 修正字段后对应错误提示即时消失

5. API 设计:分页接口

❌ 模糊:「列表数据多了,要分页。」

Scenario: 前端请求第二页订单

Given 数据库有 25 条订单,每页默认 10 条

When 发送 GET /api/orders?page=2&page_size=10

Then

  • data 数组包含第 11-20 条
  • total: 25page: 2page_size: 10
  • has_next: true
  • 请求 page=3has_next: false
  • 请求 page=0 返回 400 + "page 必须 ≥ 1"

6. 权限控制:角色访问拦截

❌ 模糊:「普通用户不能进管理后台。」

Scenario: 普通用户直接访问管理后台 URL

Given 角色为 user 的已登录用户

When 在地址栏输入 /admin/dashboard 并回车

Then

  • 重定向到首页 /
  • 顶部提示"无权访问该页面"
  • 不会短暂闪现后台内容再跳转(无闪烁)

7. 数据处理:导出 CSV

❌ 模糊:「报表要能导出成 Excel,人多的时候别超时。」

Scenario: 导出 10 万条记录的报表

Given 已登录管理员,在报表页,当前筛选条件下有 100,000 条记录

When 点击「导出 CSV」按钮

Then

  • 10 秒内触发浏览器下载(后端异步生成,非阻塞)
  • 文件名 report_YYYY-MM-DD.csv
  • 包含当前筛选条件的所有列
  • 导出期间页面可继续操作,显示进度"正在生成文件…"

8. 并发/竞态:按钮防抖

❌ 模糊:「提交按钮点快了会重复提交,加个防重复点击。」

Scenario: 快速多次点击提交按钮

Given 已登录用户,在表单页,所有必填项已填写

When 在 500ms 内连续点击「提交」按钮 3 次

Then

  • 仅发起 1 次 POST 请求
  • 第一次点击后按钮禁用,文字变为"提交中…"
  • 请求完成后按钮恢复可点击
  • 数据库仅创建 1 条记录

9. 错误处理:网络断开

❌ 模糊:「没网的时候要给个友好提示,别白屏。」

Scenario: 弱网环境下加载列表

Given 已登录用户,在订单列表页,设备网络已断开

When 下拉刷新列表

Then

  • 保留上次成功加载的数据不消失
  • 顶部出现黄色横幅"网络连接异常,请检查网络后重试"
  • 横幅右侧有「重试」按钮
  • 不弹出系统级报错,不出现白屏

10. 性能需求:首屏加载

❌ 模糊:「首页太慢了,优化一下。」

Scenario: 访客首次访问首页

Given 未登录访客,4G 网络(下行 5Mbps,延迟 100ms),浏览器缓存为空

When 在地址栏输入首页 URL 并回车

Then

  • 首屏内容(Above the fold)在 2 秒内可见
  • LCP < 2.5s,FID < 100ms,CLS < 0.1
  • 图片使用懒加载,占位图先显示

常见错误

错误为什么错修正
把操作细节放进 GivenGiven 是状态,不是动作When 描述操作,Given 只描述操作前状态
多个动作塞进一个 When场景混杂,AI 顾此失彼拆分为独立场景
Then 不可验证"体验好""速度快"无法测量给出可观测的具体指标或行为
替 AI 脑补缺失部分AI 不补你脑中的上下文宁可多写也不假设
在 When 中描述系统行为When 是用户行为系统行为归 Then
缺少异常路径AI 只处理你描述的场景至少覆盖空态、错误态、边界值

总结

GWT 是程序员的需求描述语法。与 ROSCE 框架结合使用时,效果最佳:

  • ROSCE 定义范围:角色、目标、格式约束
  • GWT 定义场景:前置条件、触发动作、预期结果

下次向 AI 描述需求时,试试这个检查清单:

  1. □ Given:AI 能复现场景吗?
  2. □ When:AI 能照做一遍吗?
  3. □ Then:AI 能验证结果吗?
  4. □ 异常路径:空态、错误态、边界值覆盖了吗?

三个全打勾再发送——你会发现「AI 理解错了」的频率大幅下降。

与 AI 沟通,不是「说话的艺术」,而是「需求分析的纪律」。

参考

Released under the ISC License.