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 回滚测试

升级失败后,系统必须能回滚到上一个版本。这个测试很容易被忽略。

我建议这样测:

  1. 刷入版本A
  2. 模拟升级到版本B(比如故意放一个坏包)
  3. 检查系统是否自动回滚到版本A
  4. 检查用户数据是否完整

核心原则:OTA测试不是为了证明“能升级”,而是为了证明“升级失败后系统还能用”。

五、知识体系总览

下面这张图,是我对OTA测试方法论的整体梳理。你可以把它当作测试计划的骨架。

OTA测试方法论 自动化测试框架 Python + ADB 设备集群并行 结果自动收集 升级场景覆盖 全量/增量/差分 跨版本/降级 中断恢复 压力测试 并发升级 连续升级100次 资源耗尽 稳定性测试 Monkey随机事件 72小时连续运行 回滚验证 目标:升级失败后系统还能用,用户数据不丢

我的建议:不要试图一次性覆盖所有测试。先搭自动化框架,再补场景覆盖,最后上压力和稳定性。一步步来,稳扎稳打。

好了,这一章的内容就这些。OTA测试没有银弹,但有了这套方法论,至少你不会在关键时候翻车。


公众号:蓝海资料掘金营,微信deep3321