简介

  日志是非常重要的,用于记录系统、软件操作事件的记录文件或文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统、软件的活动等重要作用,在开发或者测试软系统过程中出现了问题,我们首先想到的就是她——logging。她可不像泰戈尔说的:“天空没有留下翅膀的痕迹,但我已经飞过”;Monkey这个小姑娘,她可是一个爱炫耀,爱显摆的人已经达到了人过留名、雁过留声的境界。只要我们按图索骥就一定可以定位到问题所在,然后分析问题,解决问题。好了逗大家一乐,下面开始进入今天的正题。

1.为什么要看Monkey日志管理

  Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。这样你就不会只停留在一个点点点的点工上,对自己也是一个很好的提升。

2.Monkey Log分析:

当monkey测试时出现问题,此时我们需要分析定位问题,我们需要分析monkey日志

Monkey测试出现的异常的原因: 
一般是两种原因导致的,一个是crash 程序崩溃,导致crash原因如下 
a)、程序存在空指针 
b)、cpu不足 
c)、内存不足

另一种是ANR 程序无响应,导致anr无响应原因如下: 
a)、线程阻塞 
b)、cpu不足 
c)、内存不足

查找分析原因:

1. 当monkey测试出现异常终止,请打开logcat日志搜索关键字‘anrin’,如果存在该关键字,说明app出现了ANR异常,我们需要把/data/anr目录下的trace.txt文件取下来。 
2. 取下来trace.txt文件后,将出现问题的进程号对应的日志发给软件工程师定位,如果在logcat日志里没有搜索到’anrin’关键字,就搜索’nullpointer’异常关键字的上下日志,发给开发定位 
3. 当出现ANR后,需要导出,步骤如下: 
1. 输入adb shell 
2. 输入cd /data/anr/ 
3. 输入ls

退出exit后,直接在cmd下输入
4. adb pull /data/anr/traces.txt   d:\trace.txt 
5. 在logcat将出现anr问题的进程号复制,然后在trace.txt文件里按ctrl+F 查找,粘贴进程号,查找对应的问题

2.1Monkey结果分类

Monkey运行log输出,按下列顺序输出

下面就是我贴出的详细LOG分析:(表情代替注释符号,以免跟日志搞混)

