4. 稳定性测试核心指标

做固件升级稳定性测试,说白了就是回答一个问题:这版固件到底能不能放心地推出去?我见过太多团队,功能测试跑得欢,一上大规模升级就翻车。为什么?因为稳定性不是靠感觉,是靠指标说话的。

这一章,我把最关键的五个指标掰开揉碎讲清楚。每个指标背后,都有我踩过的坑。

4.1 成功率——最基础也最容易被骗的指标

成功率 = 成功升级的设备数 / 总升级设备数 × 100%。听起来简单吧?但这里有个陷阱:你统计的是「最终成功」还是「一次成功」?

我个人习惯把成功率分成两级:

  • 一次成功率:设备从开始升级到结束,中间没有重试、没有断点续传,一把过。
  • 最终成功率:允许重试、允许断点续传,只要最终版本号对了就算成功。

我在项目中遇到过一件事:某次OTA测试,最终成功率99.8%,看起来很美。但一查日志,发现30%的设备都重试过至少一次。用户感知呢?升级过程中卡住、重启、进度条不动——体验极差。所以我现在要求团队:一次成功率低于95%,直接打回。

我的经验阈值:
一次成功率 ≥ 98% (实验室环境)
一次成功率 ≥ 95% (外场弱网环境)
最终成功率 ≥ 99.5%

4.2 中断恢复率——考验升级鲁棒性的硬指标

升级过程中断,是家常便饭。断电、断网、用户强制重启、蓝牙断开……你想想看,如果设备在升级到一半时断电,重启后变砖了,这锅谁背?

中断恢复率衡量的就是:在各种异常中断后,设备能否恢复到可用状态。注意,不是「恢复到升级前」,而是「可用状态」——有时候升级前版本有bug,恢复回去反而更糟。

我一般把恢复场景分成三类:

中断类型 期望行为 测试方法
断电中断 上电后进入recovery模式,可重新升级 升级过程中随机断电,重复500次
通信中断 网络恢复后自动续传,或提示用户重试 升级过程中切断Wi-Fi/BLE,等待后恢复
存储写失败 回滚到上一版本,不丢失用户数据 模拟flash写错误,注入坏块
我曾经踩过的坑: 某款设备在断电恢复测试中,90%的情况都能正常回滚。但剩下10%——文件系统损坏,连recovery模式都进不去。后来发现是回滚时没有校验CRC。从那以后,我要求所有中断恢复测试必须跑满1000次,且零容忍「不可恢复」场景。

4.3 异常场景覆盖率——你的测试够「脏」吗?

很多团队的测试用例太「干净」了。网络永远满格,电量永远100%,存储空间永远够用。但真实世界呢?

异常场景覆盖率 = 已覆盖的异常场景数 / 所有可能异常场景数。这个指标很难做到100%,但至少要覆盖以下维度:

  • 网络异常:弱网、断网、高延迟、丢包、DNS劫持、CDN回源失败
  • 设备状态异常:低电量、存储满、CPU高负载、温度过高、多任务并发
  • 固件本身异常:签名校验失败、版本号冲突、分区表损坏、镜像大小超限
  • 用户行为异常:升级过程中强制重启、切换App后台、拔掉外设

我建议用矩阵法来设计异常场景。举个例子:

异常场景矩阵(部分)
┌──────────────┬──────────┬──────────┬──────────┐
│  网络状态    │ 低电量   │ 满电量   │ 充电中   │
├──────────────┼──────────┼──────────┼──────────┤
│  Wi-Fi稳定   │ 场景A    │ 场景B    │ 场景C    │
│  Wi-Fi弱网   │ 场景D    │ 场景E    │ 场景F    │
│  4G弱网      │ 场景G    │ 场景H    │ 场景I    │
│  无网络      │ 场景J    │ 场景K    │ 场景L    │
└──────────────┴──────────┴──────────┴──────────┘

每个交叉点都是一个测试用例。嗯,这里要注意:不是所有组合都有意义。比如「无网络+充电中」这种组合,重点测的是超时处理,而不是网络传输。

