2018-05-04 Monkey 日志分析

Monkey 日志分析是 Monkey 测试中非常重要的一个环节,通过日志分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。

1、Monkey 日志的保存方法

Monkey 运行日志常见的保存方法有三种:
(1)保存在 PC 中,代码如下:
adb shell monkey [option] <count> >d:\monkey.txt
执行以上命令, Monkey 的运行日志将被保存在 PC 上的 D 盘下的一个 monkey.txt 文件中。
(2)保存在手机中,代码如下:

>adb shell
>monkey [option] <count> > /mnt/sdcard/monkey.txt

执行以上命令, Monkey 的运行日志将被保存在手机中的 SD 卡上的一个 monkey.txt 文件中。
(3)标注流与错误流分开保存,代码如下:

Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt

执行以上命令, Monkey 的运行日志和异常日志将被分开保存。此时 Monkey 的运行日志将被保存在 monkey.txt 文件中,而异常日志将被保存在 error.txt 中。
如果 Monkey 执行期间存在 Crash (崩溃)或 ANR ( Application Not Responding ,应用程序无响应), error.txt 中会显示错误日志。

 日志内容分析:
一般测试结果分析-搜索关键字:
1.程序无响应,ANR问题:在日志中搜索“ANR”
2.崩溃问题:在日志中搜索“CRASH”
3.其他问题:在日志中搜索”Exception”

2、Monkey 日志内容解析

Monkey 运行时输出的日志一般包含四类信息,分别是测试命令信息、伪随机事件流信息、异常信息、 Monkey 执行结果信息:
(1)测试命令信息
monkey 启动后会输出当前所执行命令的各种参数信息,其中包括种子( Seed )信息、事件数量、可运行的应用列表以及各事件百分比等。这些信息都是通过 Monkey 命令参数所指定的,这部分日志信息的解析,如下所示:

// 测试命令信息
// 随机种子值,执行事件数量
:Monkey: seed=1454215444564 count=10
// 可运行的应用列表
:AllowPackage: com.tencent.android.qqdownloader
//Category 包含LAUNCHER 和MONKEY
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// 各事件的百分比
// Event percentages:
// 0: 15.0% 事件0 :--pct-touch
// 1: 10.0% 事件1 :--pct-motion
// 2: 2.0% 事件2 :--pct-pinchzoom
// 3: 15.0% 事件3 :--pct-trackball
// 4: -0.0% 事件4 :--pct-rotation
// 5: 25.0% 事件5 :--pct-nav
// 6: 15.0% 事件6 :--pct-majornav
// 7: 2.0% 事件7 :--pct-syskeys
// 8: 2.0% 事件8 :--pct-appswitch
// 9: 1.0% 事件9 :--pct-flip
// 10: 13.0% 事件10 :--pct-anyevent

(2)伪随机事件流信息
当 Monkey 开始执行测试后,会顺序输出执行的事件流信息,主要是前面提到的 11 大事件。这部分日志信息的解析,如下所示:

// 执行的事件流信息
// 启动App 事件
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000component=com.tencent.android.qqdownloader/com.tencent.assistant.activity.SplashActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.android.qqdownloader/com.tencent.assistant.activity.SplashActivity } in packagecom.tencent.android.qqdownloader
// 轨迹球事件
:Sending Trackball (ACTION_MOVE): 0:(4.0,2.0)
// 点击事件
:Sending Touch (ACTION_DOWN): 0:(387.0,1858.0)
:Sending Touch (ACTION_UP): 0:(385.8215,1861.3011)
// 延时
Sleeping for 0 milliseconds 
...

(3)异常信息
当 Monkey 执行过程中遇到错误时,会输出对应异常信息,如下所示:

// 发送Crash 的应用包名和pid
// CRASH: com.tencent.android.qqdownloader (pid 912)
//Crash 的简要信息
// Short Msg: java.lang.ClassNotFoundException
//Crash 的详细信息
// Long Msg: java.lang.ClassNotFoundException: Didn't find class "com.qq.AppService.AstApp" on path DexPathList[[zip file "/data/app/com.tencent.android.qqdownloader-2.apk"],nativeLibraryDirectories[/data/app-lib/com.tencent.android.qqdownloader-2, /vendor/lib, /system/lib]]
// 机型和系统信息
// Build Label: Xiaomi/pisces/pisces:4.4.4/KTU84P/5.12.24:user/release-keys
// Build Changelist: 5.12.24
// Build Time: 1450958964000
//Crash 的详细日志
// java.lang.RuntimeException: Unable to instantiate application com.qq.AppService.AstApp: java.lan.ClassNotFoundException: Didn't find class "com.qq.AppService.AstApp" on path: DexPathList[[zip fil "/data/app/com.tencent.android.qqdownloader-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.
tecent.android.qqdownloader-2, /vendor/lib, /system/lib]]
// at android.app.LoadedApk.makeApplication(LoadedApk.java:509)
// at android.app.ActivityThread.access$1500(ActivityThread.java:138)
// at dalvik.system.NativeStart.main(Native Method)
// ... 11 more
//

(4)Monkey 执行结果信息
当 Monkey 执行完所有事件后,会输出执行结果信息,其中包括执行的事件数量、旋转的角度、丢失的事件数量、网络状态以及 Monkey 最终的执行结果:

