| 项目 | 内容 |
|---|---|
| 版本 | v1.1 |
| 状态 | 已评审 |
| 测试周期 | 第 13-16 周(与开发尾部重叠) |
| 变更记录 | v1.0 首次定稿;v1.1 修订:新增离线编辑拦截、全量重同步(full_resync)、邀请码穷举锁定用例 |
1. 测试策略总览
小团队无专职测试(产品兼),策略是自动化兜底 + 真机人工聚焦:
- 后端:单元测试 + 集成测试自动化(CI 强制门禁),人工只测接口串联场景
- 客户端:核心路径人工真机测试 + 埋点数据监控;UI 巡检脚本覆盖金额展示
- 专项:多人并发、弱网同步、安全越权 —— 三个高风险区各设专项
- 验收:全员 Dogfooding(用真实账本生活记账 1-2 周)是最终关卡
2. 测试范围与优先级
| 范围 | 优先级 | 方式 | 负责人 |
|---|---|---|---|
| 记一笔核心链路 | P0 | 人工真机 + Demo 日检 | 客户端 |
| 同步引擎(离线/幂等/冲突) | P0 | 后端自动化 + 人工弱网 | 后端 |
| 账本权限(邀请/角色/越权) | P0 | 自动化集成 + 安全专项 | 后端 |
| 金额计算准确性 | P0 | 自动化(后端单测 + 客户端 money.ts 单测) | 各自 |
| 统计报表准确性 | P0 | 后端自动化(SQL 对拍)+ 人工抽查 | 后端 |
| 登录注册注销 | P0 | 自动化 + 人工 | 后端 |
| 兼容性(机型矩阵) | P1 | 人工真机 | 产品 |
| 性能(帧率/首屏/接口) | P1 | 工具测量 | 客户端 |
| 埋点上报 | P1 | 抓包抽查 | 产品 |
| 深度 UI 走查 | P1 | 人工对照 Figma | 产品 |
3. 测试环境
| 环境 | 用途 | 数据 |
|---|---|---|
| 本地 docker compose | 开发自测 | 种子数据 |
| staging | 集成测试 / 联调 / 弱网模拟 | 与 prod 同构;可重置;造数脚本(用户/账本/账目批量生成) |
| prod | 仅灰度与线上监控 | 真实数据(只读验证 + 监控) |
工具:Apifox/Postman(接口)、Charles(抓包/弱网模拟)、PerfDog(真机帧率)、Sentry(崩溃监控)。
4. 机型兼容矩阵(真机优先,云真机补齐)
| 档位 | 代表机型 | 数量 | 重点 |
|---|---|---|---|
| iOS 高端 | iPhone 15/14 | 1 | 主流体验基准 |
| iOS 中端 | iPhone 12/SE 3 | 2 | SE 验证小屏布局(375 宽红线) |
| Android 高端 | 小米 14 / 华为 Mate 60 | 2 | 华为:无 GMS,验证推送/分享 |
| Android 中端 | OPPO Reno / vivo S 系列 | 2 | WebView 版本差异 |
| Android 低端 | 2GB RAM 千元机(如红米入门款) | 2 | 性能红线主战场(R1 风险) |
系统底线:iOS 13+ / Android 7.0+(WebView 版本记录进测试报告)。
5. 专项测试设计
5.1 多人并发专项(P0)
| 用例 | 预期 |
|---|---|
| 两成员同时记不同账目 | 均成功、双方 3s 内互见、统计正确合并 |
| 离线状态下尝试编辑/删除账目 | 入口置灰/请求被拒(提示需联网),本地数据不受影响 |
| 两成员同时编辑同一笔 | LWW:后到达(服务器时间)覆盖;双方最终一致 |
| A 离线记 5 笔期间 B 记 3 笔,A 联网 | 8 笔全部入库无丢失;A 的幂等键防重 |
| A 上传中断网重试 3 次 | 服务端仅 1 条(client_txn_id 去重) |
| 成员被移除瞬间正在记账 | 该笔记账失败,明确提示无权限,本地数据保留 |
| owner 解散账本时成员在线 | 成员收到事件,账本从列表消失,本地缓存标记只读 |
5.2 弱网与离线专项(P0)
| 用例 | 预期 |
|---|---|
| 飞行模式记账 10 笔 → 恢复 | 30s 内全部同步成功,角标状态流转正确 |
| 3G 慢网(Charles 限速)下拉刷新 | 不 ANR 不闪退,超时有提示 |
| WS 断连(地铁场景模拟)期间他人记账 | 重连后 pull 兜底补齐,无数据缺口 |
| 本地版本落后超过 6 个月(模拟) | pull 返回 full_resync,客户端走 snapshot 全量重建,数据完整无缺口 |
| 同步失败(服务端 500) | 角标红色可重试;数据本地留存;重试成功后清角标 |
| 登录态过期时正在同步 | 静默刷新 token 重试,不打断用户 |
5.3 安全专项(P0)
| 用例 | 预期 |
|---|---|
| 非成员直接请求他人 ledger 的账目接口 | 40301,不含任何数据字段 |
| 遍历 transaction_id 猜测他人账目 | 40401(不区分存在性,防枚举) |
| member 调用移除成员/解散接口 | 40302 |
| 过期 accessToken 请求 | 40101 → 客户端静默刷新恢复 |
| refreshToken 被重复使用(轮换后旧 token) | 40102,要求重新登录 |
| 验证码暴力尝试(错误 5 次) | 锁定,42901 |
| 邀请码连续错误尝试(10 次) | 42901 锁定 1 小时(防 6 位码穷举) |
| amount 传负数 / 0 / 浮点 / 超上限 | 42201 |
| 修改他人账目(非记账人非 owner) | 40301/40302 |
| 抓包检查 HTTPS | 全链路 TLS,无明文敏感字段 |
5.4 金额精度专项(P0,自动化)
- 后端单测:分↔元换算边界(0.01 元、100 万上限、千分位)
- 客户端 money.ts 单测:
3500 分 → "35.00"、123456789 分 → 超限拒绝 - 统计对拍:随机生成 1000 笔账目,SQL 聚合 vs 接口返回逐字段相等
6. 准出标准(M5 门禁)
- P0 用例通过率 100%,P1 ≥ 95%(遗留项须有 workaround 说明)
- 后端核心模块行覆盖率 ≥ 60%(权限 Guard / 同步幂等 / 金额逻辑必须覆盖)
- 兼容矩阵全部机型无 P0/P1 缺陷;低端机记一笔 ≤ 5s、列表滚动无白屏
- 崩溃率(Dogfooding 期间)< 0.5%
- 安全专项全部通过(尤其越权三条)
- Dogfooding:团队 + 亲友 ≥ 10 人真实记账 ≥ 7 天,每人 ≥ 20 笔
7. 缺陷管理
- 分级:P0 阻断(崩溃/资损/越权)、P1 严重(功能不可用/体验劣化)、P2 一般、P3 轻微
- 流转:提交(附录屏/日志 request_id)→ 修复 → 回归 → 关闭;周五统计燃尽
- 上线门槛:P0=0、P1=0;P2 遗留 ≤ 5 个且列入 V1.1 首批修复