编辑
2026-03-28
AI
00

目录

背景
案例1:用例生成
测试用例 — [标题]
[功能 / 接口名称]
案例2,性能测试

背景

参考:https://testerhome.com/topics/43843 加深对skills的操作理解

案例1:用例生成

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": "" } ] }
  • 若按功能分多张 Excel 表,feature 列或 meta 可用于分组;JSON 中保留 feature(或 module)便于过滤。
  • 需要数据时,在 inputOrAction / precondition 中给出代表性取值(含边界);接口测试在步骤或输入中注明 HTTP 方法、路径、关键字段。

Markdown 输出模板

markdown
# 测试用例 — [标题] ## [功能 / 接口名称] | 编号 | 关联需求 | 场景类型 | 前置条件 | 步骤 | 输入 / 操作 | 预期结果 | 备注 | |------|----------|----------|----------|------|-------------|----------|------| | TC-001 | REQ-x | 正向 | … | 1. … | … | … | | | TC-002 | REQ-x | 逆向 | … | | 非法 … | 拒绝 + 明确提示 / 错误码 | | | TC-003 | REQ-x | 异常 | … | | 模拟依赖超时 | 降级 / 重试 / 用户可见反馈 | | | TC-004 | REQ-x | 并发 | … | | 双请求同时 … | 数据一致 / 幂等 / 无脏写 | |

质量检查清单

在完成输出前逐项确认:

  • 三份产物(.md.json.xlsx)已写入且用例条数与内容一致
  • 每条 P0 / 核心需求至少有 1 条正向用例
  • 校验规则、权限、状态机有对应 逆向用例
  • 外部依赖与错误路径有 异常类用例(含超时 / 失败 / 部分成功)
  • 存在共享写资源或重复操作时含 并发或幂等相关用例
  • 预期结果可判定(具体字段、状态、文案或错误码),无模糊表述

示例片段(缩略)

需求:用户仅可删除本人草稿;删除后列表不再展示。

编号场景类型步骤概要预期
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 并发 同一验证码未消费 两个终端几乎同时使用同一验证码登录 双端登录 仅一次成功或第二次明确失败;会话与风控符合产品约定 假设:验证码单次有效

案例2,性能测试

参考:https://testerhome.com/articles/43844

本文作者:lixf6

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!