// 执行的事件数量
Events injected: 10
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络联网0ms ,Wi-Fi 联网0ms ,没联网144ms
## Network stats: elapsed time=144ms (0ms mobile, 0ms wifi, 144ms not connected)
// Monkey finished

如果 Monkey 执行过程中出现了异常导致执行失败,会输出对应的执行失败的原因,第几个事件执行失败以及所使用的随机种子数:

// 显示
Monkey 执行失败
** Monkey aborted due to error.
// 执行的事件数量
Events injected: 8
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态
## Network stats: elapsed time=405ms (0ms mobile, 0ms wifi, 405ms not connected)
// 提示在执行到第8 个事件时出现Crash ,以及所使用的随机种子的值
** System appears to have crashed at event 8 of 100 using seed 1454216848235

日志内容分析:
一般测试结果分析-搜索关键字:
1.程序无响应,ANR问题:在日志中搜索“ANR”;
2.崩溃问题:在日志中搜索“CRASH”;
3.其他问题:在日志中搜索”Exception”;

重现问题:
Monkey测试出现错误后,一般的查错步骤为以下几步:
1.找到是monkey里面的哪个地方出错;
2.查看Monkey里面出错前的一些事件动作,并手动执行该动作;
3.若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样;

3、Monkey日志异常信息查找

Monkey 执行过程中常见的错误类型主要有两类:应用程序无响应( ANR )和崩溃( Crash )。
ANR 是指当 Android 系统监测到应用程序在 5 秒内没有响应输入的事件或广播在 10 秒内没有执行完毕时抛出无响应提示。当出现 ANR 时弹出的错误提示框如下图所示:


图片.png

Crash 是指当应用程序出现错误时导致程序异常停止或退出的情况,当出现 Crash 时通常会弹出对应的错误提示框如下图所示:


图片.png

要统计 Monkey 日志中错误出现的次数也非常简单,只要搜索关键字 “ANR” 和 “CRASH” 出现的次数即可。由于通常 Monkey 测试的日志会比较大,日志内容也非常多,为了简化统计操作,可以使用bat 脚本进行统计,具体如代码清单如下所示:

rizhi02.bat

@echo off&setlocal enabledelayedexpansion
: 设置所有Monkey 日志存放的目录
set ff=C:\Users\admin\Desktop\log\*.txt
: 设置查询关键字
set str=CRASH crash ANR died Exception exception
: 设置查询结果存放的目录
set fileName=Result.txt
: 开始查询
echo  正在统计&echo;
echo %date% %time% >%fileName%
echo.>>%fileName%
echo  分析结果:>>%fileName%
echo ---------------------------------------------->>%fileName%
: 依次打开目录下每一个Monkey 日志查询关键字并输出个数
(for %%a in (%str%)do (
    set n%%a=0&set/p= %%a : <nul>con
    for /f "delims=" %%b in ('findstr "%%a" "%ff%"')do (
        set h=%%b
        call :yky %%a)
    echo !n%%a!>con
    echo  关键字 %%a 共有 !n%%a!  处
))>>%fileName%
echo.>>%fileName%
: 针对崩溃的日志输出其所在文件行数
echo  崩溃日志:>>%fileName%
findstr "%str%" "%ff%">>%fileName%
echo/&pause&exit
:yky
set/a n%1+=1
set h=!h:*%1=!
if defined h if not "!h:*%1=!"=="!h!" goto :yky

图片.png

执行bat文件后,在脚本目录下会生成Result.txt文件记录异常出现的次数:
图片.png

根据统计结果,可以得到 Crash 和 ANR 出现的次数,以及出现在哪个日志文件中,出现该错误的包名。如果需要更详细的错误信息,可以打开对应的 Monkey 日志文件查询。通过详细日志信息,测试可以定位到引起 Crash 的原因,以及出现 Crash 的代码行信息。这里给出常见的一些 Crash 错误信息:
图片.png

当获取到 Crash 和 ANR 日志信息后,理论上开发人员就可以开始根据日志内容分析和定位问题了。但事实上,要定位问题单靠日志信息还是非常困难的,有时候开发人员还需要知道问题复现的场景,同时增加更多的调试日志以协助定位。这时候,他们可能会期望测试能够复现问题或者提供问题出现场景和操作步骤。通常,测试人员可以通过使用同一个种子数( seed 值),再次执行 Monkey来尝试复现问题。这种方法比较费时,并且不是所有的随机 Crash 和 ANR 都可以通过这种方法来复现。那问题来了,在 Monkey 出现问题的时候有没有可能即时地截图并且记录下操作步骤呢? Monkey本身是没有这个能力的,但是通过一些 Monkey 改造可以实现该功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • Android Monkey 压力测试 介绍 什么是Monkey Monkey测试,就像一只猴子,在电脑面前,乱敲...
    木七七姑娘阅读 2,461评论 1 7
  • monkey 测试 读书笔记 1. monkey 的基本使用 monkey文档官方网址:https://devel...
    csmijo阅读 9,227评论 0 23
  • 一、Monkey简介: Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发...
    DINGCHAO_阅读 8,735评论 3 8
  • 一、monkey介绍 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送...
    小_小_桂阅读 986评论 0 53
  • 守 何为守?模仿不要只看表面,而是要看本质!当然学也要学核心而不是只学肤浅的东西! 和谁学?一定要有一个榜样,成龙...
    sun清风悠扬阅读 155评论 1 3