介绍两个比较全面的monkey测试命令:

1、adb shell monkey -v -v -v -s 8888 --throttle 300 --pct-touch 30 --pct-motion 25 --pct-appswitch 25 --pct-majornav 5 --pct-nav 0 --pct-trackball 0 -p com.wwdy.app 10000 >D:\monkey.txt

这是一个比较完整的monkey测试命令,3个-v显示最详细的测试信息,指定种子值为8888,指定触摸事件占30%、手势事件占25%、Activity跳转占25%、主导航占5%、方向导航0%、轨迹球0%,剩下的15%随机分配给其它未指定的事件,约束只测试包名为com.wwdy.app的应用,指定事件数为10000次,输出的测试信息保存到D盘的monkey.txt文件中。

由于10000次耗时太长,这里改成10次执行该命令向大家解释一下测试结果信息。(正式测试可改成10000甚至更多次)

2、adb shell monkey -s 123456 -v -p com.xiachufang --ignore-crashes --ignore-timeouts --pct-touch 60 --throttle 300 100 2>D:\zuoting\works\Monkey测试/error.txt 1>D:\zuoting\works\Monkey测试/verbose.txt

2>D:\zuoting\works\Monkey测试/error.txt Level 2日志保存到电脑上的error.txt中

1>/sdcard/verbose.txt  Level 1日志保存到sdcard上的verbose.txt中

在monkey自动化测试(命令行)这里我们需要在最后的命令行里面加上配置。

日志分析:

一、一般测试结果分析-搜索关键字:

1、无响应问题可以在日志中搜索 “ANR” 。

2、崩溃问题搜索 “CRASH” 。

3、内存泄露问题搜索"GC"(需进一步分析)。

4、异常问题搜索 “Exception”(如果出现空指针, NullPointerException,需格外重视)。

详细说明

1、 ANR问题:在日志中搜索“ANR”(“Application Not Responding"),说明有bug,出现ANR,一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应。这个就是一个比较严重的缺陷。把耗时的操作另起线程来处理就可以了。

二. 详细分析monkey日志:
将执行Monkey生成的log,从手机中导出并打开查看该log;在log的最开始都会显示Monkey执行的seed值、执行次数和测试的包名。
首先我们需要查看Monkey测试中是否出现了ANR或者异常,具体方法如上述。然后我们要分析log中的具体信息,方法如下:
查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。

:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity;end 
// Allowing start of Intent {act=android.intent.action.MAIN cat=
[android.intent.category.LAUNCHER]cmp=com.tencent.smtt/.SplashActivity } in package com.tencent.smtt

在下面的log中,Sending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表当前执行了一个单击的操作;
Sleeping for 500 milliseconds这句log是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。

SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN   代表当前执行了一个点击下导航键的操作;
Sending Pointer ACTION_MOVE     代表当前执行了一个滑动界面的操作。
:Sending Pointer ACTION_DOWN x=47.0 y=438.0
:Sending Pointer ACTION_UP x=47.0 y=438.0Sleeping for 500 milliseconds
:SendKey (ACTION_DOWN): 20   //KEYCODE_DPAD_DOWN:SendKey (ACTION_UP): 20   //KEYCODE_DPAD_DOWNSleeping for 500 milliseconds
:Sending Pointer ACTION_MOVE x=-2.0 y=3.0
:Sending Pointer ACTION_MOVE x=4.0 y=-3.0
:Sending Pointer ACTION_MOVE x=-5.0 y=-3.0
:Sending Pointer ACTION_MOVE x=3.0 y=4.0
:Sending Pointer ACTION_MOVE x=-4.0 y=1.0
:Sending Pointer ACTION_MOVE x=-1.0 y=-1.0
:Sending Pointer ACTION_MOVE x=-2.0 y=-4.0

如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;// Monkey finished代表执行完成。Monkey执行中断,在log的最后也能查看到当前已执行的次数。Monkey执行完成的log具体如下:

Events injected: 6000
:Dropped: keys=0 pointers=9 trackballs=0 flips=0
## Network stats: elapsed time=808384ms (0ms mobile, 808384ms wifi, 0msnot connected)
// Monkey finished

三、常见问题的具体分析

1、Null指针异常
空指针异常主要是有NullPointerException异常提示,在Monkey测试过程中,该信息一般记录在plog.log (locat中也有该信息)中。
如果Monkey命令被中断,说明有异常信息并且有对应的打印信息,可以看到如下信息,说明几个问题:
A、android.process.acore该进程出现异常
B、异常信息主要是由于NullPointerException引起的,也就是出现了空指针,导致了acore进程进入debug
C、具体的可以继续分析是由哪个函数的那一行导致的,如可以从rollAnimate3dRotate.java文件中的275行查找等。
//at com.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)
D、可能同一应用中存在多处的空指针异常,所以一旦出现空指异常后,可以分析和对比log信息,如果不一致的话,需要把新的log信息也一同添加到bug中,如果log信息一致的话,则不需要继续补充没有必要的log信息。
**************************************************************************

