关联场景:
../user-scenarios/03-child.md。对应 e2e:../e2e/roles/child/*.spec.js。
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-01 | C-1 | 权限/双角色 | 孩子 | P0 | 权限 | 孩子可登录账号 | 1. 孩子独立登录 2. 检查界面与直接访问家长路由 | 进入孩子端首页;无切换家长入口;直接拼家长路由被 role 校验拦截 | 双角色铁律:孩子端不能切家长 | e2e/roles/child/login.spec.js |
| TC-C-02 | C-2 | 任务 | 孩子 | P0 | 功能 | 家长已下发任务「睡前阅读」 | 1. 打开待执行任务 2. 点「完成」提交 | 状态→待家长审核;完成动作写入记录;重复提交不重复计分 | TaskController |
e2e/roles/child/../tasks |
| TC-C-03 | C-3 | 小游戏 | 孩子 | P1 | 功能 | 小游戏入口可见 | 1. 打开舒尔特方格并完成 2. 查看积分/能量/排行 | 得分按规则计算;积分/能量到账;成绩入榜;中途退出不计分 | pages/games/* |
e2e/roles/child/mini-games.spec.js |
| TC-C-04 | C-4 | 心愿 | 孩子 | P1 | 功能 | 孩子已创建心愿 | 1. 创建心愿(名称+积分) 2. 进入家长待审批 | 心愿进入家长待审批列表;积分不足创建拦截 | WishController |
e2e/roles/parent/wish-management.spec.js |
| TC-C-05 | C-4 | 心愿 | 孩子 | P1 | 功能 | 家长已通过心愿 | 1. 操作兑换 | 兑换成功,积分扣减正确;驳回后不可兑换 | RewardController |
— |
| TC-C-06 | C-5 | 能量 | 孩子 | P1 | 功能 | 已有能量记录 | 1. 进个人能量页 2. 执行任务后查看 | 显示个人能量值;有增量且流水可追溯;能量不为负 | EnergyController |
e2e/roles/parent/energy-dashboard.spec.js(参考) |
| TC-C-07 | C-6 | 报告/权限 | 孩子 | P1 | 权限 | 家长已上传报告 | 1. 打开报告列表/详情 2. 检查编辑/删除入口 3. 直接调删除接口 | 可见报告内容;UI 无编辑/删除入口;直接调删除接口被 role 校验拒绝(403/401) | 报告查看权限隔离 | e2e/roles/teacher/dan-report-flow.spec.js(参考) |
| TC-C-08 | C-7 | 打卡/方案 | 孩子 | P0 | 功能 | 规划师已激活方案,生成训练任务 | 1. 打开方案任务 2. 完成并提交打卡 | 打卡成功,方案 completedDays+1;重复打卡不重复计数(幂等) |
健康打卡/方案进度 | e2e/roles/child/daily-checkin.spec.js |
| TC-C-09 | C-8 | 勋章 | 孩子 | P2 | 功能 | 已有部分成就 | 1. 打开勋章墙 | 显示已获得/未获得勋章及进度;未解锁不显示领取 | RewardController |
— |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-10 | SC-C-10 | 勋章提醒 | 孩子 | P2 | 功能 | 达成勋章条件 | 1. 触发成就条件 2. 观察解锁与推送 | 达成→解锁+推送;重复达成不重复发推送 | MedalController |
— |
| TC-C-11 | SC-C-11 | 成长记录 | 孩子 | P1 | 功能 | 有成长数据 | 1. 成长时间线→只读查看 | 仅展示本人数据;其他成员数据不可见 | GrowthController |
— |
| TC-C-12 | SC-C-12 | 食谱查看 | 孩子 | P1 | 功能 | 家庭食谱已生成 | 1. 打开家庭食谱→当日三餐 | 展示早/午/晚;无食谱显示空态不 500 | 饮食推荐 | — |
| TC-C-13 | SC-C-13 | AI 对话 | 孩子 | P1 | 功能 | 已登录 | 1. 进对话→发送问题→多轮 | 返回适龄回答;敏感/不适龄内容被过滤 | AIChatController |
— |
| TC-C-14 | SC-C-14 | 任务重做 | 孩子 | P1 | 功能 | 任务被驳回 | 1. 打开驳回任务 2. 重做→再提交 | 驳回后可重做;重做提交进入待审核 | TaskController |
— |
| TC-C-15 | SC-C-15 | 消息接收 | 孩子 | P1 | 功能 | 有消息 | 1. 消息列表→已读 | 仅见发给自己的消息;越权消息不可见 | 消息服务 | — |
| TC-C-16 | SC-C-16 | 个人资料 | 孩子 | P1 | 功能 | 已登录 | 1. 资料页→只读/部分可改 | 敏感字段(如关系)家长代管不可改 | AuthController |
— |
| TC-C-17 | SC-C-17 | 退出 | 孩子 | P1 | 功能 | 已登录 | 1. 退出→清 token | 退出清除本地缓存;回登录页 | AuthController |
— |
| TC-C-18 | SC-C-18 | 设备校验 | 孩子 | P2 | 功能 | 登录设备 | 1. 异常设备登录校验 | 异常设备触发二次验证;通过后放行 | AuthController |
— |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-19 | C-19 | 消息服务 | 孩子 | P1 | 功能 | 已登录(默认 孩子);相关前置数据就绪 | 1. 按场景流程执行:消息列表 → 已读 2. 观察结果 | 达成目标:收通知;边界:越权消息不可见 | 消息服务 | — |
| TC-C-20 | C-20 | GrowthController | 孩子 | P1 | 功能 | 已登录(默认 孩子);相关前置数据就绪 | 1. 按场景流程执行:档案页 → 只读;导出需家长 2. 观察结果 | 达成目标:看自己档案;边界:未成年人导出受限,需家长代办 | GrowthController | — |
| TC-C-21 | C-21 | 舌诊情绪识别 | 孩子 | P1 | 功能 | 已登录(默认 孩子);相关前置数据就绪 | 1. 按场景流程执行:拍照 → 上传 → 识别 2. 观察结果 | 达成目标:拍照上传;边界:模糊/非照片拒绝;隐私标注 | 舌诊情绪识别 | — |
| TC-C-22 | C-22 | MallController | 孩子 | P1 | 功能 | 已登录(默认 孩子);相关前置数据就绪 | 1. 按场景流程执行:选商品 → 积分兑换 2. 观察结果 | 达成目标:用积分换;边界:积分不足拦截;重复兑换幂等 | MallController | — |
| TC-C-23 | C-23 | 客服 | 孩子 | P1 | 功能 | 已登录(默认 孩子);相关前置数据就绪 | 1. 按场景流程执行:提交反馈 2. 观察结果 | 达成目标:提反馈;边界:内容适龄过滤;敏感信息脱敏 | 客服 | — |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-01-E | C-1 | 权限/双角色 | 孩子 | P2 | 异常 | 孩子可登录账号 | 1. token 缺失/过期访问孩子端切换接口 2. 孩子端尝试调 /api/family/member/switch 切家长 3. 拼家长路由 /parent/* |
缺失/过期 token 统一 401 跳登录;切换/家长路由被 role 校验 403 拦截;孩子端无任何切回家长入口;模拟登录仅测试环境生效 | 双角色铁律:孩子端不能切家长 | — |
| TC-C-02-E | C-2 | 任务 | 孩子 | P2 | 异常 | 家长已下发任务「睡前阅读」 | 1. 同一任务并发双点「完成」 2. 超期任务仍提交 3. 任务被驳回后重做再提交 | 并发双点幂等仅计 1 次、仅 1 条流水;超期提交被拒;驳回→重做→再提交仅在重做后计 1 次 | TaskController |
— |
| TC-C-03-E | C-3 | 小游戏 | 孩子 | P2 | 异常 | 小游戏入口可见 | 1. 上报异常分数(>满分/负分) 2. 中途退出(断网) 3. 同局成绩重复上报 | 异常分数 400 不计入;断网不计分不卡死;重复上报幂等不重复入榜 | pages/games/* |
— |
| TC-C-04-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 孩子已创建心愿 | 1. 心愿积分 > 自身余额 2. 心愿名称超长/含注入 3. 重复创建同名心愿 | 余额不足创建拦截;超长/注入 400 校验;重复创建提示已存在不双建 | WishController |
— |
| TC-C-05-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 家长已通过心愿 | 1. 兑换时积分余额 < 心愿价 2. 已驳回心愿再兑换 3. 并发兑换同一心愿 | 余额不足拦截且不扣负;已驳回提示不可兑换;并发幂等仅扣 1 次 | RewardController |
— |
| TC-C-06-E | C-5 | 能量 | 孩子 | P2 | 异常 | 已有能量记录 | 1. EnergyLog 查询超时 2. 某维度权重配置为 0 占比除零 | 超时降级空态提示非 500;权重 0 占比兜底(0%)显示不崩;能量不为负 | EnergyController |
— |
| TC-C-07-E | C-6 | 报告/权限 | 孩子 | P2 | 异常 | 家长已上传报告 | 1. 孩子直接调报告删除接口 DELETE /api/report/:id 2. 调编辑接口改报告内容 |
删除/编辑被 role 校验 403 拒绝;孩子端 UI 无编辑/删除入口;报告内容不被改动 | 报告查看权限隔离 | — |
| TC-C-08-E | C-7 | 打卡/方案 | 孩子 | P2 | 异常 | 规划师已激活方案,生成训练任务 | 1. 打卡时方案服务超时 2. 同任务重复打卡 3. 打卡非本人方案任务 | 超时回滚不残半任务、进度不 +1;重复打卡幂等不重复计数;非本人任务 403 | 健康打卡/方案进度 | — |
| TC-C-09-E | C-8 | 勋章 | 孩子 | P3 | 异常 | 已有部分成就 | 1. 重复触发同一成就条件 2. 未达成却直接调领取接口 | 重复达成不重复发推送/勋章;未达成领取 400/403 拒绝 | RewardController |
— |
| TC-C-10-E | SC-C-10 | 勋章提醒 | 孩子 | P3 | 异常 | 达成勋章条件 | 1. 重复达成同一勋章条件 2. 勋章条件数据缺失 | 重复达成幂等仅 1 次推送;数据缺失降级不推送不 500 | MedalController |
— |
| TC-C-11-E | SC-C-11 | 成长记录 | 孩子 | P2 | 异常 | 有成长数据 | 1. 成长时间线某条关联任务已删 2. 查其他成员成长数据 | 关联已删项跳过不报错;其他成员数据 403 不可见 | GrowthController |
— |
| TC-C-12-E | SC-C-12 | 食谱查看 | 孩子 | P2 | 异常 | 家庭食谱已生成 | 1. 家庭食谱生成时 LangGraph 超时 2. 无食谱打开食谱页 | 超时 Fallback 通用食谱+提示非 500;无食谱空态不 500 | 饮食推荐 | — |
| TC-C-13-E | SC-C-13 | AI 对话 | 孩子 | P2 | 异常 | 已登录 | 1. 发送不适龄/含敏感词内容 2. LangGraph 不可用时多轮 | 不适龄/敏感词被过滤返回适龄话术;LangGraph 不可用 Fallback 兜底、多轮连续 | AIChatController |
— |
| TC-C-14-E | SC-C-14 | 任务重做 | 孩子 | P2 | 异常 | 任务被驳回 | 1. 重做已被通过(非驳回)的任务 2. 重做后再次提交 | 非驳回态重做入口不可见/拦截;重做提交进入待审核仅计 1 次 | TaskController |
— |
| TC-C-15-E | SC-C-15 | 消息接收 | 孩子 | P2 | 异常 | 有消息 | 1. 查其他孩子的消息 2. 消息 id 不存在 | 越权消息 403 不可见;不存在 404;列表分页正常 | 消息服务 | — |
| TC-C-16-E | SC-C-16 | 个人资料 | 孩子 | P2 | 异常 | 已登录 | 1. 改关系等家长代管字段 2. 昵称含注入/超长 | 代管字段 403 不可改;昵称注入/超长 400 校验 | AuthController |
— |
| TC-C-17-E | SC-C-17 | 退出 | 孩子 | P2 | 异常 | 已登录 | 1. 退出后旧 token 仍调用接口 2. 退出时网络中断 | 旧 token 失效 401;网络中断退出仍清本地缓存、下次需重登 | AuthController |
— |
| TC-C-18-E | SC-C-18 | 设备校验 | 孩子 | P3 | 异常 | 登录设备 | 1. 异地/新设备登录触发风控 2. 退出后旧设备 token 调用 | 异常设备二次验证/拦截;旧设备 token 失效 401 | AuthController |
— |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-19-E | C-19 | 消息服务 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 标记已读时消息 id 不存在 2. 越权标记他人消息已读 | 不存在 404;越权标记 403 不生效 | 消息服务 | — |
| TC-C-20-E | C-20 | GrowthController | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 未成年人直接导出档案 2. 越权读他人档案 | 未成年导出 403 需家长代办;他人档案 403 不可见 | GrowthController | — |
| TC-C-21-E | C-21 | 舌诊情绪识别 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 上传非照片/模糊图 2. 识别置信度<阈值 | 非照片/模糊拒绝提示『请上传清晰舌苔照』;低置信度提示重拍;隐私标注不外露 | 舌诊情绪识别 | — |
| TC-C-22-E | C-22 | MallController | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 积分余额不足兑换 2. 并发兑换同一商品 3. 重复兑换同一商品 | 余额不足拦截不扣负;并发仅 1 次成功;重复兑换幂等仅 1 条 | MallController | — |
| TC-C-23-E | C-23 | 客服 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 反馈含身份证号等敏感信息 2. 附件 >10MB | 敏感信息脱敏存储;附件超限 400『附件不超过 10MB』 | 客服 | — |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-01-P | C-1 | 权限/双角色 | 孩子 | P1 | 权限 | 孩子可登录账号 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 双角色铁律:孩子端不能切家长 | — |
| TC-C-02-P | C-2 | 任务 | 孩子 | P1 | 权限 | 家长已下发任务「睡前阅读」 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | TaskController |
— |
| TC-C-03-P | C-3 | 小游戏 | 孩子 | P1 | 权限 | 小游戏入口可见 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | pages/games/* |
— |
| TC-C-04-P | C-4 | 心愿 | 孩子 | P1 | 权限 | 孩子已创建心愿 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | WishController |
— |
| TC-C-05-P | C-4 | 心愿 | 孩子 | P1 | 权限 | 家长已通过心愿 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | RewardController |
— |
| TC-C-06-P | C-5 | 能量 | 孩子 | P1 | 权限 | 已有能量记录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | EnergyController |
— |
| TC-C-07-P | C-6 | 报告/权限 | 孩子 | P1 | 权限 | 家长已上传报告 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 报告查看权限隔离 | — |
| TC-C-08-P | C-7 | 打卡/方案 | 孩子 | P1 | 权限 | 规划师已激活方案,生成训练任务 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 健康打卡/方案进度 | — |
| TC-C-09-P | C-8 | 勋章 | 孩子 | P2 | 权限 | 已有部分成就 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | RewardController |
— |
| TC-C-10-P | SC-C-10 | 勋章提醒 | 孩子 | P2 | 权限 | 达成勋章条件 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | MedalController |
— |
| TC-C-11-P | SC-C-11 | 成长记录 | 孩子 | P1 | 权限 | 有成长数据 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | GrowthController |
— |
| TC-C-12-P | SC-C-12 | 食谱查看 | 孩子 | P1 | 权限 | 家庭食谱已生成 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 饮食推荐 | — |
| TC-C-13-P | SC-C-13 | AI 对话 | 孩子 | P1 | 权限 | 已登录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | AIChatController |
— |
| TC-C-14-P | SC-C-14 | 任务重做 | 孩子 | P1 | 权限 | 任务被驳回 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | TaskController |
— |
| TC-C-15-P | SC-C-15 | 消息接收 | 孩子 | P1 | 权限 | 有消息 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 消息服务 | — |
| TC-C-16-P | SC-C-16 | 个人资料 | 孩子 | P1 | 权限 | 已登录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | AuthController |
— |
| TC-C-17-P | SC-C-17 | 退出 | 孩子 | P1 | 权限 | 已登录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | AuthController |
— |
| TC-C-18-P | SC-C-18 | 设备校验 | 孩子 | P2 | 权限 | 登录设备 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | AuthController |
— |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-19-P | C-19 | 消息服务 | 孩子 | P1 | 权限 | 已登录(默认 孩子);相关前置数据就绪 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 消息服务 | — |
| TC-C-20-P | C-20 | GrowthController | 孩子 | P1 | 权限 | 已登录(默认 孩子);相关前置数据就绪 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | GrowthController | — |
| TC-C-21-P | C-21 | 舌诊情绪识别 | 孩子 | P1 | 权限 | 已登录(默认 孩子);相关前置数据就绪 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 舌诊情绪识别 | — |
| TC-C-22-P | C-22 | MallController | 孩子 | P1 | 权限 | 已登录(默认 孩子);相关前置数据就绪 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | MallController | — |
| TC-C-23-P | C-23 | 客服 | 孩子 | P1 | 权限 | 已登录(默认 孩子);相关前置数据就绪 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 客服 | — |
完整用户故事见
../user-scenarios/07-five-dimension.md(ED-8~9)。每条含正常流 + 具体异常流(-E) + 权限流(-P)。
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-24 | SC-C-24 | 能量/小游戏·任务 | 孩子 | P1 | 功能 | 孩子 B 登录;成绩上报接口可用 | 1. B 完成小游戏/任务 2. 查自身 EnergyLog/EnergyBalance |
对应维度 +amount、sourceType=game/task;B 自身能量页看到增长与流水 |
GameRecordService/TaskController |
tests/e2e/mini-games.spec.js |
| TC-C-25 | SC-C-25 | 能量/方案打卡 | 孩子 | P1 | 功能 | 方案已激活生成启动任务(SC-C-05);打卡接口可用 |
1. B 打开方案启动任务→打卡提交 2. 查进度与能量 | GrowthTaskService 打卡对应维度+;任务进度与能量同步刷新 |
GrowthTaskService |
tests/e2e/daily-checkin-streak.spec.js |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-24-E | SC-C-24 | 能量/小游戏·任务 | 孩子 | P2 | 异常 | B 登录 + 造"异常分数""重复上报" | 1. 超评分上限/负分上报 2. 同成绩重复上报 | 1. 异常分数拦截不写能量 2. 重复上报幂等不重复加 | GameRecordService |
— |
| TC-C-25-E | SC-C-25 | 能量/方案打卡 | 孩子 | P2 | 异常 | 方案任务存在 + 造"逾期""重复打卡""并发" | 1. 逾期限打卡 2. 同任务重复打卡 3. 并发打卡 | 1. 按业务允/拒、断言一致 2. 重复打卡幂等不重复加 3. 并发不重复计分 | GrowthTaskService |
— |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-24-P | SC-C-24 | 能量/小游戏·任务 | 孩子 | P1 | 权限 | 家庭1(B)+ 其他孩子 D | 1. B 查 D 能量/流水 2. B 直接调 grant/deduct |
1. 他人能量 403 2. 孩子端无编辑/扣减入口、直接调被拒 | JwtInterceptor+role |
— |
| TC-C-25-P | SC-C-25 | 能量/方案打卡 | 孩子 | P1 | 权限 | 家庭1(B)+ 非本人方案 | 1. B 打卡非本人方案任务 2. 查他人方案进度 | 1. 非本人方案任务 403 2. 他人进度不可见 | GrowthTaskService |
— |
需求源:
docs/需求分析/2026-11-06-成就成长打卡需求变更.md变更 C;场景源:tests/user-scenarios/应用场景总览.md行 346;能力键台账:sleep.config.tags(docs/tdd/orchestration/sc-key-map.md)。配置读取/维护接口的最终路径由实现方定(需求文档给出/api/health/sleep/tags、/api/config/public/value?key=sleep.quality.tags、/api/admin/sleep/tags三种候选),用例中不假定唯一路径,标「需核实」。
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-26 | SC-C-26 | 健康打卡/睡眠配置 | 孩子 | P1 | 功能 | 后台配置项 sleep.quality.tags 已配为 9 项(原 8 项 +「正常」);孩子 B 登录 |
1. 打开睡眠打卡页看「睡眠情况」区 2. 选中「正常」单独提交 3. 选中「正常」+「入睡困难」提交并查 remark 4. 运营在后台增/删/改序一项后刷新小程序 5. 清空配置项后刷新 |
1. 选项列表由后台配置驱动(非前端硬编码),含「正常」共 9 项 2. 选中「正常」可正常提交、落睡眠记录 3. 多项按现状 join(',') 并入 remark(如「正常,入睡困难」),拼接逻辑未被改动 4. 后台增删改序后小程序端按新列表与顺序生效 5. 配置缺失回退默认 9 项(含「正常」)且不报错 |
变更C / HealthSleepController + sys_config(sleep.quality.tags) + sleep-checkin.vue:quickTags(路径需核实) |
— |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-26-E | SC-C-26 | 健康打卡/睡眠配置 | 孩子 | P2 | 异常 | 造「配置读取 5xx/超时」「value 非法 JSON」「空数组」「含重复项」「超长标签」「后台删掉「正常」」「并发重复提交」七组对照 | 1. 读取接口 5xx/超时后进页 2. 写入非法 JSON 与空数组 3. 配置含重复项与 200 字超长标签 4. 后台删除「正常」后查看历史记录 remark 5. 同一次打卡并发提交两次 | 1. 失败回退默认 9 项、页面可用不白屏 2. 非法 JSON/空数组同样回退默认 9 项、不渲染空选项区、不 500 3. 重复项去重、超长标签截断或省略、不撑破布局 4. 历史 remark 中已落库的「正常」字符串不受影响、无迁移副作用 5. 并发提交幂等、仅生成 1 条睡眠记录 | 变更C 验收口径 + 风险项 3(默认值/历史数据)/ quickTags 回退契约 |
— |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-26-P | SC-C-26 | 健康打卡/睡眠配置 | 孩子 | P1 | 权限 | 孩子 B、家长 A、运营 M 账号可用;家庭 F9 另有孩子 D 的睡眠记录 | 1. 孩子 B 直接调后台配置保存接口(save)改选项列表 2. 家长 A 查 F9 孩子 D 的睡眠记录 remark 3. 非 admin 的普通账号调后台 get/save |
1. 孩子端无维护入口、直调 save 被 role 校验拒(403/401)、配置不被改动 2. 非本家庭睡眠记录 403、不泄露 remark 内容 3. 非 admin 账号 get/save 均被拒;仅运营 M(admin)可维护,且保存有操作留痕 |
变更C / AdminSleepConfigController 权限校验(路径需核实)+ JwtInterceptor 家庭归属 |
— |
非功能维度:性能(大文件/并发/限流)、兼容(多端/多浏览器/主题)、安全(IDOR/XSS/上传/鉴权/SSRF)。编号后缀
-N与正常流/异常流(-E)/权限流(-P)并列。
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-C-N01 | SC-C-05 | 任务打卡 | 孩子 | P1 | 性能 | 方案含 ≥ 30 任务 | 1. 连续提交打卡 2. 测量并发提交 | 重复提交幂等;并发不重复计分;响应 ≤ 1s | TaskController | — |
| TC-C-N02 | SC-C-19 | 消息通知 | 孩子 | P2 | 性能 | 大量通知(≥100) | 1. 打开消息中心 2. 翻页/标记已读 | 列表渲染 ≤ 1.5s;标记已读即时 | 消息中心 | — |
| TC-C-N03 | SC-C-01 | 孩子端 | 孩子 | P1 | 兼容 | iOS/Android/小程序 | 1. 各端登录孩子视角 2. 打卡/心愿 | 功能一致;无错位;低龄设备流畅 | 孩子端 | — |
| TC-C-N04 | SC-C-03 | 只读报告 | 孩子 | P2 | 兼容 | 亮/暗主题、平板屏 | 1. 查看报告 2. 切换主题 | 图表自适应;无溢出;可读 | 报告前端 | — |
| TC-C-N05 | SC-C-02 | 心愿 | 孩子 | P1 | 安全 | 抓包 | 1. 拦截心愿提交 2. 篡改 memberId 为其他孩子 | 服务端校验归属;403/拒绝;孩子不可越权操作他人 | 心愿鉴权 | — |
| TC-C-N06 | SC-C-19 | 消息通知 | 孩子 | P2 | 安全 | 构造恶意推送内容 | 1. 模拟收到含 <img onerror> 推送 2. 打开 |
内容转义渲染;不执行脚本 | 消息渲染 | — |
| TC-C-N07 | SC-C-01 | 孩子端 | 孩子 | P0 | 安全 | 直接调用父级/管理接口 | 1. 孩子 token 调 /api/admin/*、/api/family/member/switch 切回家长 |
一律 401/403;孩子端不可切回家长铁律生效 | 双角色铁律 | e2e/api/nonfunc-security.spec.js |