4.4 升级耗时分布——别让用户等崩溃

升级耗时,不只是「平均耗时」那么简单。我见过一个产品,平均升级耗时3分钟,但P99耗时达到了45分钟。你想想看,那1%的用户是什么体验?

我习惯用以下指标来描述耗时分布:

  • P50(中位数):一半用户在这个时间内完成
  • P95:95%的用户在这个时间内完成
  • P99:99%的用户在这个时间内完成
  • 最大值:最慢的那个倒霉蛋等了多久
我的建议: 如果P99耗时超过P50的3倍,说明你的升级流程存在严重的「长尾效应」。常见原因:弱网重试策略太激进、大文件下载没有分片、校验算法在低端芯片上跑不动。

另外,我习惯把升级过程拆成几个阶段来统计耗时:

  1. 下载阶段:从开始下载到下载完成
  2. 校验阶段:签名校验、CRC校验、版本兼容性检查
  3. 写入阶段:把固件写入flash/存储
  4. 重启阶段:设备重启、加载新固件、初始化

每个阶段的耗时分布都要单独看。我在项目中遇到过,下载阶段只占20%的时间,但校验阶段占了60%——因为用了软件CRC,没开硬件加速。换用硬件CRC后,整体耗时直接砍半。

4.5 资源消耗监控——升级不能拖垮系统

升级过程本身也是要消耗资源的。如果升级把CPU吃满、内存占光、电量耗干,那就算升级成功了,用户也会骂娘。

我一般监控以下资源:

资源类型 监控指标 警戒线
CPU 升级进程CPU占用率、系统总CPU占用率 峰值不超过80%,平均不超过50%
内存 升级进程RSS、系统可用内存 系统可用内存不低于总内存的20%
存储 临时文件占用、下载缓存占用 不超过可用存储的30%
电量 升级期间电量消耗速率 不超过正常待机的3倍
网络 瞬时带宽占用、连接数 不抢占其他业务的带宽

这里有个容易被忽略的点:资源释放。升级完成后,临时文件删了吗?缓存清了吗?网络连接关了吗?我见过一个案例,升级完成后内存没释放,导致系统越来越卡,最后用户只能重启。

资源监控的自动化做法:
在测试脚本中嵌入资源采集点,每100ms采样一次,生成时间序列图。重点关注「升级开始瞬间」和「校验阶段」的峰值。

4.6 核心指标关系图

这五个指标不是孤立的。它们之间的关系,我用一张图来展示:

固件升级稳定性核心指标关系图 升级稳定性 成功率 中断恢复率 异常场景覆盖率 升级耗时分布 资源消耗监控 说明: • 成功率和中断恢复率是「结果指标」,直接反映升级是否成功 • 异常场景覆盖率和资源消耗监控是「过程指标」,反映测试是否充分 • 升级耗时分布是「体验指标」,影响用户对升级的接受度 • 虚线箭头表示:异常场景覆盖率和资源消耗监控的结果,会反馈优化成功率和中断恢复率

4.7 指标之间的权衡

你可能会问:这五个指标,是不是越高越好?不一定。举个例子:

  • 为了提高成功率,你加了5次重试机制。结果呢?P99耗时从5分钟飙到了30分钟。
  • 为了提高中断恢复率,你做了双备份分区。结果呢?存储占用翻倍,低端设备装不下。
  • 为了提高异常场景覆盖率,你写了2000个测试用例。结果呢?测试周期从3天变成了3周。

所以,指标之间要平衡。我个人习惯的做法是:先定底线,再优化上限。比如:

  1. 成功率必须 ≥ 99%,这是红线
  2. 中断恢复率必须 ≥ 99.9%,这是红线
  3. 在满足前两条的前提下,P99耗时不超过P50的2倍
  4. 在满足前三条的前提下,资源消耗尽量低

这样排优先级,测试工作才不会跑偏。

一个小技巧: 每次版本迭代,把这五个指标做成雷达图。对比上一版本和这一版本,一眼就能看出哪里退步了。我团队现在每个sprint的review会上,雷达图是必看项。