// CRASH: android.process.acore (pid 1339)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:e
ng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.NullPointerException:
//   at com.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)
//   at com.android.launcher.Workspace.dispatchDraw(Workspace.java:605)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at com.android.launcher.DragLayer.dispatchDraw(DragLayer.java:258)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)
//   at android.view.ViewRoot.draw(ViewRoot.java:1333)
//   at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
//   at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
//   at android.os.Handler.dispatchMessage(Handler.java:99)
//   at android.os.Looper.loop(Looper.java:123)
//   at android.app.ActivityThread.main(ActivityThread.java:4203)
//   at java.lang.reflect.Method.invokeNative(Method.java:-2)
//   at java.lang.reflect.Method.invoke(Method.java:521)
//   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
//   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
//   at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 7908 of 5000000 using seed 0

2、debug异常
debug异常主要是由于应用程序本身的错误导致的异常。在Monkey测试过程中,该信息同样记录在plog.log (locat中也有该信息)中。一般情况下,出现的该问题,很可能在手动测试时也可以测试到。
A、com.android.browser该进程进入debug
B、出现的是IllegalStateException异常,该异常一般多是传递的参数非法或被多次调用时出现的异常
C、Bug信息提交时,详细信息中一般应该包含如下的log信息,方便开发人员分析和定位。
************************************************************************

// CRASH: com.android.browser (pid 5683)
// Short Msg: Connection is not open
// Long Msg: java.lang.IllegalStateException: Connection is not open
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.IllegalStateException: Connection is not open
//   at android.net.http.AndroidHttpClientConnection.assertOpen(AndroidHttpClien
tConnection.java:153)
//   at android.net.http.AndroidHttpClientConnection.setSocketTimeout(AndroidHtt
pClientConnection.java:195)
//   at android.net.http.Connection.openHttpConnection(Connection.java:364)
//   at android.net.http.Connection.processRequests(Connection.java:225)
//   at android.net.http.ConnectionThread.run(ConnectionThread.java:116)
** System appears to have crashed at event 34155 of 5000000 using seed 0**

3、低内存异常
低内存异常一般情况下,主要表现在出现OutOfMemoryError异常或者提示Out of memory,其后果同样表现为抛出OutOfMemoryError异常或者是通过kill process 来杀掉部分进程以释放内存空间,当然如果被kill点关键的进程的话,也就可能导致部分应用会自动的退出。出现该情况时,主要是在进行频繁的进行大量的操作导致的,所以使用手动的方式也是可能进行重现的。
A、com.android.elastos.backup该进程出现的异常
B、出现的是OutOfMemoryError异常,该异常一般多频繁的操作(即多次调用某个函数,存在申请变量空间未释放)导致的
C、Bug信息提交时,详细信息中同样应该包含如下的log信息,方便开发人员分析和定位。

// CRASH: com.android.elastos.backup (pid 1581)
// Short Msg: bitmap size exceeds VM budget
// Long Msg: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.OutOfMemoryError: bitmap size exceeds VM budget
//   at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)
//   at android.graphics.Bitmap.createBitmap(Bitmap.java:464)
//   at android.graphics.Bitmap.createBitmap(Bitmap.java:431)
//   at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:336)
//   at android.widget.AbsListView.preScaleBitmapBG(AbsListView.java:2354)
//   at android.widget.AbsListView.draw(AbsListView.java:2365)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)
//   at android.view.ViewRoot.draw(ViewRoot.java:1333)
//   at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
//   at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
//   at android.os.Handler.dispatchMessage(Handler.java:99)
//   at android.os.Looper.loop(Looper.java:123)
//   at android.app.ActivityThread.main(ActivityThread.java:4203)
//   at java.lang.reflect.Method.invokeNative(Method.java:-2)
//   at java.lang.reflect.Method.invoke(Method.java:521)
//   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
//   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
//   at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 143290 of 100000000 using seed 0#
或者出现plog信息的最后出现如下log信息也可能存在同样问题:
<3>[56351.640641] Out of memory: kill process 14177 (app_process) score 247872 or a child
<3>[56351.641121] Killed process 14177 (app_process)