☀ 伪随机种子数与事件总数
:Monkey: seed=1519697645236 count=10 ☀ 允许测试包
:AllowPackage: 包名1 ☀ Category包含的LAUNCHER
:IncludeCategory: android.intent.category.LAUNCHER ☀ Category包含的MONKEY
:IncludeCategory: android.intent.category.MONKEY ☀ 查询允许包的activity 结果列表
// Selecting main activities from category android.intent.category.LAUNCHER ☀ 这些都不是指定包的activity
// - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser)
// - NOT USING main activity com.android.calendar.homepage.AllInOneActivity (from package com.android.calendar)
// - NOT USING main activity com.android.camera.Camera (from package com.android.camera) .... ☀ 中间忽略,从这也可以看出你手机上都安装了哪些应用
☀ 这个就是我们指定的包的activity
// + Using main activity 包名1.ui.portal.WelcomeActivity (from package 包名1)
// Selecting main activities from category android.intent.category.MONKEY ☀ 种子为1519697645236
// Seeded: 1519697645236 ☀ 事件百分比
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0% ☀ 表示跳转到com.crazyhornets.MyHokageAndroidZSY包中的com.crazyhornets.MyHokage.MyHokageActivity里
☀ 查看log中第一个Switch,主要是查看 Monkey 执行的是那一个 Activity,譬如下面的 log 中,执行的是com.yulore.yellowpage/.activity.SplashActivity,
在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
:Switch:
#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end ☀ 允许此Intent跳转
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily ☀ 以下就是事件间的延迟和发送的各种事件
☀ --pct-nav事件
☀ sleeping for 0 milliseconds这句 log 是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。(这个事件是指从用户角度来说的一个事件,比如点击:实际包括手指按下与抬起两个动作,monkey日记将被记为2个事件)
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
Sleeping for 0 milliseconds
:Switch:
#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily ☀ --pct-touch事件
Sleeping for 0 milliseconds
:Sending Touch (ACTION_DOWN): 0:(532.0,1392.0)
:Sending Touch (ACTION_UP): 0:(542.04724,1391.5958) ☀ --pct-motion事件
Sleeping for 0 milliseconds
:Sending Touch (ACTION_DOWN): 0:(838.0,113.0)
:Sending Touch (ACTION_UP): 0:(852.82526,101.77225) ☀ --pct-trackball事件
Sleeping for 0 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(1.0,4.0)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,-3.0) ☀ --pct-rotation屏幕旋转百分比 ####隐藏事件
: Sending rotation degree=0, persist=true
: Sending rotation degree=1, persist=false:
: Sending rotation degree=2, persist=true
: Sending rotation degree=3, persist=false ☀ 注入事件10
Events injected: 10 ☀ 发送屏幕翻转 度=0,存留=假
:Sending rotation degree=0, persist=false ☀ 丢弃:键=0,指针=0,轨迹球=0,键盘轻弹=0,屏幕翻转=0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0 ☀ 网络状态:占用时间=42ms(手机0ms,wifi0ms,未连接42ms)
## Network stats: elapsed time=42ms (0ms mobile, 0ms wifi, 42ms not connected) ☀ 如果 Monkey 测试顺利执行完成,在 log 的最后,会打印出当前执行事件的次数和所花费的时间Monkey finished代表执行完成。Monkey 执行完成的 log 具体如下:
Events injected: 100:Sending rotation degree=0, persist=false:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0## Network stats: elapsed time=2042ms (0ms mobile, 0ms wifi, 2042ms not connected)// Monkey finished ☀ Monkey 执行中断,在 log 的最后也能查看到当前大约已执行的次数
:Sending Trackball (ACTION_MOVE): 0:(-3.0,1.0):Sending Trackball (ACTION_MOVE): 0:(4.0,0.0) //[calendar_time:2018-04-02 11:23:50.322 system_uptime:718998] // Sending event #7500:Sending Trackball (ACTION_MOVE): 0:(3.0,-2.0) ☀ Monkey测试完成
// Monkey finished ☀ CRASH输出LOG:
// CRASH: cn.包名1 (pid 3165)
// Short Msg: java.lang.IllegalStateException
// Long Msg: java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity
// Build Label: Xiaomi/sagit/sagit:7.1.1/NMF26X/V9.2.4.0.NCACNEK:user/release-keys
// Build Changelist: V9.2.4.0.NCACNEK
// Build Time: 1516183841000
// java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity
// at android.support.v4.app.Fragment.getResources(Fragment.java:646)
// at cn.yaomaitong.app.ui.message.fragment.SingleChatFragment$13$1.run(SingleChatFragment.java:586)
// at android.os.Handler.handleCallback(Handler.java:754)
// at android.os.Handler.dispatchMessage(Handler.java:95)
// at android.os.Looper.loop(Looper.java:163)
// at android.app.ActivityThread.main(ActivityThread.java:6365)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)
☀ ANR输出LOG
//NOT RESPONDING:com.android.quicksearchbox(pid 6333)
ANR in com.android.quicksearchbox(com.android.quicksearchbox/.SearchActivity)
CPU usage from 8381ms to 2276ms ago:
procrank: ->adb shell procrank
anr traces: ->保存于/data/anr/traces.txt
meminfo: ->adb shell dumpsys meminfo
Bugreport ->adb bugreport 可选通过 --bugreport 参数控制

3.快速从monkey.txt日志中定位问题

3.1测试结果初步判断

1.monkey执行时未加--ignore-crashes --ignore-crashes参数,就先浏览日志中Events injected: 值,查看当前已执行的次数,就知道有无bug

2.程序无响应的问题:在日志中搜索 “ANR”

3.崩溃问题:在日志中搜索 “Exception” ,在这里顺便提一下常见的Java异常:

 算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
