41、稳定性测试工具:Monkey、MonkeyRunner、UI Automator、CTS测试
说到Android稳定性测试,我脑子里第一个蹦出来的词就是「Monkey」。这名字起得真贴切——就像一只猴子在手机上乱点乱划。但你别小看它,我见过不少项目,上线前被Monkey跑一宿,第二天早上发现几十个ANR和崩溃,救了大命。
今天咱们把这四个工具掰开揉碎聊一聊。它们各有各的脾气,用对了是神器,用错了就是摆设。
Monkey:最暴力的随机测试
Monkey是Google官方提供的命令行工具。它干的事很简单:往你的App上随机发送各种事件。点击、滑动、按键、音量调节……说白了就是模拟一个喝醉的用户在乱操作。
用法也直接:
adb shell monkey -p com.example.app -v 5000
这条命令的意思是:对com.example.app这个包,发送5000个随机事件,并且打印详细日志。
我个人习惯加几个常用参数:
--throttle 200:每个事件间隔200毫秒,别太快,否则有些异步操作来不及响应-s 12345:指定随机种子,这样复现问题时可以用同样的序列--ignore-crashes:遇到崩溃不停止,继续跑--ignore-timeouts:遇到ANR也不停
我曾经在某个ROM项目里,Monkey跑了不到1000次就崩了。查日志发现是一个第三方输入法在特定场景下空指针。嗯,这种问题人工测试根本测不出来。
MonkeyRunner:带脚本的Monkey
MonkeyRunner是Monkey的升级版。它用Python写脚本,可以控制设备做更复杂的操作。比如截图、比较图片、等待某个控件出现。
我举个例子:
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
device = MonkeyRunner.waitForConnection()
device.startActivity(component="com.example/.MainActivity")
MonkeyRunner.sleep(2)
# 截图并保存
result = device.takeSnapshot()
result.writeToFile("screenshot.png", "png")
# 点击坐标
device.touch(200, 400, "DOWN_AND_UP")
MonkeyRunner比Monkey强在哪?它能做断言。你可以截图后跟预期图片对比,判断UI是否正确。但说实话,这工具现在用的人不多了。为什么?因为它的API比较老旧,而且图片对比在分辨率不同的设备上容易误判。
我个人建议:如果你只是做简单的自动化点击,用MonkeyRunner还行。但要做复杂的UI测试,还是看下面这个。
UI Automator:Google亲儿子
UI Automator是Android官方推荐的UI测试框架。它最大的特点是:可以跨App操作。比如你从微信分享到微博,这种跨应用的场景,UI Automator就能搞定。
它的核心是UiDevice和UiSelector。看个例子:
UiDevice device = UiDevice.getInstance(getInstrumentation());
// 找到文本为"登录"的按钮
UiObject loginButton = device.findObject(new UiSelector().text("登录"));
loginButton.click();
UI Automator支持根据文本、ID、类名、描述等属性查找控件。比MonkeyRunner的坐标点击靠谱多了——你想想看,不同屏幕尺寸下,坐标完全不一样。
我在项目中遇到过一个问题:某个按钮的文本是动态加载的,有时候是「登录」,有时候是「Sign in」。用.text("登录")就找不到了。后来改用.textContains("登录")或者.descriptionContains("login")才解决。
uiautomatorviewer工具查看当前界面的控件树。它能帮你确认控件的属性值,省得猜来猜去。
CTS测试:兼容性的照妖镜
CTS全称是Compatibility Test Suite。它不是用来测单个App的,而是用来测整个Android系统的。任何厂商想预装Google服务,必须通过CTS测试。
CTS测试包含几十万个测试用例,覆盖了:
- API兼容性:你的系统实现跟Google官方API是否一致
- 权限管理:有没有漏掉或滥用权限
- 多媒体:音视频编解码是否正常
- 传感器:陀螺仪、加速度计等是否工作
- 安全:有没有已知漏洞
跑CTS的命令大概是这样:
./cts-tradefed
run cts --plan CTS
跑一次完整的CTS,少则几个小时,多则一两天。我见过最惨的一次,某个厂商改了底层驱动,结果CTS里200多个摄像头相关的用例全挂了。最后发现是HAL层的一个参数传错了。
四者对比:什么时候用哪个?
| 工具 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Monkey | 随机压力测试,找崩溃和ANR | 简单粗暴,无需写脚本 | 不验证结果,无法做功能测试 |
| MonkeyRunner | 简单的自动化操作和截图对比 | 支持Python脚本,可做断言 | API老旧,图片对比不稳定 |
| UI Automator | 跨App的UI功能测试 | 支持控件查找,跨应用操作 | 学习成本稍高,需要写Java代码 |
| CTS | 系统兼容性验证 | 官方权威,覆盖全面 | 耗时长,环境要求严格 |
我个人建议的测试策略是这样的:
- 日常开发:用UI Automator写核心功能的自动化用例
- 版本发布前:用Monkey跑一晚上,看看有没有隐藏的崩溃
- 系统定制:必须过CTS,否则没法预装Google服务
- MonkeyRunner?嗯,除非你维护的是老项目,否则不太推荐了
知识体系图
下面这张图帮你理清这四个工具的关系和定位:
从这张图能看出来,这四个工具其实覆盖了不同的测试维度。Monkey在最底层,只管乱点;UI Automator在中间层,能做功能验证;CTS在最顶层,保证系统跟Google标准一致。你想想看,一个完整的稳定性测试方案,应该是从下往上层层递进的。
好了,关于这四个工具,我就聊这么多。每个工具都有它的脾气,用对了地方才能发挥价值。别指望Monkey能帮你测业务逻辑,也别指望CTS能帮你找随机崩溃——各司其职,才是正道。
公众号:蓝海资料掘金营,微信deep3321