4、操作无响应异常
操作无响应的问题,NOT RESPONDING,主要表现在Monkey运行过程中,出现某功能无响应,提示是否“强制关闭“或“等待“,同时会打印出相应的log信息,如下:
A、可以说明com.android.soundrecorder该进程出现的无响应
B、出现的是TimerOut异常,该异常一般出现时一般都会又keyDispatchingTimedOut提示
C、目前,uPhone手机中经常出现操作无响应的几个模块包括:clock、camera、soundrecorder、broser等,根据开发人员分析其他模块也是有可能出现操作无响应的,测试过程中,请多注意。
D、出现无响应异常,一般情况下很难被修复,和发送事件的频率也是有关系的,从质量上来要求的话,要求尽可能的减少出现操作无响应的频率和时间。

// NOT RESPONDING: com.android.soundrecorder (pid 1931)
ANR in process: com.android.soundrecorder (last in com.android.soundrecorder)
Annotation: keyDispatchingTimedOut
CPU usage:
Load: 8.24 / 8.41 / 8.25
CPU usage from 35911ms to 83ms ago:com.android.soundrecorder: 4% = 3% user + 0% kernel / faults: 997 minor 43 maj
ormediaserver: 2% = 2% user + 0% kernel / faults: 267 minor 3 majorandroid.process.media: 2% = 0% user + 1% kernel / faults: 563 minor 194 majorsystem_server: 1% = 1% user + 0% kernel / faults: 1279 minor 5 majorcom.cootek.touchpal: 0% = 0% user + 0% kernel / faults: 180 minor 1 majorsensorserver_ya: 0% = 0% user + 0% kernel / faults: 47 minor 1 majormmcqd: 0% = 0% user + 0% kernelapp_process: 0% = 0% user + 0% kernel / faults: 203 minor 1 majorcom.fihtdc.brservice: 0% = 0% user + 0% kernel / faults: 29 minorkswapd0: 0% = 0% user + 0% kernelcom.android.settings: 0% = 0% user + 0% kernel / faults: 266 minorport-bridge: 0% = 0% user + 0% kernel / faults: 19 minorrpcrouter: 0% = 0% user + 0% kernelcom.android.mms: 0% = 0% user + 0% kernel / faults: 135 minor 8 major
TOTAL: 13% = 8% user + 4% kernel + 0% iowaitprocrank:PID      Vss      Rss      Pss      Uss  cmdline1209   35368K   25376K   15283K   14036K  system_server1342   32788K   24596K   14899K   14136K  android.process.acore……
// procrank status was 0
anr traces:
// meminfo status was 0
** System appears to have crashed at event 59034 of 5000000 using seed 0

5、其他异常
A、Restart System异常(系统重新启动),即log信息的最后几行会看到Restart System的打印信息,说明手机被自动的重启或断掉,有几个方面的原因
1、运行过程中,存在异常手机被自动重启
2、手机在运行过程中,进入设置中的恢复出场设置,导致手机重启
3、其他原因,如果手机后盖移动等
B、RuntimeException等异常,同样的会在plog.log中可以看到相应的打印信息, java.lang.RuntimeException该问题多出现在操作无响应之后,或者是某应用的服务无法启动或连接时,需要具体问题具体的分析
C、StaleDataException、readException等异常, 在plog.log中可以看到相应的打印信息,也会有相应的信息: android.database.StaleDataException,该信息说明android的数据库操作出现异常, 需要具体问题具体的分析
D、IllegalArgumentException等异常,多少情况下为说明向函数传递了一个不正确或不合法的参数需要具体问题具体的分析
E、其他,待补充和分析说明

说明几点:
1、log信息的分析,希望在bug信息的简述中能够明确说明清楚出现的是什么异常,具体的log信息要单独添加到详细信息描述中,方便相关人员定位和查看。
2、bug的提交,对于Monkey测试出现的问题:
        a、首先要求分析log信息
        b、再次要确认该bug是否已经提交?已经提交的bug和新运行出来的问题是否一致?
        c、如果不一致的话,是否属于同一问题,如空指针异常,是的话就把该问题的log信息一起                        注释到bug信息中,并添加所有的log信息
        d、如果不一致的,也不属于同一问题的话,可以提交新的bug
        3、在java编程中,一般的异常都会抛出xxx Exception的信息,可以跟进xxx进行相关的判断和分析,具体的异常则需要具体问题具体分析。

6、常见的java异常

  • 算术异常类:ArithmeticExecption

  • 空指针异常类:NullPointerException

  • 类型强制转换异常:ClassCastException

  • 数组负下标异常:NegativeArrayException

  • 数组下标越界异常:ArrayIndexOutOfBoundsException

  • 违背安全原则异常:SecturityException

  • 文件已结束异常:EOFException

  • 文件未找到异常:FileNotFoundException

  • 字符串转换为数字异常:NumberFormatException

  • 操作数据库异常:SQLException

  • 输入输出异常:IOException

  • 违法访问错误:IllegalAccessError

  • 内存不足错误:OutOfMemoryError

  • 堆栈溢出错误:StackOverflowError 1