违法访问错误:IllegalAccessError
内存不足错误:OutOfMemoryError
堆栈溢出错误:StackOverflowError .其他,请参考:https://www.cnblogs.com/cvst/p/5822373.html

3.2找出问题后的操作步骤:

1.找到是monkey里面的哪个地方出错

2.查看Monkey里面出错前的一些事件动作,并手动执行该动作

3.若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样。

4.日志导出

  细心地小伙伴可能通过前边的一系列操作和查找日志定位问题,发现docs命令窗口在查看和操作的时候特别地不方便,那么Monkey有没有像Tomcat等其他工具那样有log日志文件,很不幸告诉小伙伴们答案是:NO!,但是好消息是:我们可以将日志导出到文件中。然后将文件导出到手机或者是电脑上。

4.1导出方法

导出到手机:

C:\Users\Shuqing>adb shell

monkey -v 100 >/sdcard/monkeylog.log

注意:不能写成C:\Users\Shuqing>adb shell monkey -f /sdcard/kyb.txt -v 1 > /mnt/sdcard/monkey.log 否则会报错“系统找不到指定的路径”。

需要将手机连接PC,拷贝以上文件:我们需要对这3个文件进行分析整理,以便提交开发人员处理。

当然了除了这种方法也比较麻烦,你可以通过命令直接导出到PC电脑端

导出到电脑:

例如:保存到电脑上并命名为monkey.txt

>adb shell monkey [option] <count> >d:\monkey.txt

eg:

C:\Users\Shuqing>adb shell monkey -v -v 100 >d:\monkeylog.txt

以上的导出方法,导出日志后,标准流和错误流的日志混合在一起,给我们定位和分析问题又带来麻烦了,因此需要将其分开导出保存。

标准流和错误流分开保存:

标准流与错误流分开保存,代码如下:
Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt C:\Users\Shuqing>adb shell monkey -v 100 1>d:\monkey.log 2>d:\error.log
执行以上命令,Monkey的运行日志和异常日志将被分开保存。此时Monkey的运行日志将被保存在monkey.txt文件中,而异常日志将被保存在D盘下的error.txt中。

各个文件主要内容:

info.txt:主要记录了MONKEY测试时发送的各种事件,如触摸事件的位置等等。

error.txt:主要记录了MONKEY测试时产生的一些ANR、强制关闭等异常。

LOG文件:主要主要记录程序对MONKEY测试时的响应情况。

5.日志参数

1、-v 较少的日志信息 
2、-v -v 较为丰富的日志信息 
3、-v -v -v 最高级别的日志信息(推荐)

6.小结

初步分析方法:

(1)、找到是monkey里面的哪个地方出现错误

(2)、查看monkey里面出错前的一些事件动作,并手动执行该动作

(3)、若以上步骤还不能找到,可以使用之前执行monkey命令,再执行一遍,注意使用的seed值要一样

测试结果分析:

(1)、ANR问题(程序无响应):在日志中搜索“ANR"(application no response)

(2)、闪退问题:在日志中搜索"crash"

(3)、异常:搜索"exception"

(4)、强制退出:搜索"force closed"

好了,今天关于日志就到这里了!

您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得点波 推荐 哦!!!(点击右边的小球即可)

个人公众号

微信群

