基于四轮开发的可执行验收清单,覆盖核心闭环、异常降级、状态管理、剪辑链路。
场景 1:正常完整链路
| # | 步骤 | 预期结果 | 状态 |
|---|
| 1.1 | 连接手表 → 开始录制 → 打 5+ 个事件 → 正常结束 | Session 创建成功,心率数据写入 DB | |
| 1.2 | 从回放页更多菜单进入复盘页 | 总览卡显示正确时长/事件数/心率 | |
| 1.3 | 查看事件分布图 | 散点位置与事件时间一致 | |
| 1.4 | 点击事件散点 | 跳转回放页,视频 seek 到正确位置(±2 秒) | |
| 1.5 | 查看 AI 摘要 | 包含概况+负荷+高光+节奏,末尾有数据来源标注 | |
| 1.6 | 点击 AI 摘要中的"查看片段" | 跳转回放页,定位正确 | |
| 1.7 | 推荐片段点击"查看片段" | 跳转回放页,auto-seek 到对应事件 | |
| 1.8 | 推荐片段点击"去剪辑" | 跳转回放页,自动预选事件进入多选模式 | |
场景 2:采集异常
| # | 场景 | 预期结果 |
|---|
| 2.1 | 录制中蓝牙断连 30 秒后恢复 | QualityState 心率覆盖率降低但不为 0,missingRanges 记录断点 |
| 2.2 | App 切后台 5 秒后恢复 | Session 不中断,心率数据可能有短暂缺失 |
| 2.3 | 录制异常中断(强杀 App) | Session status=interrupted,复盘页标注"记录不完整" |
| 2.4 | 手表心率传感器返回 hr=0 | 该采样标记 unavailable,不参与 avg/max 统计 |
场景 3:低数据降级
| # | 条件 | 总览卡 | 心率图 | AI 摘要 | 推荐片段 |
|---|
| 3.1 | 0 个事件 | 事件数=0 | 正常(如有心率) | "未记录到事件" | 不显示 |
| 3.2 | 心率覆盖率低于 40% | 仅数值 | 隐藏 | 不引用心率 | 仅基于事件排序 |
| 3.3 | 心率覆盖率 60-80% | 正常+标注"部分缺失" | 显示+断点虚线 | 用"约"前缀 | 正常 |
| 3.4 | 无速度/距离 | 不显示速度/距离项 | - | 不提距离/速度 | 正常 |
| 3.5 | 无视频 | 正常 | 正常 | 正常,不推荐片段 | 灰显不可点击 |
场景 4:长时录制
| # | 时长 | 检查项 |
|---|
| 4.1 | 30 分钟 | 心率图降采样正常渲染,无卡顿 |
| 4.2 | 60 分钟 | 聚合查询耗时低于 200ms |
| 4.3 | 90 分钟 | sensor_samples 约 5400 条,复盘页加载流畅 |
场景 5:状态管理
| # | 操作序列 | 预期结果 |
|---|
| 5.1 | AI 推荐跳转 → 手动 seek → 检查浮层 | 来源态清除,无浮层残留 |
| 5.2 | 推荐集合跳转 → "1/3" → 下一个 → "2/3" → 关闭 | 浮层消失,恢复普通回放态 |
| 5.3 | 集合跳转 → 切换筛选标签 → 检查浮层 | 来源态清除 |
| 5.4 | 从复盘页 → 回放页 → 返回 → 再进入 | 新实例,来源态重新应用 |
| 5.5 | "去剪辑" → 检查多选模式 | 预选事件高亮,可直接点击"剪辑已选" |
场景 6:口径一致性
| # | 检查项 | 标准 |
|---|
| 6.1 | AI 文案无"高强度"/"最激烈" | 使用"较高负荷"/"心率较高" |
| 6.2 | 负荷区段标签 | "负荷参考"而非"强度区段" |
| 6.3 | 速度/距离有数据时用"约"前缀 | AI 和总览卡一致 |
| 6.4 | 心率缺失时 AI 不引用心率 | 与图表隐藏逻辑一致 |
高优先级故障判定
以下异常出现时必须优先修复:
- 跳转偏移超过 5 秒 — 时间对齐逻辑有误
- 来源态不清除 — 状态污染,用户困惑
- AI 引用了不存在的数据 — 与 QualityState 不一致
- 集合浏览切换后视频不跟随 — seek 逻辑断链
- 无视频时剪辑按钮可点击 — 禁用态失效