实际操作中遇见的问题及解决办法:

1、usb调试中开启允许模拟点击iakaError: A RuntimeException occurred

2、


adb log分析

日志是由五部分组成的:

  • 1、写下日志时的时间
  • 2、优先级,在android中,日志的级从低到高分以下几种​​​​​​​
    • V——Verbose(啰嗦,最低级别,开发调试中的一些详细信息,仅在开发中使用,不可在发布产品中个输出)
    • D——Debug(调试,用于调试的信息,可以在发布产品中关闭,比较常见)
    • I——Info(信息,一般提示性的信息)
    • W——Waring(警告)
    • E——Error(错误,已经出现可影响运行的错误,比如应用crash时输出的日志)
  • 3、标签,标明日志发起者和方便日志的过滤筛选,如ActivityManager
  • 4、PID(进程ID),如图中的1758
  • 5、正文,本日志的主体内容
  • 分析 

    • ​​​​​​​
  • 1、app发生闪退
    • ​​​​​​​​​​​​​​关键字:Force finishing(强制停止)+对应的app包名

adb-monkey-log分析相关推荐

  1. Monkey框架(测试方法篇) - monkey日志分析

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

  2. 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 1...

    老李推荐:第6章1节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览 在上一章中我们有简要的介绍了事件源是怎么一回事,但是并没有进行详细的描述.那么往下的这几个 ...

  3. 无埋点数据收集和adb monkey测试屏蔽通知栏

    简单记录百度移动统计android无埋点sdk使用和monkey测试屏蔽通知栏的问题 1.无埋点sdk使用 很简单,下载完sdk后导入到项目中 , 参考sdk文档进行就可以了,个人觉得比友盟还简单,几 ...

  4. Android开机阶段log分析

    Android开机阶段log分析 标签(空格分隔): 开关机流程 Android开机阶段log分析 bootchart工具查看开机过程 打印开机过程各阶段的时间 kernel Init进程 Zygot ...

  5. Android ANR bugreport log分析

    最近工作中频繁遇到设备ANR问题,而且是概率性的那种,于是决定花点时间找找规律复现分析下 说道这里,抓日志是问题解决的最有效途径,这里不得不说一下 bugreport log,其实网上关于它的分析方法 ...

  6. adb monkey

    常用adb命令及monkey命令详解 测试 基于这篇文章,给大家再深入一下. 一.常用adb命令 1.adb devices:查看已连接的设备 2.adb version:查看adb的版本序列号 3. ...

  7. android 常见死机问题--log分析

    android 常见死机问题--log分析 ============================================================================== ...

  8. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  9. 掉网问题的log分析

    2019独角兽企业重金招聘Python工程师标准>>> 1.如何得知网络小区不支持紧急通话 => 查看modem log: PS    113821    37504    1 ...

  10. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些事件 ...

最新文章

  1. 20175203 2018-2019 实验五《网络编程与安全》
  2. libxml2_ZC积累
  3. 面试总结-腾讯产品群面
  4. Mycat安全权限配置user_配置mycat用户只读数据---MyCat分布式数据库集群架构工作笔记0031
  5. Mysql 远程自动化备份
  6. 使用itextsharp导出pdf表格排版问题
  7. C#实现Modbus协议与PLC通信
  8. 2019年高考必备:高中数学向量解题技巧
  9. 「2022 最新版」未认证微信公众号图文中插入外部链接教程
  10. 内容对齐 TextAlignment VerticalAlignment HorizontalAlignment contentMode
  11. 记录《时间进度》(人生进度条)(包含自定义进度、小插件)的开发
  12. 区块链之一 起源思想和本质
  13. 学生选课系统项目设计报告
  14. 3650M5 IMM 配置升级
  15. 大数据告诉你:2018年该学习什么技术
  16. 鲜为人知的PCB抄板常识,您了解多少?
  17. centos7 下双网卡如何配置静态IP
  18. LeetCode(C++):寻找两个有序数组的中位数
  19. Linux配置JAVA环境变量(全部)
  20. 影视网QQ群机器人接口对接 苹果CMS视频jiexi站

热门文章

  1. HDFS的机架感知(rack aware)
  2. angular8.x + ngx-translate实现国际化
  3. 计算机网络的组成有哪些
  4. 截止到2011年,在五大学科国际奥赛获得金牌最多的中学们
  5. 看电影学英语是学习口语的最佳方式
  6. 谷歌放弃火狐的谷歌工具栏产品
  7. https://pypi.tuna.tsinghua.edu.cn/packages/97/ae/0b08f53498417914f2274cc3b5576d2b83179b0cbb209457d0f
  8. 小飞升值记——(4)
  9. 【东方传说】世间万物 六界轮回
  10. 计算机专业学生的学期规划,大学生大一下学期规划