22、OTA测试方法论:自动化测试框架、升级场景覆盖、压力测试与稳定性测试
OTA测试,说白了就是给系统升级做“全身体检”。
我见过太多团队,代码写得很漂亮,一到测试就翻车。为什么?因为OTA升级不是简单的文件拷贝,它涉及分区、签名、校验、回滚、断电保护……任何一个环节出问题,用户手机就可能变砖。
所以,这一章我们聊聊怎么系统地测OTA。我会把我在项目中踩过的坑、总结的方法论,都摊开来讲。
一、自动化测试框架:让机器替你干活
手动测OTA?一次两次还行,几十次下来你会崩溃。我建议从一开始就搭建自动化框架。
1.1 框架选型
我个人习惯用 Python + ADB + 设备集群 的组合。为什么?因为ADB是Android标配,Python生态丰富,设备集群可以并行跑。
核心组件:
- 调度层:管理测试用例、设备分配、结果收集
- 执行层:通过ADB发送命令、刷写镜像、触发升级
- 校验层:检查升级后的版本号、功能、日志
- 报告层:生成HTML/JSON报告,自动发送通知
1.2 一个简单的测试脚本骨架
import subprocess
import time
def flash_ota(device_id, ota_package):
"""刷写OTA包到指定设备"""
cmd = f"adb -s {device_id} sideload {ota_package}"
subprocess.run(cmd, shell=True)
time.sleep(10) # 等待重启
def check_version(device_id, expected_version):
"""检查升级后的版本"""
cmd = f"adb -s {device_id} shell getprop ro.build.version.incremental"
result = subprocess.check_output(cmd, shell=True).decode().strip()
return result == expected_version
def run_test():
devices = ["emulator-5554", "emulator-5556"]
ota_pkg = "ota_update.zip"
expected_ver = "20250301"
for dev in devices:
print(f"Testing on {dev}")
flash_ota(dev, ota_pkg)
if check_version(dev, expected_ver):
print(f"{dev}: PASS")
else:
print(f"{dev}: FAIL")
if __name__ == "__main__":
run_test()
小技巧:记得在脚本里加入重试机制。我曾经遇到过ADB偶尔超时,加个3次重试后,稳定性从80%提升到99%。
二、升级场景覆盖:别漏掉那些“刁钻”情况
你以为OTA就是“下载-安装-重启”三步走?太天真了。实际场景复杂得多。
2.1 场景分类
| 场景类型 | 具体用例 | 我踩过的坑 |
|---|---|---|
| 正常升级 | 从版本A升级到版本B | —— |
| 跨版本升级 | 从Android 12直接升到14 | 分区表不兼容,升级后无法挂载/data |
| 增量升级 | 只更新差异部分 | 补丁文件校验失败,导致无限重启 |
| 降级 | 从版本B回退到版本A | 降级后selinux策略冲突,系统服务崩溃 |
| 中断恢复 | 升级过程中断电/断网 | 恢复后系统处于“半升级”状态 |
2.2 场景覆盖策略
我建议用 正交实验法 来设计用例。把变量列出来:
- 升级方式:全量 / 增量 / 差分
- 网络状态:WiFi / 4G / 无网络
- 电量状态:满电 / 低电量 / 充电中
- 存储空间:充足 / 不足 / 刚好够
然后组合这些变量,至少覆盖80%的组合。剩下的20%用随机测试补上。
注意:低电量升级是个大坑。我曾经遇到过电量低于15%时,系统直接拒绝升级,但日志里没有任何提示。后来发现是PowerManager的阈值没处理好。
三、压力测试:把系统逼到极限
压力测试不是为了测功能,而是为了测“极限”。
3.1 并发升级
同时让10台、50台、100台设备升级。看看服务器扛不扛得住,设备之间会不会互相干扰。
我记得有一次,100台设备同时请求升级包,服务器带宽被打满,结果所有设备都下载到一半就超时了。后来我们加了CDN和限流策略。
3.2 连续升级
让一台设备连续升级100次。每次升级后检查:
- 系统是否还能正常启动
- 用户数据是否丢失
- 日志是否被撑爆
嗯,这里要注意:连续升级最容易暴露的是 日志轮转 问题。logcat日志如果不清理,/data分区会被占满。
3.3 资源耗尽测试
在升级过程中,同时跑CPU密集型任务、内存分配、IO读写。看看OTA进程会不会被饿死。
我曾经遇到过,升级过程中系统触发lowmemorykiller,把OTA进程给杀了。结果系统卡在recovery模式,用户只能强刷。
四、稳定性测试:让Bug无处遁形
稳定性测试,说白了就是“长时间、多轮次、随机操作”。
4.1 Monkey测试
用Android自带的Monkey工具,在升级完成后随机发送事件:
adb shell monkey -p com.android.systemui --throttle 200 -s 12345 5000
跑个几万次事件,看看系统会不会崩溃、ANR、重启。
4.2 长时间运行
升级完成后,让设备连续运行72小时。期间:
- 每隔1小时执行一次核心功能(打电话、发短信、上网)
- 每隔6小时重启一次
- 记录所有异常日志
4.3 回滚测试
升级失败后,系统必须能回滚到上一个版本。这个测试很容易被忽略。
我建议这样测:
- 刷入版本A
- 模拟升级到版本B(比如故意放一个坏包)
- 检查系统是否自动回滚到版本A
- 检查用户数据是否完整
核心原则:OTA测试不是为了证明“能升级”,而是为了证明“升级失败后系统还能用”。
五、知识体系总览
下面这张图,是我对OTA测试方法论的整体梳理。你可以把它当作测试计划的骨架。
我的建议:不要试图一次性覆盖所有测试。先搭自动化框架,再补场景覆盖,最后上压力和稳定性。一步步来,稳扎稳打。
好了,这一章的内容就这些。OTA测试没有银弹,但有了这套方法论,至少你不会在关键时候翻车。
公众号:蓝海资料掘金营,微信deep3321