参考:https://testerhome.com/topics/43843 加深对skills的操作理解
cursor中chat,操作斜杠 /
js/create-skill 根据需求文档,用生成测试用例,需要覆盖正向、逆向、异常、并发场景。
会生成对应的skill.md 继续chat优化
js@SKILL.md 我希望用例输出格式,同时生成markdown、json、excel(.xlsx)
同时技能名称改为: testcase-generator
去豆包操作:
js帮我生成一份用户登录的需求文档,用word格式输出,支持下载
最后生成出来的skill.md为:
js---
name: testcase-generator
description: >-
Derives structured test cases from requirement documents (PRD, user stories,
acceptance criteria), explicitly covering positive paths, negative or invalid
flows, exception and failure modes, and concurrency or race-related behavior.
Delivers the same case set in three formats in one pass: Markdown, JSON, and
Excel (.xlsx). Use when the user supplies requirements, asks for test design
or 测试用例, or mentions 正向、逆向、异常、并发 coverage from specs.
---
# 需求驱动测试用例生成(多格式输出)
## 何时使用
用户给出需求文档、验收标准、接口说明或用户故事,需要系统化产出可执行的测试设计时启用本技能。
## 前置信息
若需求中缺失,先向用户确认或标注为「待确认」:
- 被测范围(模块 / 接口 / 页面 / 流程)
- 环境与数据前提(账号角色、配置开关、依赖服务)
- 成功判据与错误码 / 提示文案约定
## 四类场景(必须覆盖)
| 类型 | 含义 | 设计要点 |
|------|------|----------|
| **正向** | 合法输入、权限足够、依赖正常下的主流程与分支成功路径 | 每条核心需求至少一条主路径;关键可选分支单独用例 |
| **逆向** | 业务规则不满足、非法参数、无权限、状态不允许等「预期失败」 | 与规则一一对应;边界值与等价类 |
| **异常** | 系统或外部依赖异常:超时、宕机、网络错误、返回非预期结构 | 可降级、重试、熔断时的预期行为 |
| **并发** | 多用户 / 多请求同时操作:竞态、重复提交、幂等、顺序敏感资源 | 锁、版本号、唯一约束、队列语义 |
若需求未写并发,仍应基于「同一资源被多请求修改」「重复点击 / 重试」等典型风险补充并发类用例,并标明假设。
## 工作流程
1. **拆解需求**:列出功能点、接口、状态机、权限与外部依赖。
2. **建映射表**:每个功能点至少覆盖四类场景之一;核心功能四类都要有。
3. **写用例**:按下方字段建模;编号可追溯需求条目(如 REQ-3.2)。
4. **多格式输出(必须同批交付)**:用**同一套用例数据**生成以下三份文件并写入工作区(路径与 basename 由用户指定;未指定时用 `test-cases`):
- `test-cases.md` — Markdown 文档(含分功能表格,见模板)
- `test-cases.json` — 结构化 JSON(见 schema)
- `test-cases.xlsx` — Excel 工作簿,**工作表可与功能域对应,或单表「全部用例」**;列与 JSON 字段一致
5. **自检**:用文末检查清单扫一遍缺口。
生成 `.xlsx` 时优先用环境已有依赖(如 Python `openpyxl` / `pandas`,或 Node `exceljs`);若无则安装最小依赖后写入文件,确保表格可打开且表头为英文或中英并列(与 JSON 键一致)。
## 用例字段(Markdown / JSON / Excel 对齐)
| 键名 (JSON) | Excel 列 / Markdown 表头 | 说明 |
|-------------|---------------------------|------|
| `id` | 编号 | 如 TC-001 |
| `requirementRef` | 关联需求 | 如 REQ-3.2 |
| `scenarioType` | 场景类型 | 正向 / 逆向 / 异常 / 并发 |
| `precondition` | 前置条件 | |
| `steps` | 步骤 | 多步用换行或 `"; "` 串接(Excel 单格内) |
| `inputOrAction` | 输入 / 操作 | |
| `expectedResult` | 预期结果 | 可判定、具体 |
| `remarks` | 备注 | 可选 |
**场景类型**必须出现四类标签之一(可多条同属一类时拆成多条用例或备注说明)。
## JSON Schema(约定)
根对象含 `meta`(可选:`title`, `source`, `generatedAt`)与 `testCases` 数组。每项为对象,字段见上表;`steps` 可为字符串(多步文本)或字符串数组。
```json
{
"meta": { "title": "…", "source": "…", "generatedAt": "2026-03-28" },
"testCases": [
{
"id": "TC-001",
"feature": "登录",
"requirementRef": "REQ-1",
"scenarioType": "正向",
"precondition": "…",
"steps": "1. …\n2. …",
"inputOrAction": "…",
"expectedResult": "…",
"remarks": ""
}
]
}
feature 列或 meta 可用于分组;JSON 中保留 feature(或 module)便于过滤。inputOrAction / precondition 中给出代表性取值(含边界);接口测试在步骤或输入中注明 HTTP 方法、路径、关键字段。markdown# 测试用例 — [标题]
## [功能 / 接口名称]
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-001 | REQ-x | 正向 | … | 1. … | … | … | |
| TC-002 | REQ-x | 逆向 | … | | 非法 … | 拒绝 + 明确提示 / 错误码 | |
| TC-003 | REQ-x | 异常 | … | | 模拟依赖超时 | 降级 / 重试 / 用户可见反馈 | |
| TC-004 | REQ-x | 并发 | … | | 双请求同时 … | 数据一致 / 幂等 / 无脏写 | |
在完成输出前逐项确认:
.md、.json、.xlsx)已写入且用例条数与内容一致需求:用户仅可删除本人草稿;删除后列表不再展示。
| 编号 | 场景类型 | 步骤概要 | 预期 |
|---|---|---|---|
| TC-A1 | 正向 | 本人 + 草稿 → 删除 | 成功,列表无该条 |
| TC-A2 | 逆向 | 他人草稿 → 删除 | 403 或业务错误码 |
| TC-A3 | 逆向 | 已发布 → 删除 | 不允许删除 |
| TC-A4 | 异常 | 存储服务报错 | 提示失败,草稿仍存在 |
| TC-A5 | 并发 | 两次同时删除同一草稿 | 一次成功,一次幂等或明确冲突 |
保持 SKILL 简洁:不写通用测试理论长文;若用户指定框架(JUnit、Pytest、Postman 等),在相同结构下改为该框架的用例格式即可,但仍应同步产出对齐的 JSON 与 xlsx(或在该情况下与用户约定仅保留 Markdown + JSON)。
下载word文档,拖进cursor目录 然后去对比生成效果 ```js /testcase-generator @用户登录功能需求文档.docx
可以发现,生成出来的无论是JSON、MD、还是Excel,都是很完善 json:
js{
"meta": {
"title": "用户登录功能",
"source": "用户登录功能需求文档.docx",
"generatedAt": "2026-03-28"
},
"testCases": [
{
"id": "TC-001",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1 / 4.1",
"scenarioType": "正向",
"precondition": "账号已注册;服务正常",
"steps": "1. 打开登录页\n2. 输入合法11位大陆手机号\n3. 输入正确密码\n4. 点击登录",
"inputOrAction": "手机号+密码",
"expectedResult": "验证通过,创建登录态,跳转系统首页",
"remarks": ""
},
{
"id": "TC-002",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1",
"scenarioType": "正向",
"precondition": "账号已注册",
"steps": "1. 输入注册邮箱与正确密码\n2. 点击登录",
"inputOrAction": "邮箱+密码",
"expectedResult": "登录成功,进入首页",
"remarks": ""
},
{
"id": "TC-003",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1",
"scenarioType": "正向",
"precondition": "账号已注册",
"steps": "1. 输入注册用户名与正确密码\n2. 点击登录",
"inputOrAction": "用户名+密码",
"expectedResult": "登录成功,进入首页",
"remarks": ""
},
{
"id": "TC-004",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1 / 附录8.1",
"scenarioType": "逆向",
"precondition": "无",
"steps": "1. 输入非法手机号(非11位或号段不合规)\n2. 输入任意密码\n3. 点击登录",
"inputOrAction": "错误手机号",
"expectedResult": "提示「请输入正确的中国大陆手机号」;边框红色;不创建登录态",
"remarks": ""
},
{
"id": "TC-005",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1 / 附录8.1",
"scenarioType": "逆向",
"precondition": "无",
"steps": "1. 输入不符合邮箱格式的字符串\n2. 点击登录或失焦校验",
"inputOrAction": "错误邮箱",
"expectedResult": "提示「请输入正确的邮箱地址」",
"remarks": ""
},
{
"id": "TC-006",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1 / 5.2 / 附录8.1",
"scenarioType": "逆向",
"precondition": "已注册账号",
"steps": "1. 输入正确账号\n2. 输入错误密码\n3. 点击登录",
"inputOrAction": "错误密码",
"expectedResult": "提示「账号或密码错误,请重新输入(剩余X次机会)」;不泄露是否注册",
"remarks": ""
},
{
"id": "TC-007",
"feature": "账号密码登录",
"requirementRef": "REQ-5.2 / 6",
"scenarioType": "逆向",
"precondition": "该手机号未注册",
"steps": "1. 输入未注册手机号+任意密码\n2. 登录",
"inputOrAction": "未注册",
"expectedResult": "提示「账号或密码错误」类统一文案;不提示「该手机号未注册」",
"remarks": ""
},
{
"id": "TC-008",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1 / 3.2",
"scenarioType": "正向",
"precondition": "在密码框",
"steps": "1. 输入密码\n2. 点击「显示密码」\n3. 再次点击",
"inputOrAction": "切换显示",
"expectedResult": "密码在隐藏/可见间切换,图标同步变化",
"remarks": ""
},
{
"id": "TC-009",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.6 / 5.1",
"scenarioType": "异常",
"precondition": "可模拟依赖故障",
"steps": "1. 正确账号密码\n2. 登录接口超时或认证服务不可用",
"inputOrAction": "Mock 超时/5xx",
"expectedResult": "用户可见失败或重试提示;不错误创建登录态;行为符合降级约定(若有)",
"remarks": "需环境可模拟"
},
{
"id": "TC-010",
"feature": "账号密码登录",
"requirementRef": "REQ-2.2.1 / 4.1",
"scenarioType": "并发",
"precondition": "同一浏览器会话",
"steps": "1. 快速连续双击「登录」\n2. 或并行重复提交",
"inputOrAction": "重复提交",
"expectedResult": "仅一次有效登录或后端幂等;无重复会话脏数据",
"remarks": ""
},
{
"id": "TC-011",
"feature": "账号锁定",
"requirementRef": "REQ-2.2.6 / 附录8.1",
"scenarioType": "逆向",
"precondition": "已注册账号",
"steps": "连续5次输入错误密码",
"inputOrAction": "错误密码×5",
"expectedResult": "第5次后提示「账号已锁定,请15分钟后再试…」;锁定期内无法提交登录",
"remarks": ""
},
{
"id": "TC-012",
"feature": "账号锁定",
"requirementRef": "REQ-2.2.6",
"scenarioType": "正向",
"precondition": "账号因错误已锁定",
"steps": "通过忘记密码完成重置",
"inputOrAction": "重置成功",
"expectedResult": "账号自动解锁;可用新密码登录",
"remarks": ""
},
{
"id": "TC-013",
"feature": "快捷登录",
"requirementRef": "REQ-2.2.2 / 4.2",
"scenarioType": "正向",
"precondition": "手机号已注册",
"steps": "1. 切换快捷登录\n2. 合法手机号\n3. 获取验证码\n4. 输入正确验证码\n5. 登录",
"inputOrAction": "短信验证码",
"expectedResult": "创建登录态,跳转首页",
"remarks": ""
},
{
"id": "TC-014",
"feature": "快捷登录",
"requirementRef": "REQ-2.2.2 / 附录8.1",
"scenarioType": "逆向",
"precondition": "验证码有效但未输对",
"steps": "输入错误验证码后点登录",
"inputOrAction": "错误验证码",
"expectedResult": "提示「验证码输入错误,请重新输入」",
"remarks": ""
},
{
"id": "TC-015",
"feature": "快捷登录",
"requirementRef": "REQ-2.2.2 / 附录8.1",
"scenarioType": "逆向",
"precondition": "验证码已超过5分钟",
"steps": "输入曾正确但已过期验证码",
"inputOrAction": "过期验证码",
"expectedResult": "提示「验证码已过期,请重新获取」",
"remarks": ""
},
{
"id": "TC-016",
"feature": "快捷登录",
"requirementRef": "REQ-2.2.2 / 附录8.1",
"scenarioType": "逆向",
"precondition": "同一手机号1小时内已获取3次",
"steps": "第4次点击获取验证码",
"inputOrAction": "超频",
"expectedResult": "提示「获取过于频繁,请稍后再试」",
"remarks": ""
},
{
"id": "TC-017",
"feature": "快捷登录",
"requirementRef": "REQ-3.2",
"scenarioType": "正向",
"precondition": "刚获取验证码",
"steps": "点击获取验证码后观察按钮",
"inputOrAction": "—",
"expectedResult": "进入60秒倒计时;期间不可点;结束后显示「重新获取」",
"remarks": ""
},
{
"id": "TC-018",
"feature": "快捷登录",
"requirementRef": "REQ-2.2.2 / 5.1",
"scenarioType": "异常",
"precondition": "短信网关故障",
"steps": "获取验证码时网关失败",
"inputOrAction": "发送失败",
"expectedResult": "用户可见明确失败提示;不进入错误倒计时或允许重试",
"remarks": "需可模拟"
},
{
"id": "TC-019",
"feature": "快捷登录",
"requirementRef": "REQ-2.2.2",
"scenarioType": "并发",
"precondition": "同一验证码未消费",
"steps": "两个终端几乎同时使用同一验证码登录",
"inputOrAction": "双端登录",
"expectedResult": "仅一次成功或第二次明确失败;会话与风控符合产品约定",
"remarks": "假设:验证码单次有效"
},
{
"id": "TC-020",
"feature": "记住密码",
"requirementRef": "REQ-2.2.3",
"scenarioType": "正向",
"precondition": "勾选记住密码且登录成功",
"steps": "1. 勾选记住密码\n2. 登录成功\n3. 关闭后再次打开",
"inputOrAction": "—",
"expectedResult": "7天内自动填充账号密码(加密本地存储,非明文)",
"remarks": ""
},
{
"id": "TC-021",
"feature": "记住密码",
"requirementRef": "REQ-2.2.3 / 2.2.5",
"scenarioType": "正向",
"precondition": "曾记住密码且已登录",
"steps": "点击退出并确定",
"inputOrAction": "退出登录",
"expectedResult": "清除本地保存的账号密码;下次需重输",
"remarks": ""
},
{
"id": "TC-022",
"feature": "记住密码",
"requirementRef": "REQ-2.2.3",
"scenarioType": "逆向",
"precondition": "本地已保存超过7天",
"steps": "超过有效期后打开登录页",
"inputOrAction": "—",
"expectedResult": "不再自动填充或已清除;需重新输入",
"remarks": "可配合调时钟或Mock"
},
{
"id": "TC-023",
"feature": "密码找回",
"requirementRef": "REQ-2.2.4 / 4.3",
"scenarioType": "正向",
"precondition": "注册手机号可用",
"steps": "手机找回:手机号→验证码→新密码→确认→重置",
"inputOrAction": "符合规范的新密码",
"expectedResult": "提示成功;可用新密码登录",
"remarks": ""
},
{
"id": "TC-024",
"feature": "密码找回",
"requirementRef": "REQ-2.2.4 / 4.3",
"scenarioType": "正向",
"precondition": "注册邮箱可用",
"steps": "邮箱找回全流程",
"inputOrAction": "邮箱+验证码+新密码",
"expectedResult": "重置成功,可登录",
"remarks": ""
},
{
"id": "TC-025",
"feature": "密码找回",
"requirementRef": "REQ-2.2.4 / 附录8.1",
"scenarioType": "逆向",
"precondition": "两次新密码不一致",
"steps": "确认密码与第一次不同",
"inputOrAction": "—",
"expectedResult": "提示「两次密码输入不一致,请重新输入」",
"remarks": ""
},
{
"id": "TC-026",
"feature": "密码找回",
"requirementRef": "REQ-2.2.4 / 附录8.1",
"scenarioType": "逆向",
"precondition": "新密码不合规",
"steps": "少于8位或缺少两类字符等",
"inputOrAction": "弱密码",
"expectedResult": "提示「密码需为8-20位,包含字母、数字及特殊符号至少两种」",
"remarks": ""
},
{
"id": "TC-027",
"feature": "密码找回",
"requirementRef": "REQ-2.2.4 / 5.1",
"scenarioType": "异常",
"precondition": "重置接口失败",
"steps": "验证码与新密码均合法但服务端错误",
"inputOrAction": "5xx/超时",
"expectedResult": "明确失败提示;密码未被错误更新",
"remarks": "需可模拟"
},
{
"id": "TC-028",
"feature": "退出登录",
"requirementRef": "REQ-2.2.5 / 4.4",
"scenarioType": "正向",
"precondition": "已登录",
"steps": "点退出→确定",
"inputOrAction": "—",
"expectedResult": "清除登录态;跳转登录页;Token 失效",
"remarks": ""
},
{
"id": "TC-029",
"feature": "退出登录",
"requirementRef": "REQ-4.4",
"scenarioType": "正向",
"precondition": "弹出确认框",
"steps": "点取消",
"inputOrAction": "—",
"expectedResult": "留在当前页;登录态保持",
"remarks": ""
},
{
"id": "TC-030",
"feature": "异地登录提醒",
"requirementRef": "REQ-2.2.6",
"scenarioType": "正向",
"precondition": "判定为异地新设备/IP",
"steps": "在新环境登录成功",
"inputOrAction": "—",
"expectedResult": "向注册手机号发送提醒短信(时间、地点、设备);含非本人处理入口(若需求实现)",
"remarks": "文案以实际短信为准"
},
{
"id": "TC-031",
"feature": "登录态与Token",
"requirementRef": "REQ-5.2",
"scenarioType": "异常",
"precondition": "已登录超过2小时无刷新",
"steps": "访问需鉴权接口或定时校验",
"inputOrAction": "Token过期",
"expectedResult": "自动退出或要求重新登录;旧Token不可用",
"remarks": ""
},
{
"id": "TC-032",
"feature": "界面交互",
"requirementRef": "REQ-3.2",
"scenarioType": "逆向",
"precondition": "登录页",
"steps": "账号或密码未填全或格式未通过",
"inputOrAction": "—",
"expectedResult": "「登录」置灰不可点;填全且合法后高亮可点",
"remarks": ""
},
{
"id": "TC-033",
"feature": "界面交互",
"requirementRef": "REQ-3.2 / 5.4",
"scenarioType": "正向",
"precondition": "焦点在密码框",
"steps": "按 Enter",
"inputOrAction": "—",
"expectedResult": "触发提交登录(与点登录一致)",
"remarks": ""
},
{
"id": "TC-034",
"feature": "界面交互",
"requirementRef": "REQ-3.2",
"scenarioType": "正向",
"precondition": "点击登录后",
"steps": "等待响应",
"inputOrAction": "—",
"expectedResult": "显示「登录中,请稍候」加载态;结束后成功自动消失/失败停留至操作",
"remarks": ""
},
{
"id": "TC-035",
"feature": "安全与传输",
"requirementRef": "REQ-5.2",
"scenarioType": "正向",
"precondition": "浏览器开发者工具",
"steps": "提交登录请求",
"inputOrAction": "HTTPS",
"expectedResult": "密码传输走HTTPS;本地记住密码为加密存储",
"remarks": ""
},
{
"id": "TC-036",
"feature": "性能",
"requirementRef": "REQ-5.1",
"scenarioType": "正向",
"precondition": "正常负载",
"steps": "账号密码登录一次",
"inputOrAction": "—",
"expectedResult": "端到端登录请求响应≤1秒(验收环境约定口径)",
"remarks": "需在测试环境压测/监控"
},
{
"id": "TC-037",
"feature": "注册引导",
"requirementRef": "REQ-3.1 / 6",
"scenarioType": "正向",
"precondition": "登录页",
"steps": "点击「还没有账号?立即注册」",
"inputOrAction": "—",
"expectedResult": "跳转注册页",
"remarks": ""
},
{
"id": "TC-038",
"feature": "忘记密码入口",
"requirementRef": "REQ-2.2.4 / 3.1",
"scenarioType": "正向",
"precondition": "登录页",
"steps": "点击忘记密码",
"inputOrAction": "—",
"expectedResult": "进入密码找回页",
"remarks": ""
},
{
"id": "TC-039",
"feature": "验证码通用",
"requirementRef": "REQ-5.2 / 6",
"scenarioType": "逆向",
"precondition": "已使用过或错误的码",
"steps": "重复使用同一验证码",
"inputOrAction": "—",
"expectedResult": "第二次失败;单次有效、用后失效",
"remarks": ""
},
{
"id": "TC-040",
"feature": "并发",
"requirementRef": "REQ-2.2.1 / 4.1",
"scenarioType": "并发",
"precondition": "多浏览器同账号",
"steps": "几乎同时用正确密码登录",
"inputOrAction": "双会话",
"expectedResult": "策略符合产品(允许多端或踢下线);数据一致、无异常报错",
"remarks": "待确认产品会话策略"
}
]
}
md
js# 测试用例 — 用户登录功能
> 来源:用户登录功能需求文档.docx | 生成日期:2026-03-28
## 账号密码登录
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-001 | REQ-2.2.1 / 4.1 | 正向 | 账号已注册;服务正常 | 1. 打开登录页<br>2. 输入合法11位大陆手机号<br>3. 输入正确密码<br>4. 点击登录 | 手机号+密码 | 验证通过,创建登录态,跳转系统首页 | |
| TC-002 | REQ-2.2.1 | 正向 | 账号已注册 | 1. 输入注册邮箱与正确密码<br>2. 点击登录 | 邮箱+密码 | 登录成功,进入首页 | |
| TC-003 | REQ-2.2.1 | 正向 | 账号已注册 | 1. 输入注册用户名与正确密码<br>2. 点击登录 | 用户名+密码 | 登录成功,进入首页 | |
| TC-004 | REQ-2.2.1 / 附录8.1 | 逆向 | 无 | 1. 输入非法手机号(非11位或号段不合规)<br>2. 输入任意密码<br>3. 点击登录 | 错误手机号 | 提示「请输入正确的中国大陆手机号」;边框红色;不创建登录态 | |
| TC-005 | REQ-2.2.1 / 附录8.1 | 逆向 | 无 | 1. 输入不符合邮箱格式的字符串<br>2. 点击登录或失焦校验 | 错误邮箱 | 提示「请输入正确的邮箱地址」 | |
| TC-006 | REQ-2.2.1 / 5.2 / 附录8.1 | 逆向 | 已注册账号 | 1. 输入正确账号<br>2. 输入错误密码<br>3. 点击登录 | 错误密码 | 提示「账号或密码错误,请重新输入(剩余X次机会)」;不泄露是否注册 | |
| TC-007 | REQ-5.2 / 6 | 逆向 | 该手机号未注册 | 1. 输入未注册手机号+任意密码<br>2. 登录 | 未注册 | 提示「账号或密码错误」类统一文案;不提示「该手机号未注册」 | |
| TC-008 | REQ-2.2.1 / 3.2 | 正向 | 在密码框 | 1. 输入密码<br>2. 点击「显示密码」<br>3. 再次点击 | 切换显示 | 密码在隐藏/可见间切换,图标同步变化 | |
| TC-009 | REQ-2.2.6 / 5.1 | 异常 | 可模拟依赖故障 | 1. 正确账号密码<br>2. 登录接口超时或认证服务不可用 | Mock 超时/5xx | 用户可见失败或重试提示;不错误创建登录态;行为符合降级约定(若有) | 需环境可模拟 |
| TC-010 | REQ-2.2.1 / 4.1 | 并发 | 同一浏览器会话 | 1. 快速连续双击「登录」<br>2. 或并行重复提交 | 重复提交 | 仅一次有效登录或后端幂等;无重复会话脏数据 | |
## 账号锁定
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-011 | REQ-2.2.6 / 附录8.1 | 逆向 | 已注册账号 | 连续5次输入错误密码 | 错误密码×5 | 第5次后提示「账号已锁定,请15分钟后再试…」;锁定期内无法提交登录 | |
| TC-012 | REQ-2.2.6 | 正向 | 账号因错误已锁定 | 通过忘记密码完成重置 | 重置成功 | 账号自动解锁;可用新密码登录 | |
## 快捷登录
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-013 | REQ-2.2.2 / 4.2 | 正向 | 手机号已注册 | 1. 切换快捷登录<br>2. 合法手机号<br>3. 获取验证码<br>4. 输入正确验证码<br>5. 登录 | 短信验证码 | 创建登录态,跳转首页 | |
| TC-014 | REQ-2.2.2 / 附录8.1 | 逆向 | 验证码有效但未输对 | 输入错误验证码后点登录 | 错误验证码 | 提示「验证码输入错误,请重新输入」 | |
| TC-015 | REQ-2.2.2 / 附录8.1 | 逆向 | 验证码已超过5分钟 | 输入曾正确但已过期验证码 | 过期验证码 | 提示「验证码已过期,请重新获取」 | |
| TC-016 | REQ-2.2.2 / 附录8.1 | 逆向 | 同一手机号1小时内已获取3次 | 第4次点击获取验证码 | 超频 | 提示「获取过于频繁,请稍后再试」 | |
| TC-017 | REQ-3.2 | 正向 | 刚获取验证码 | 点击获取验证码后观察按钮 | — | 进入60秒倒计时;期间不可点;结束后显示「重新获取」 | |
| TC-018 | REQ-2.2.2 / 5.1 | 异常 | 短信网关故障 | 获取验证码时网关失败 | 发送失败 | 用户可见明确失败提示;不进入错误倒计时或允许重试 | 需可模拟 |
| TC-019 | REQ-2.2.2 | 并发 | 同一验证码未消费 | 两个终端几乎同时使用同一验证码登录 | 双端登录 | 仅一次成功或第二次明确失败;会话与风控符合产品约定 | 假设:验证码单次有效 |
## 记住密码
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-020 | REQ-2.2.3 | 正向 | 勾选记住密码且登录成功 | 1. 勾选记住密码<br>2. 登录成功<br>3. 关闭后再次打开 | — | 7天内自动填充账号密码(加密本地存储,非明文) | |
| TC-021 | REQ-2.2.3 / 2.2.5 | 正向 | 曾记住密码且已登录 | 点击退出并确定 | 退出登录 | 清除本地保存的账号密码;下次需重输 | |
| TC-022 | REQ-2.2.3 | 逆向 | 本地已保存超过7天 | 超过有效期后打开登录页 | — | 不再自动填充或已清除;需重新输入 | 可配合调时钟或Mock |
## 密码找回
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-023 | REQ-2.2.4 / 4.3 | 正向 | 注册手机号可用 | 手机找回:手机号→验证码→新密码→确认→重置 | 符合规范的新密码 | 提示成功;可用新密码登录 | |
| TC-024 | REQ-2.2.4 / 4.3 | 正向 | 注册邮箱可用 | 邮箱找回全流程 | 邮箱+验证码+新密码 | 重置成功,可登录 | |
| TC-025 | REQ-2.2.4 / 附录8.1 | 逆向 | 两次新密码不一致 | 确认密码与第一次不同 | — | 提示「两次密码输入不一致,请重新输入」 | |
| TC-026 | REQ-2.2.4 / 附录8.1 | 逆向 | 新密码不合规 | 少于8位或缺少两类字符等 | 弱密码 | 提示「密码需为8-20位,包含字母、数字及特殊符号至少两种」 | |
| TC-027 | REQ-2.2.4 / 5.1 | 异常 | 重置接口失败 | 验证码与新密码均合法但服务端错误 | 5xx/超时 | 明确失败提示;密码未被错误更新 | 需可模拟 |
## 退出登录
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-028 | REQ-2.2.5 / 4.4 | 正向 | 已登录 | 点退出→确定 | — | 清除登录态;跳转登录页;Token 失效 | |
| TC-029 | REQ-4.4 | 正向 | 弹出确认框 | 点取消 | — | 留在当前页;登录态保持 | |
## 异地登录提醒
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-030 | REQ-2.2.6 | 正向 | 判定为异地新设备/IP | 在新环境登录成功 | — | 向注册手机号发送提醒短信(时间、地点、设备);含非本人处理入口(若需求实现) | 文案以实际短信为准 |
## 登录态与Token
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-031 | REQ-5.2 | 异常 | 已登录超过2小时无刷新 | 访问需鉴权接口或定时校验 | Token过期 | 自动退出或要求重新登录;旧Token不可用 | |
## 界面交互
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-032 | REQ-3.2 | 逆向 | 登录页 | 账号或密码未填全或格式未通过 | — | 「登录」置灰不可点;填全且合法后高亮可点 | |
| TC-033 | REQ-3.2 / 5.4 | 正向 | 焦点在密码框 | 按 Enter | — | 触发提交登录(与点登录一致) | |
| TC-034 | REQ-3.2 | 正向 | 点击登录后 | 等待响应 | — | 显示「登录中,请稍候」加载态;结束后成功自动消失/失败停留至操作 | |
## 安全与传输
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-035 | REQ-5.2 | 正向 | 浏览器开发者工具 | 提交登录请求 | HTTPS | 密码传输走HTTPS;本地记住密码为加密存储 | |
## 性能
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-036 | REQ-5.1 | 正向 | 正常负载 | 账号密码登录一次 | — | 端到端登录请求响应≤1秒(验收环境约定口径) | 需在测试环境压测/监控 |
## 注册引导
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-037 | REQ-3.1 / 6 | 正向 | 登录页 | 点击「还没有账号?立即注册」 | — | 跳转注册页 | |
## 忘记密码入口
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-038 | REQ-2.2.4 / 3.1 | 正向 | 登录页 | 点击忘记密码 | — | 进入密码找回页 | |
## 验证码通用
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-039 | REQ-5.2 / 6 | 逆向 | 已使用过或错误的码 | 重复使用同一验证码 | — | 第二次失败;单次有效、用后失效 | |
## 并发
| 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 |
|------|----------|----------|----------|------|-------------|----------|------|
| TC-040 | REQ-2.2.1 / 4.1 | 并发 | 多浏览器同账号 | 几乎同时用正确密码登录 | 双会话 | 策略符合产品(允许多端或踢下线);数据一致、无异常报错 | 待确认产品会话策略 |
excel打开也是很完整的能力,分了多个tab: 账号锁定、快捷登陆、记住密码、密码找回、退出登陆、异地登陆提醒、登录态与token、界面交互、安全与传输、性能、注册引导、忘记密码入口、验证码通用、并发 (受限于图片安全,这里仅做示例)
js"id
编号" "feature
功能" "requirementRef
关联需求" "scenarioType
场景类型" "precondition
前置条件" "steps
步骤" "inputOrAction
输入/操作" "expectedResult
预期结果" "remarks
备注"
TC-013 快捷登录 REQ-2.2.2 / 4.2 正向 手机号已注册 "1. 切换快捷登录
2. 合法手机号
3. 获取验证码
4. 输入正确验证码
5. 登录" 短信验证码 创建登录态,跳转首页
TC-014 快捷登录 REQ-2.2.2 / 附录8.1 逆向 验证码有效但未输对 输入错误验证码后点登录 错误验证码 提示「验证码输入错误,请重新输入」
TC-015 快捷登录 REQ-2.2.2 / 附录8.1 逆向 验证码已超过5分钟 输入曾正确但已过期验证码 过期验证码 提示「验证码已过期,请重新获取」
TC-016 快捷登录 REQ-2.2.2 / 附录8.1 逆向 同一手机号1小时内已获取3次 第4次点击获取验证码 超频 提示「获取过于频繁,请稍后再试」
TC-017 快捷登录 REQ-3.2 正向 刚获取验证码 点击获取验证码后观察按钮 — 进入60秒倒计时;期间不可点;结束后显示「重新获取」
TC-018 快捷登录 REQ-2.2.2 / 5.1 异常 短信网关故障 获取验证码时网关失败 发送失败 用户可见明确失败提示;不进入错误倒计时或允许重试 需可模拟
TC-019 快捷登录 REQ-2.2.2 并发 同一验证码未消费 两个终端几乎同时使用同一验证码登录 双端登录 仅一次成功或第二次明确失败;会话与风控符合产品约定 假设:验证码单次有效
本文作者:lixf6
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!