# 测试用例 · 成长规划师(Teacher) > 关联场景:`../user-scenarios/04-teacher.md`。对应 e2e:`../e2e/roles/teacher/*.spec.js`、`../e2e/assessment-order-flow.spec.js`、`../e2e/dan-report-flow.spec.js`、`../e2e/ai-plan-task-flow.spec.js`。 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e | |---|---|---|---|---|---|---|---|---|---|---| | TC-T-01 | T-1 | 认证/双角色 | 规划师 | P0 | 权限 | 已分配规划师账号 | 1. 密码登录 2. 切回家长视角 3. 访问无关家庭数据 | 进入仪表板;可切回自身家长视角;越权访问无关家庭被拒 | `AuthController`;规划师可切回家长 | `e2e/roles/teacher/login.spec.js` | | TC-T-02 | T-2 | 家庭绑定 | 规划师 | P1 | 功能 | 家长已生成邀请码 | 1. 输入邀请码绑定 2. 查看「我的家庭」 | 家庭出现在列表,可见成员;无效码提示失败;重复绑定幂等 | `FamilyInviteController` | `e2e/roles/teacher/family-binding.spec.js` | | TC-T-03 | T-3 | 健康报告 | 规划师 | P0 | 功能 | 已绑定家庭与孩子 B | 1. 上传募极生物 PDF+选 B 2. 三阶段:上传→解析预览→确认入库 | 报告进入孩子档案;健康列表可见;识别失败进草稿/未知聚类 | 报告上传解析;规划师代传 | `e2e/roles/teacher/dan-report-flow.spec.js` | | TC-T-04 | T-3 | 报告审核 | 规划师 | P1 | 功能 | 有报告草稿(如 id=28) | 1. 打开审核队列草稿 2. 确认 | 草稿确认入库,健康报告列表可见;确认前可取消不入库 | 报告审核 | — | | TC-T-05 | T-4 | 方案管理 | 规划师 | P0 | 功能 | 有 generated/reviewed/active 方案 | 1. 打开方案管理页 | 列表正常渲染(无白屏);函数不报未定义 | 方案管理;黑盒回归项 | `e2e/admin-panel.spec.js`(参考) | | TC-T-06 | T-4 | 方案审核 | 规划师 | P0 | 功能 | 家长已提交方案(generated) | 1. 对方案 A 点「批准」 | 状态 generated→reviewed | 方案状态机 | — | | TC-T-07 | T-5 | 方案激活 | 规划师 | P0 | 功能 | 方案已 reviewed | 1. 点「激活」→确认 2. 激活后查看孩子任务 | 状态 reviewed→active;生成引导任务+模板任务;孩子 B 出现方案启动任务 | 激活拆任务 | `e2e/ai-plan-task-flow.spec.js` | | TC-T-08 | T-5 | 方案激活·幂等 | 规划师 | P0 | 异常 | 方案已 active | 1. 对已激活方案再次激活 | 返回状态异常提示,**不重复生成任务**(幂等) | 幂等约束(黑盒回归) | — | | TC-T-09 | T-6 | 任务审核 | 规划师 | P1 | 功能 | 孩子已提交任务 | 1. 打开家庭任务列表 2. 审核 | 通过→孩子得积分;驳回→退回重做;越权审核非绑定家庭被拒 | `TaskController` | — | | TC-T-10 | T-7 | 测评录入 | 规划师 | P0 | 功能 | 家长已支付测评订单(待安排→已预约) | 1. 打开测评订单 2. 录入各维度得分 3. 保存 | 结果可见;触发规则引擎自动生成方案(generated);必填缺失→校验拦截;重复录入覆盖 | `AssessmentAppointmentController`/`DanAssessmentController` | `e2e/assessment-order-flow.spec.js` | | TC-T-11 | T-8 | 成长计划 | 规划师 | P1 | 功能 | 已绑定家庭 | 1. 打开「成长计划」页 | 列表显示自己创建的计划(childName/状态/时间);不再 400 | `GrowthPlanController`;黑盒回归 | `e2e/guide-family-list.spec.js`(参考) | | TC-T-12 | T-8 | 套餐 | 规划师 | P1 | 功能 | 套餐素材就绪 | 1. 创建「专注力提升套餐」含任务项 2. 提交审核 3. 审核通过后购买 | 上架前提交审核;审核通过后可被市场购买;任务项为空→校验拦截 | `GuidePackageController` | — | ### 门禁项 - **TC-T-08(幂等)** 与 **TC-T-05(无白屏)** 为近期修复回归项,必须全部通过,否则不通过。 - **TC-T-10a(权限·确认,既有)**:非指派测评师 `confirm/{id}` → 返回「您不是被指派的测评师」,status 不变(TC-DV-05)。 - **TC-T-10b(异常·状态守卫,来自深挖 F2)**:对已取消/已完成预约再 `confirm` → 当前仍置 1(非法回退)【缺陷】,期望失败(TC-DV-02)。 - **TC-T-10c(权限·越权取消,来自深挖 F1)**:`cancel/{id}` 不接收调用者身份,**任何登录用户凭 id 即可取消他人预约**【高危缺陷】;期望增加归属校验(TC-DV-01)。 - **关联深挖**:完整缺陷清单与专项用例见 `test-cases/deep-dive-assessment-appointment.md`。 ## 补齐用例(缺口场景 SC-T-13~22) | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e | |---|---|---|---|---|---|---|---|---|---|---| | TC-T-13 | SC-T-13 | 数据隔离 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 列家庭/成员/报告 2. 越权查非绑定家庭 | 非绑定家庭统一 403;仅见绑定家庭数据 | 控制器内 role 检查 | — | | TC-T-14 | SC-T-14 | 方案编辑 | 规划师 | P1 | 功能 | 方案存在 | 1. 编辑板块/任务项 2. 保存 | 编辑后状态标记已改;保存生效 | 方案管理 | — | | TC-T-15 | SC-T-15 | 套餐任务 | 规划师 | P1 | 功能 | 套餐存在 | 1. 增删任务项 2. 重算 | 空套餐拦截上架;重算后任务项正确 | `GuidePackageController` | — | | TC-T-16 | SC-T-16 | 健康总览 | 规划师 | P1 | 功能 | 已绑定家庭 | 1. 家庭仪表板→能量/报告/方案汇总 | 数据缺失项降级展示不 500 | 仪表板 | — | | TC-T-17 | SC-T-17 | 计划进度 | 规划师 | P1 | 功能 | 计划存在 | 1. 计划→任务完成度 | 进度计算准确;与任务状态一致 | `GrowthPlanController` | — | | TC-T-18 | SC-T-18 | 批量任务 | 规划师 | P1 | 功能 | 多孩子成员 | 1. 选多成员→批量建任务 | 部分失败不影响其他成员;各自独立落库 | `TaskController` | — | | TC-T-19 | SC-T-19 | 消息推送 | 规划师 | P1 | 功能 | 已绑定客户 | 1. 发消息/提醒→客户收到 | 客户端收到;免打扰设置生效 | 消息服务 | — | | TC-T-20 | SC-T-20 | 退出/切换 | 规划师 | P1 | 功能 | 已登录 | 1. 退出→清 token 2. 切回家长 | 退出清缓存;切回家长视角正常 | `AuthController` | — | | TC-T-21 | SC-T-21 | 报告对比 | 规划师 | P1 | 功能 | 多份报告 | 1. 多报告对比→差异标注 | 报告类型一致才可比对;差异清晰标注 | 报告管理 | — | | TC-T-22 | SC-T-22 | 方案归档 | 规划师 | P2 | 功能 | 方案完成 | 1. 归档→只读 | 归档后方案仅可读,不可再编辑/激活 | 方案管理 | — | --- ### 本轮扩展场景用例(新增 SC-T) | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e | |---|---|---|---|---|---|---|---|---|---|---| | TC-T-23 | T-23 | 报告代传/report-proxy | 规划师 | P1 | 功能 | 已登录(默认 规划师);相关前置数据就绪 | 1. 按场景流程执行:上传 PDF+选孩子 → 解析 → 关联孩子档案 2. 观察结果 | 达成目标:帮客户上传;边界:非绑定家庭拒;识别失败进草稿 | 报告代传/report-proxy | — | | TC-T-24 | T-24 | 规划师绑定 | 规划师 | P1 | 功能 | 已登录(默认 规划师);相关前置数据就绪 | 1. 按场景流程执行:解绑 → 重绑新家庭 2. 观察结果 | 达成目标:更换绑定;边界:在途方案/预约处理;非绑定家庭不可操作 | 规划师绑定 | — | | TC-T-25 | T-25 | 舌诊情绪识别 | 规划师 | P1 | 功能 | 已登录(默认 规划师);相关前置数据就绪 | 1. 按场景流程执行:上传/录入 → 关联报告 2. 观察结果 | 达成目标:录入识别结果;边界:识别失败回退人工 | 舌诊情绪识别 | — | | TC-T-26 | T-26 | 精准营养 | 规划师 | P1 | 功能 | 已登录(默认 规划师);相关前置数据就绪 | 1. 按场景流程执行:设目标 → 生成方案 2. 观察结果 | 达成目标:基于营养目标出方案;边界:目标非法拦截 | 精准营养 | — | | TC-T-27 | T-27 | 家庭天盘 | 规划师 | P1 | 功能 | 已登录(默认 规划师);相关前置数据就绪 | 1. 按场景流程执行:打开天盘 → 解读 2. 观察结果 | 达成目标:给家庭看聚合视图并解读;边界:仅绑定家庭可见 | 家庭天盘 | — | | TC-T-28 | T-28 | 内容安全 | 规划师 | P1 | 功能 | 已登录(默认 规划师);相关前置数据就绪 | 1. 按场景流程执行:AI 生成 → 敏感词/合规检查 → 放行/驳回 2. 观察结果 | 达成目标:复核 AI 敏感内容;边界:命中即拦截 | 内容安全 | — | | TC-T-29 | T-29 | 数据导出(GDPR) | 规划师 | P1 | 功能 | 已登录(默认 规划师);相关前置数据就绪 | 1. 按场景流程执行:申请 → 生成包 → 下载 2. 观察结果 | 达成目标:导出客户数据;边界:授权/脱敏;越权拒 | 数据导出(GDPR) | — | ## 异常流用例(派生自正常流) | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e | |---|---|---|---|---|---|---|---|---|---|---| | TC-T-01-E | T-1 | 认证/双角色 | 规划师 | P2 | 异常 | 已分配规划师账号 | 1. token 缺失/过期访问规划师接口 2. 非指派家庭直接拼路由访问 3. 模拟登录开关校验 | 缺失/过期 token 统一 401 跳登录;非绑定家庭路由 403 被拒;模拟登录开关仅在测试环境可开 | `AuthController`;规划师可切回家长 | — | | TC-T-02-E | T-2 | 家庭绑定 | 规划师 | P2 | 异常 | 家长已生成邀请码 | 1. 邀请码填错/过期(>7天) 2. 重复绑定同一家庭 3. 绑定已注销家庭 | 错码/过期提示『邀请码无效或已失效』;重复绑定幂等不双建;注销家庭不可绑 | `FamilyInviteController` | — | | TC-T-03-E | T-3 | 健康报告 | 规划师 | P2 | 异常 | 已绑定家庭与孩子 B | 1. 上传损坏PDF/非募极/超大 2. 解析超时 3. 选非绑定家庭的孩子 | 损坏/非募极提示明确(非募极提示请确认募极生物);超大超限提示;解析超时进草稿非500;非绑定孩子 403 | 报告上传解析;规划师代传 | — | | TC-T-04-E | T-3 | 报告审核 | 规划师 | P2 | 异常 | 有报告草稿(如 id=28) | 1. 确认一个已被他人确认/删除的草稿 2. 解析超时草稿点确认 3. 非绑定家庭草稿 | 已删草稿提示『不存在』;解析中确认提示稍候;非绑定家庭草稿 403 不可操作 | 报告审核 | — | | TC-T-05-E | T-4 | 方案管理 | 规划师 | P2 | 异常 | 有 generated/reviewed/active 方案 | 1. 方案列表接口超时 2. 方案含未定义函数引用渲染 3. 空方案列表 | 列表超时降级提示非500;黑盒回归:函数不再未定义、不白屏;空列表正常占位 | 方案管理;黑盒回归项 | — | | TC-T-06-E | T-4 | 方案审核 | 规划师 | P2 | 异常 | 家长已提交方案(generated) | 1. 对非 generated 态(如已 reviewed)方案再点批准 2. 并发双批准 | 非 generated 态批准拦截(状态机守卫);并发双批准幂等仅 1 次状态跃迁 | 方案状态机 | — | | TC-T-07-E | T-5 | 方案激活 | 规划师 | P2 | 异常 | 方案已 reviewed | 1. 激活时任务分解服务超时 2. 对已激活方案再激活 3. 激活非 reviewed 方案 | 超时回滚不残半任务、状态回 reviewed;已激活再激活幂等不重复生成任务;非 reviewed 激活拦截 | 激活拆任务 | — | | TC-T-08-E | T-5 | 方案激活·幂等 | 规划师 | P2 | 异常 | 方案已 active | 1. 对已 active 方案连续点激活两次(并发) | 第二次幂等返回现状、不重复生成引导/模板任务;任务数与首次一致 | 幂等约束(黑盒回归) | — | | TC-T-09-E | T-6 | 任务审核 | 规划师 | P2 | 异常 | 孩子已提交任务 | 1. 审核非绑定家庭孩子任务 2. 同任务并发双审 3. 超期任务审核 | 非绑定家庭 403;并发双审幂等仅计 1 次积分;超期任务审核被拒 | `TaskController` | — | | TC-T-10-E | T-7 | 测评录入 | 规划师 | P2 | 异常 | 家长已支付测评订单(待安排→已预约) | 1. 必填维度缺失录入 2. 同一订单重复录入 3. 分值越界(>量纲) 4. 非指派规划师 confirm | 必填缺失 400 不生成半成品;重复录入覆盖非新增;越界 400 不写脏分;非指派 confirm 返回『您不是被指派测评师』 | `AssessmentAppointmentController`/`DanAssessmentController` | — | | TC-T-11-E | T-8 | 成长计划 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 成长计划列表接口超时 2. 空计划列表 3. 越权查非绑定家庭计划 | 超时降级非500;空列表正常;非绑定家庭 403 | `GrowthPlanController`;黑盒回归 | — | | TC-T-12-E | T-8 | 套餐 | 规划师 | P2 | 异常 | 套餐素材就绪 | 1. 提交空任务项套餐上架 2. 套餐审核超时 3. 重复提交同一套餐 | 空任务项拦截上架;审核超时回退草稿非500;重复提交幂等 | `GuidePackageController` | — | | TC-T-13-E | SC-T-13 | 数据隔离 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 直接拼路由查非绑定家庭报告/任务 2. 越权访问并发 | 非绑定家庭统一 403;不泄露他人数据;并发越权同样 403 | 控制器内 role 检查 | — | | TC-T-14-E | SC-T-14 | 方案编辑 | 规划师 | P2 | 异常 | 方案存在 | 1. 编辑已归档方案 2. 编辑非绑定家庭方案 3. 超长文本 | 归档方案编辑拦截;非绑定家庭 403;超长 400 | 方案管理 | — | | TC-T-15-E | SC-T-15 | 套餐任务 | 规划师 | P2 | 异常 | 套餐存在 | 1. 套餐任务重算服务超时 2. 空套餐任务重算 3. 并发增删任务 | 重算超时降级提示非500;空套餐拦截;并发增删各自生效不丢项 | `GuidePackageController` | — | | TC-T-16-E | SC-T-16 | 健康总览 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 仪表板某成员报告/能量数据缺失 2. 接口超时 | 缺失项降级展示不白屏;超时降级提示非500;仅绑定家庭数据 | 仪表板 | — | | TC-T-17-E | SC-T-17 | 计划进度 | 规划师 | P2 | 异常 | 计划存在 | 1. 计划进度接口超时 2. 进度与任务状态不一致时 | 超时降级非500;进度按任务状态实时计算、一致 | `GrowthPlanController` | — | | TC-T-18-E | SC-T-18 | 批量任务 | 规划师 | P2 | 异常 | 多孩子成员 | 1. 批量建任务时部分成员失败(如某成员已注销) 2. 并发批量 | 部分失败不影响其他成员独立落库;并发批量各自独立不串 | `TaskController` | — | | TC-T-19-E | SC-T-19 | 消息推送 | 规划师 | P2 | 异常 | 已绑定客户 | 1. 推送目标含已注销客户 2. 消息内容含注入 3. 免打扰客户 | 已注销客户跳过不报错;内容转义不执行脚本;免打扰不推送 | 消息服务 | — | | TC-T-20-E | SC-T-20 | 退出/切换 | 规划师 | P2 | 异常 | 已登录 | 1. 退出后旧 token 仍调用 2. 切回家长视角时网络中断 | 旧 token 失效 401;网络中断退出清缓存、下次需重登;切回家长正常 | `AuthController` | — | | TC-T-21-E | SC-T-21 | 报告对比 | 规划师 | P2 | 异常 | 多份报告 | 1. 对比不同类型报告(菌群 vs DAN) 2. 对比不存在的报告 id | 类型不一致提示不可比;不存在 id 404;差异清晰标注 | 报告管理 | — | | TC-T-22-E | SC-T-22 | 方案归档 | 规划师 | P3 | 异常 | 方案完成 | 1. 归档后尝试编辑/激活 2. 归档不存在方案 | 归档后编辑/激活拦截;不存在 404 | 方案管理 | — | ### 本轮扩展异常流(派生自新增场景) | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e | |---|---|---|---|---|---|---|---|---|---|---| | TC-T-23-E | T-23 | 报告代传/report-proxy | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 代传非绑定家庭孩子报告 2. 上传损坏/非募极 3. 识别失败 | 非绑定家庭 403 拒;损坏/非募极提示明确;识别失败进草稿非500 | 报告代传/report-proxy | — | | TC-T-24-E | T-24 | 规划师绑定 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 绑定有在途方案/预约的家庭 2. 绑定非本平台家庭 | 在途未完成提示先处理;非平台家庭绑定 400 拒 | 规划师绑定 | — | | TC-T-25-E | T-25 | 舌诊情绪识别 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 上传非照片/恶意图片(.php) 2. 识别置信度<阈值 | 类型校验拒绝(.php/.html)不执行;非照片/模糊拒;低置信度提示重拍 | 舌诊情绪识别 | — | | TC-T-26-E | T-26 | 精准营养 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 营养目标填负/超上限 2. 目标含 `