从 PRD 需求文档生成测试用例(飞书在线表格)
流程:前置检查 → 获取需求 → 搭整体结构 → 按测试方法写用例 → 自检 → 写入飞书表格
一、前置检查
1.1 飞书模板表格(必须提供)
- 用户必须提供飞书表格 URL:
https://xxx.feishu.cn/sheets/{spreadsheet_token}?sheet={sheet_id}。未提供先索要,拿到前不要开始生成用例。 - 解析:
/sheets/后的段为spreadsheet_token,?sheet=为模板sheet_id(缺失时询问用哪个工作表)。 - 用例写入该文档本身:复制模板工作表为新工作表(保留样式、下拉、高亮),不创建新文件,不改动任何已有工作表。
- 需要文档编辑权限,写入报错时提示用户开通。
1.2 lark-cli 就绪(未就绪依次执行)
lark-cli --version;未安装则npm install -g @larksuite/cli。lark-cli auth status:
- 无 appId → 后台运行lark-cli config init --new --lang zh,把输出中的https://open.feishu.cn/page/cli?user_code=...链接发给用户,等待完成。
- user 身份缺失 → 后台运行lark-cli auth login --recommend,取输出中的授权链接,并用lark-cli auth qrcode "<链接>" --output qrcode.png生成二维码,链接 + 二维码一并发给用户,等待完成。
- 完成后再查auth status确认 bot/user 均ready,记下 user 的openId与userName(写执行人用)。- 注意:
--output、@file只接受当前目录内相对路径;文件内容优先走 stdin(--csv -、--cells -)。
二、获取需求
- Figma 链接:用 Figma MCP
get_design_context获取说明与截图。/design/{fileKey}/段为 fileKey;node-id=51033-172112→ nodeId51033:172112。 - 本地文档:直接读取(md/docx/pdf 等);都没有时请用户粘贴需求要点与界面说明。
- 项目内有相关业务知识库文档时先读取,沿用其中的术语、规则与状态定义。
三、先定整体结构,再填用例
按以下顺序搭结构,写完一个功能点再写下一个:
- 功能入口:有/无权限时入口是否显示、可点击。
- 整体页面:整体布局、区域、主要模块与设计图一致。
- 各功能点:先整块(如筛选功能),再块内子项(各筛选条件、列表字段、操作列等)。每个功能点内部固定顺序:界面显示 → 正常流程 → 异常流程 → 专项异常;界面验证写在功能点内,不单独设「界面与交互」大块。
四、测试方法(充实每个功能点)
| 方法 | 怎么用 |
|---|---|
| 等价类 | 每个输入项/状态/角色拆有效、无效等价类,各至少 1 条;有效预期成功,无效预期提示/拦截 |
| 边界值 | 有范围的取 最小值-1、最小值、中间值、最大值、最大值+1;长度/个数取 空、1、上限、上限+1 |
| 场景法 | 主流程端到端至少 1 条;关键分支(不同角色/状态/选择)各 1 条;前置不满足、顺序颠倒、重复操作各 1 条 |
| 判定表 | 多条件组合影响结果时(组合筛选、多开关叠加),列组合逐条验证 |
| 错误推测(专项异常) | 防抖/重复提交、弱网超时、断网、中途刷新/离开、接口 4xx/5xx、越权与注入、多端并发、无权限/无数据空态 |
专项异常写在对应功能点内;全局性的(整站断网、整站权限)可单独一小节,不重复。
常见控件模板(识别到即至少覆盖,业务独有逻辑在此之上追加):
| 控件 | 至少覆盖 |
|---|---|
| 输入框 | 默认文案、输入回显、长度限制、必填提示 |
| 下拉/级联选择 | 默认状态、选项与层级、选择回显、必填 |
| 图片/文件上传 | 点击上传、格式限制、大小限制、必填与回显 |
| 保存/提交按钮 | 全空点击提示、仅必填保存、全部填完保存、重复点击防抖 |
| 列表/表格+筛选 | 默认排序与分页、单条件筛选、组合筛选、空状态 |
五、书写规范(每条用例必守)
| 列 | 规则 |
|---|---|
| 用例名称 | 统一「验证xxx」 |
| 用例属性 | 主流程/界面/功能/接口 |
| 优先级 | 高/中/低 |
| 前置条件 | 写明页面与数据状态,可据此还原起点;从已登录、有权限之后写起 |
| 操作步骤 | 「在哪里 + 做什么 + 对象/取值」,他人可直接执行 |
| 预期结果 | 可观测可判断(具体文案、条数、状态),禁止只写「正常」「正确」「成功」 |
- 一条用例一个场景:不合并多种输入或多种预期。
- 枚举值必拆:状态、角色、类型、开关、页签等每个取值单独一条用例,各写自己的前置数据与预期。名称里出现「各个」「所有」「不同」或用「、」「/」连接多个取值即为未拆。
- ❌ 验证任务状态-待执行、执行中、已执行各状态展示
- ✅ 拆三条:验证任务状态-待执行 / -执行中 / -已执行,前置分别构造对应状态数据,预期分别写该状态的具体展示
- 继承留空:同一「模块」「测试点」下多条用例,首行填写,同组后续行留空表示继承(写入后合并单元格);同组内「前置条件」「操作步骤」与上一条完全相同时也留空。内容有任何差异则必须完整填写。
六、自检(写入前必做)
- 去重:同一页面/控件的界面验证只保留一处(放在对应功能点内)。
- 拆分:名称或预期中含「各个」「所有」「不同」或并列多个取值的,按枚举值拆开。
- 覆盖率:每个控件按模板覆盖;主流程端到端至少 1 条;专项异常覆盖防抖、弱网/断网、报错、越权。
- 可用性:逐条检查步骤可执行、预期可观测、前置可复现,不满足则改写。
七、写入飞书在线表格(lark-cli)
模板布局:第 1 行表头(A~I 为 模块、测试点、用例名称、用例属性、优先级、前置条件、操作步骤、预期结果、备注,其后为执行时填写列)、第 2 行执行人、第 3 行需求目标,数据从第 4 行开始。写入前用 +csv-get 读模板前 4 行确认,布局不同以实际为准。
1. 复制模板工作表(返回的新 sheet_id 即写入目标;同名已存在时改用「{需求名}-日期」):
lark-cli sheets +sheet-copy --spreadsheet-token {spreadsheet_token} \
--sheet-id {模板sheet_id} --title "{需求名}"
2. 写表头信息(A1:B3 一次写入,{} 表示不修改):
echo '[
[{"value":"模块"}, {}],
[{}, {"rich_text":[{"type":"text","text":"测试:用例&一轮执行人:"},{"type":"mention","mention_type":0,"mention_token":"{openId}","text":"@{userName}","notify":false},{"type":"text","text":" 二轮执行人: "}]}],
[{}, {"value":"{需求名}"}]
]' | lark-cli sheets +cells-set --spreadsheet-token {spreadsheet_token} \
--sheet-id {新sheet_id} --range "A1:B3" --cells -
3. 写用例数据:先用 Python 把用例组织成 rows(每条一个 list,与 9 列对齐,继承列填 ""),写 CSV(csv.writer 自动转义换行与逗号):
import csv
rows = [
["题目列表-筛选", "题目ID筛选", "验证题目ID筛选-有效ID", "功能", "高",
"列表中存在ID为1001的题目",
"1.进入题目列表页\n2.在题目ID输入框输入1001\n3.点击查询",
"列表仅展示ID为1001的1条记录", ""],
]
with open('/tmp/cases.csv', 'w', newline='', encoding='utf-8') as f:
csv.writer(f).writerows(rows)
cat /tmp/cases.csv | lark-cli sheets +csv-put \
--spreadsheet-token {spreadsheet_token} --sheet-id {新sheet_id} --start-cell A4 --csv -
# 校验返回 updated_range == A4:I{3+用例数}
4. 合并模块/测试点单元格:按 rows 计算 A、B 列连续同组区间(组内首行有值、后续为空,行号 = 数据下标 + 4),对每个跨多行区间执行:
lark-cli sheets +cells-merge --spreadsheet-token {spreadsheet_token} \
--sheet-id {新sheet_id} --range "A4:A6"
5. 核对与汇报:+csv-get 回读首尾几行比对,确认数据区后一行为空;汇报新工作表链接 https://xxx.feishu.cn/sheets/{spreadsheet_token}?sheet={新sheet_id}、用例总数、各优先级/属性条数、覆盖的功能点、合并处数;清理临时文件(CSV、二维码等)。