Appium+python自动化(二十)- 猴哥失散多年的混血弟弟还是妹妹- Monkey(猴子)日志(超详解)的更多相关文章

  1. Appium+python自动化(十九)- 猴哥失散多年的混血弟弟还是妹妹- Monkey(猴子)参数(超详解)

    简介 前边几篇介绍了Monkey以及Monkey的事件,今天就给小伙伴们介绍和分享一下Monkey的参数. 首先我们看一下这幅图来大致了解一下: 1.Monkey 命令 基本参数介绍 -p <允 ...

  2. Appium+python自动化(十八)- 你难道是猴哥失散多年的混血弟弟还是妹妹???- Monkey事件(超详解)

    操作事件简介 Monkey所执行的随机事件流中包含11大事件,分别是触摸事件.手势事件.二指缩放事件.轨迹事件.屏幕旋转事件.基本导航事件.主要导航事件.系统按键事件.启动Activity事件.键盘事 ...

  3. Appium+python自动化(十七)- 你难道猴哥失散多年的混血弟弟 - Monkey简介之开山篇(超详解)

    简介 今天由宏哥给小伙伴们来介绍猴哥的混血弟弟=Monkey.Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Android模拟器和实体设备上. Monk ...

  4. Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)

    简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或 ...

  5. Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解)

    简介 你有道灵光从天灵盖喷出来你知道吗,年纪轻轻就有一身横练的筋骨,简直百年一见的练武奇才啊,如果有一天让你打通任督二脉,那还不飞龙上天啊.正所谓我不入地狱谁入地狱,警恶惩奸维护世界和平这个任务就交个 ...

  6. Appium+python自动化(十二)- Android UIAutomator终极定位凶“胸”器(七)(超详解)

    简介 乍眼一看,小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了,其实不然,上次介绍和分享的大哥是uiautomatorviewer,是一款定位工具.今天介绍的是一个java库,提供执行自动化测 ...

  7. Appium+python自动化(三十二)- 代码写死一时爽,框架重构火葬场 - PageObject+unittest(超详解)

    简介 江湖有言:”代码写死一时爽,框架重构火葬场“,更有人戏言:”代码动态一时爽,一直动态一直爽

  8. Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)

    简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...

  9. Appium+python自动化(二十一)- 让猴子按你指令大闹手机,让你成为耍猴高手 - Monkey(猴子) - MonkeyScript(超详解)

    简介 一年一度的暑假如期而至,每年必不可少的,便是<西游记>这部经典电视连续剧的播出,作为一名90后,对于这部经典剧的情谊,就是观看已成为一种习惯.依然深刻的记得,小时候妈妈为了催促我睡觉 ...

随机推荐

  1. 2018-4-25 1.如何在GitHub上新建一个新的项目并下载该项目及如何提交新的文件

  2. nltk处理文本

    nltk(Natural Language Toolkit)是处理文本的利器. 安装 pip install nltk 进入python命令行,键入nltk.download()可以下载nltk需要的 ...

  3. 在Azure中新建Linux

    开始学习Linux,这里开个系列用来记录Linux的学习笔记,这些是在实验楼:https://www.shiyanlou.com/的学习笔记. 这一篇是在Azure中新建一个Ubuntu的服务器用于练 ...

  4. Q_DECLARE_METATYPE(继承QObject的类都已经自动注册),注册后的类型可以作为QVariant的自定义类型

    简介 这个宏用来注册一个类(含默认构造.默认析构.拷贝构造函数)为QMetaType类型 ,注册后的类型可以作为QVariant的自定义类型. 这个宏应该放在类或者结构体外面的下面,也可以放在一个非公 ...

  5. linux c 读写 ini 配置文件

    .ini 文件格式如下: [section1] key1=value ... keyn=value [section2] key1=value ... keyn=value 代码如下: #define ...

  6. Js 动态插入css js文件

    function loadjscssfile(filename,filetype){ var file, //动态插入的文件 doc = document; if(filetype == " ...

  7. Google+团队如何测试移动应用 - from Google Testing Blog

    How the Google+ Team Tests Mobile Apps by Eduardo Bravo Ortiz “移动第一”在当下已成为很多公司的口头禅.但是能够用一种合理的方法来测试移动 ...

  8. ansible(二)

    一.软件相关模块 1.yum(下载包) 正常操作 yum 与rpm的区别 yum可以解决依赖关系rpm 全称readhat package manager(红帽包管理工具),需要自己解决依赖 yum源 ...

  9. 八大排序算法 JAVA实现 亲自测试 可用!

    今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题! 另:说一下什么是八大排序算法: 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排 ...

  10. Node 在chrome上调试

    先确保node是否安装成功: 然后 1.创建node_module块,并在同一层级创建一个服务: 如server.js: 2.下载调试工具devtool: npm install -g devtool ...