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次就崩了。查日志发现是一个第三方输入法在特定场景下空指针。嗯,这种问题人工测试根本测不出来。

注意:Monkey只负责发事件,不验证结果。它不知道你点了「登录」按钮后,页面有没有正常跳转。所以Monkey适合找崩溃和ANR,不适合做功能验证。

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就能搞定。

它的核心是UiDeviceUiSelector。看个例子:

UiDevice device = UiDevice.getInstance(getInstrumentation());
// 找到文本为"登录"的按钮
UiObject loginButton = device.findObject(new UiSelector().text("登录"));
loginButton.click();

UI Automator支持根据文本、ID、类名、描述等属性查找控件。比MonkeyRunner的坐标点击靠谱多了——你想想看,不同屏幕尺寸下,坐标完全不一样。

我在项目中遇到过一个问题:某个按钮的文本是动态加载的,有时候是「登录」,有时候是「Sign in」。用.text("登录")就找不到了。后来改用.textContains("登录")或者.descriptionContains("login")才解决。

小技巧:调试UI Automator时,可以用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层的一个参数传错了。

避坑指南:CTS测试对系统版本有严格要求。比如Android 13的CTS不能在Android 12的设备上跑。另外,跑CTS前一定要确保设备是user版本(非eng或userdebug),否则结果无效。

四者对比:什么时候用哪个?

工具 适用场景 优点 缺点
Monkey 随机压力测试,找崩溃和ANR 简单粗暴,无需写脚本 不验证结果,无法做功能测试
MonkeyRunner 简单的自动化操作和截图对比 支持Python脚本,可做断言 API老旧,图片对比不稳定
UI Automator 跨App的UI功能测试 支持控件查找,跨应用操作 学习成本稍高,需要写Java代码
CTS 系统兼容性验证 官方权威,覆盖全面 耗时长,环境要求严格

我个人建议的测试策略是这样的:

  • 日常开发:用UI Automator写核心功能的自动化用例
  • 版本发布前:用Monkey跑一晚上,看看有没有隐藏的崩溃
  • 系统定制:必须过CTS,否则没法预装Google服务
  • MonkeyRunner?嗯,除非你维护的是老项目,否则不太推荐了

知识体系图

下面这张图帮你理清这四个工具的关系和定位:

Android稳定性测试工具 Monkey 随机事件注入 MonkeyRunner Python脚本控制 UI Automator 控件级UI测试 CTS 系统兼容性验证 从左到右:自动化程度越来越高,测试深度越来越深

从这张图能看出来,这四个工具其实覆盖了不同的测试维度。Monkey在最底层,只管乱点;UI Automator在中间层,能做功能验证;CTS在最顶层,保证系统跟Google标准一致。你想想看,一个完整的稳定性测试方案,应该是从下往上层层递进的。

好了,关于这四个工具,我就聊这么多。每个工具都有它的脾气,用对了地方才能发挥价值。别指望Monkey能帮你测业务逻辑,也别指望CTS能帮你找随机崩溃——各司其职,才是正道。

一句话总结:Monkey找崩溃,MonkeyRunner做截图,UI Automator测功能,CTS保兼容。四者配合,才能覆盖Android稳定性的方方面面。

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