Appium+python自动化(二十)- 猴哥失散多年的混血弟弟还是妹妹- Monkey(猴子)日志(超详解)
简介
日志是非常重要的,用于记录系统、软件操作事件的记录文件或文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统、软件的活动等重要作用,在开发或者测试软系统过程中出现了问题,我们首先想到的就是她——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异常:
1 算术异常类:ArithmeticExecption 2 空指针异常类:NullPointerException 3 类型强制转换异常:ClassCastException 4 数组负下标异常:NegativeArrayException 5 数组下标越界异常:ArrayIndexOutOfBoundsException 6 违背安全原则异常:SecturityException 7 文件已结束异常:EOFException 8 文件未找到异常:FileNotFoundException 9 字符串转换为数字异常:NumberFormatException 10 操作数据库异常:SQLException 11 输入输出异常:IOException 12 违法访问错误:IllegalAccessError 13 内存不足错误:OutOfMemoryError 14 堆栈溢出错误:StackOverflowError 15.其他,请参考: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"
好了,今天关于日志就到这里了!
您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得点波 推荐 哦!!!(点击右边的小球即可)
个人公众号
微信群
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的
本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/du-hong 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
公众号(关注宏哥)                                                                                 客服微信