测试策略
分层总览
| 层 | 保证什么 | 判据 |
|---|---|---|
| 单元测试 | 组件行为正确 | 断言 |
| 解析解对照 | 仿真器没写错(机制正确性) | 仿真均值落入闭式解 CI |
| 确定性快照 | 同版本同平台可复现 | 逐位一致 |
| 统计回归 | 跨版本 / 重构不改分布 | 均值 ± CI 相容 |
| 并行确定性 | 线程数不影响结果 | 逐位一致 |
| 性能 smoke | 算力预算不漂移 | 时长阈值 |
解析解对照是最有力的一层:单元测试证明"每块零件符合规格",解析解证明"整机算出来的答案客观上是对的"。
单元测试
覆盖:RNG 派生(键相同 → 值相同;键任一分量不同 → 值不同)、Clock / 事件队列(有序性)、公式求值(对照手算)、战斗结算、经济聚合、成长曲线、指标聚合器(对照朴素实现)。
解析解对照
确认模拟器没有写错的最有力手段:构造存在闭式解的场景,比较仿真结果与数学期望。
例 1——期望伤害:命中概率 p、命中伤害恒为 a − d,则 N 场战斗总伤害的期望是 N·p·(a−d),方差闭式可算。仿真均值必须落入闭式值 ± 3σ。
例 2——期望收益:玩家每日固定打 k 场副本、掉落期望 g,则 30 天金币总收入的期望是 30·k·g。同理对照。
例 3——流失模型:恒定流失概率 p_c 下,D7 留存的期望是 (1−p_c)⁷(与仿真口径对齐后对照)。
要求:至少一条解析解测试进入 Phase 1 验收(路线图);新增系统时,凡存在闭式解的机制必须配对照测试。
确定性测试:快照 vs 统计回归
两层不要混用
快照测试:同版本 + 同平台 + 同 seed → 结果逐位一致。实现为结果摘要(规范化 JSON)的哈希快照,CI 中比对;字节级偏差即回归。
统计回归:跨版本或重构后,浮点结果允许不同(优化器、依赖升级都可能改变浮点细节),改为比较指标均值 ± CI 是否相容。
| 场景 | 用哪层 |
|---|---|
| 日常 CI(同平台) | 快照(逐位) |
| 升级 Rust 版本 / 依赖 / 重构后 | 快照更新 + 统计回归确认分布未漂移 |
| native ↔ wasm 比对(同配置同 seed) | 统计回归(基础算术逐位一致,超越函数允许 ULP 级差异,见确定性随机数) |
| 跨平台比对 | 统计回归(浮点不承诺跨平台逐位) |
并行确定性测试
同一实验在 rayon 线程数 = 1 / 4 / 满核下运行,结果摘要必须逐位一致。这是并行确定性规则(有序容器、固定归约)的守卫测试。
Monte Carlo 统计测试
涉及随机性的端到端性质用统计断言:多 seed 复跑后检验均值、方差、置信区间、分位数是否落在理论或历史基线范围内。不要求这类测试的浮点逐位一致。
性能守卫
criterion 基准覆盖热点(公式求值、事件循环、指标聚合);10,000 玩家 × 30 天全流程时长纳入 CI 冒烟,超过预算(分钟级)即警告——防止架构级性能退化悄悄累积。
CI 集成
GitHub Actions:每个 push 跑单元 + 快照 + 并行确定性 + 解析解对照,外加 cargo check --target wasm32-unknown-unknown 平台门禁(core 引入平台依赖立即失败,见仿真内核);统计回归与性能基准在依赖升级与发布前手动触发。