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 字样,说明应用无响应了
  • 崩溃信息CRASHFATAL EXCEPTION 是重点
  • 系统异常:比如 NullPointerExceptionOutOfMemoryError

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 里经常会出现一些让人头疼的问题。我总结了几种常见情况:

  • 日志太多,找不到重点:用 grepfindstr 过滤关键词
  • 日志时间对不上:检查手机和电脑的时间是否同步
  • 日志被截断:用 adb logcat -d 一次性输出,别用实时流

注意

千万不要在自动化测试脚本里频繁调用 Log.e()。我见过有人每点击一次就输出一个 Error 级别的日志,结果 Logcat 缓冲区被撑爆,真正的错误反而被冲掉了。

知识体系图

下面这张图,展示了自动化测试中 Logcat 的核心应用逻辑:

Logcat 自动化测试 Monkey 随机测试 ANR / CRASH / 异常捕获 日志级别控制 (-v -v -v) 大量测试次数验证 UiAutomator 脚本 关键步骤日志埋点 控件查找失败定位 自定义 Tag 过滤 快速定位问题,提升测试效率

这张图的核心逻辑很简单:Monkey 负责暴力测试,UiAutomator 负责精准验证。两者都离不开 Logcat 的日志支撑。说白了,没有日志,自动化测试就是瞎子摸象。

我记得有一次,团队里新来的同事跑 UiAutomator 脚本,总是报错找不到控件。他折腾了半天,最后发现是脚本里写错了包名。如果当时他看一眼 Logcat 里的 UiObject: [WARN] 信息,早就发现问题了。

嗯,自动化测试和 Logcat 的关系,就像鱼和水。你离不开它,它也离不开你。掌握好日志分析,你的自动化测试效率至少能提升一倍。


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