09 · 测试策略
所属:运动会积分榜系统 · 开发文档集
版本:v0.1(讨论稿) · 2026-09-09
上游:README · 相关:02-积分与排名规则
1. 测试分层
| 层次 |
范围 |
工具 |
要求 |
| 单元测试 ★ |
积分引擎、排名、tie-break、并列、双倍、破纪录、撤销重算 |
Vitest |
覆盖所有规则分支,≥60 用例,必过 |
| 集成测试 |
API + 权限 + 事务 + 审计 |
Vitest + Fastify inject |
关键路径全覆盖 |
| 实时测试 |
快照/增量/重连/乱序/重复/心跳 |
Vitest + socket.io-client |
模拟断线重连 |
| E2E |
录入 → 发布 → 大屏更新 |
Playwright |
至少 3 条主流程 |
| 压测 |
50 大屏 + 5 管理端并发 |
autocannon / 自写脚本 |
延迟 <100ms,无内存增长 |
| 彩排 |
真实数据全流程 |
人工 |
赛前必做 |
2. 积分引擎测试用例矩阵
引擎是纯函数,输入「成绩集合 + 积分模板」,输出「流水 + 排名」。以下用例必须在 M2 阶段全部通过。
| # |
用例 |
期望 |
| 1 |
8 人参赛正常排名 |
9/7/6/5/4/3/2/1 |
| 2 |
两人并列第 2(skip) |
7/7/-/5/4/3/2/1 |
| 3 |
两人并列第 2(average) |
6.5/6.5/-/5/4/3/2/1 |
| 4 |
三人并列第 3(skip) |
6/6/6/-/-/3/2/1 |
| 5 |
团体项目双倍 |
18/14/12/… |
| 6 |
破纪录 + 双倍 |
成绩分双倍,破纪录加分不双倍 |
| 7 |
并列第一的奖牌计数 |
2 金 0 银 1 铜 |
| 8 |
发布后撤销 |
流水作废,总分回退 |
| 9 |
修改已发布成绩 |
旧流水作废 + 新流水,审计可查 |
| 10 |
弃权者不占名次 |
名次顺延 |
| 11 |
报名不足 8 人 |
按实际名次取分 |
| 12 |
人工扣分后排名变化 |
tie-break 正确重排 |
| 13 |
同分 tie-break |
金牌 → 银牌 → 铜牌 → 编码 |
| 14 |
破纪录多级别 |
取最高档(max 模式) |
| 15 |
破纪录多级别(sum 模式) |
累加 |
| 16 |
一条成绩归属两个单位(联队) |
按配置拆分或整体归属 |
| 17 |
重复发布同一组 |
幂等,不产生重复流水 |
| 18 |
乱序应用增量 |
最终状态一致 |
3. 集成测试重点
| 场景 |
断言 |
| 未登录调写接口 |
401 / AUTH_REQUIRED |
recorder 尝试发布 |
403 / FORBIDDEN |
| 发布触发推送 |
大屏客户端收到 change 且 version 递增 |
| 撤销发布 |
流水作废、大屏回退、审计有记录 |
| 并发修改同一项目 |
后者收到 CONFLICT |
重复提交同一 requestId |
返回首次结果,不重复写 |
4. 实时同步测试
- 连接 →
hello → 收到 snapshot。
- 断开 10 秒期间产生 3 次变更 → 重连收到
catchup 且最终状态一致。
- 重复投递同一
change → 客户端忽略。
- 服务端重启 → 客户端重连后 version 不回退。
- 心跳超时 → 客户端显示离线角标。
5. E2E 主流程
- 登录 → 选择项目 → 录入成绩 → 存草稿 → 发布 → 大屏出现新成绩与积分变化。
- 撤销发布 → 大屏回退 → 重新录入并发布。
- 登记破纪录 → 确认 → 大屏播放破纪录动效 → 积分榜加分正确。
6. 压测指标
| 指标 |
目标 |
| 大屏客户端数 |
50 并发长连接 |
| 管理端 |
5 并发操作 |
| 发布接口 P95 |
< 100ms |
| 推送延迟 P95 |
< 500ms |
| 连续运行 24h |
内存增长 < 10% |
7. 彩排清单(赛前必做)