20、Logcat 在自动化测试中的应用:Monkey、UiAutomator 日志分析
自动化测试,说白了就是让机器替我们点来点去。但机器不会思考,出了问题它只会傻傻地报错。这时候,Logcat 就是我们唯一的救命稻草。
我个人习惯,每次跑自动化测试之前,都会先清空一次日志。这样后面产生的所有信息,都是跟本次测试直接相关的。嗯,这个习惯帮我省了不少排查时间。
Monkey 测试与日志解读
Monkey 测试,就是系统随机乱点。你想想看,一个 App 被成千上万次随机点击,什么奇葩场景都能触发。我曾在项目中遇到过,Monkey 跑了半小时,App 突然闪退,但没有任何崩溃弹窗。查了半天,原来是底层的一个 Service 挂了。
Monkey 的启动命令很简单:
adb shell monkey -p com.example.app -v 10000
这里的 -v 是日志级别。一个 -v 只输出基础信息,两个 -v 会输出更多细节。我一般用三个 -v:
adb shell monkey -p com.example.app -v -v -v 10000 > monkey_log.txt
Monkey 日志里,我们需要重点关注几个关键信息:
- ANR 事件:日志中如果出现
ANR in字样,说明应用无响应了 - 崩溃信息:
CRASH或FATAL EXCEPTION是重点 - 系统异常:比如
NullPointerException、OutOfMemoryError
Monkey 日志分析要点
我曾经遇到过一次,Monkey 跑了 2 万次都没问题,但第 20001 次就崩了。后来发现是某个资源文件在特定场景下没释放。所以,Monkey 测试一定要跑足够多的次数,别偷懒。
UiAutomator 日志分析
UiAutomator 比 Monkey 智能多了。它是按脚本执行的,每一步都有明确的预期。但正因为如此,一旦脚本失败,我们需要快速定位是哪个步骤出了问题。
UiAutomator 的日志输出,一般会包含这些内容:
| 日志内容 | 含义 |
|---|---|
UiAutomator: [INFO] |
正常执行信息 |
UiAutomator: [ERROR] |
脚本执行错误 |
UiObject: [WARN] |
控件查找警告 |
Instrumentation: [FAILED] |
测试用例失败 |
我个人习惯,在写 UiAutomator 脚本时,会在关键步骤前后加上 Log 输出。比如:
Log.i("MyTest", "开始点击登录按钮");
UiObject loginBtn = device.findObject(new UiSelector().text("登录"));
loginBtn.click();
Log.i("MyTest", "登录按钮点击完成");
这样在 Logcat 里,我就能清楚地看到每一步的执行情况。如果某一步卡住了,日志会停在对应的位置,排查起来非常方便。
小技巧
用 adb logcat -s MyTest 只过滤你自己的日志,别让系统日志淹没了关键信息。
自动化测试日志的常见问题
跑自动化测试时,Logcat 里经常会出现一些让人头疼的问题。我总结了几种常见情况:
- 日志太多,找不到重点:用
grep或findstr过滤关键词 - 日志时间对不上:检查手机和电脑的时间是否同步
- 日志被截断:用
adb logcat -d一次性输出,别用实时流
注意
千万不要在自动化测试脚本里频繁调用 Log.e()。我见过有人每点击一次就输出一个 Error 级别的日志,结果 Logcat 缓冲区被撑爆,真正的错误反而被冲掉了。
知识体系图
下面这张图,展示了自动化测试中 Logcat 的核心应用逻辑:
这张图的核心逻辑很简单:Monkey 负责暴力测试,UiAutomator 负责精准验证。两者都离不开 Logcat 的日志支撑。说白了,没有日志,自动化测试就是瞎子摸象。
我记得有一次,团队里新来的同事跑 UiAutomator 脚本,总是报错找不到控件。他折腾了半天,最后发现是脚本里写错了包名。如果当时他看一眼 Logcat 里的 UiObject: [WARN] 信息,早就发现问题了。
嗯,自动化测试和 Logcat 的关系,就像鱼和水。你离不开它,它也离不开你。掌握好日志分析,你的自动化测试效率至少能提升一倍。
公众号:蓝海资料掘金营,微信deep3321