Android Monkey压力测试

1、Monkey简介:

Monkey是Android中的一个命令行工具,能够运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击、滑动、Application切换、横竖屏、应用关闭)实现对正在开发的应用程序进行压力测试。monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法。只针对Activity作测试,不能对Service作测试。

html

简单的理解:java

Monkey 是一个 Android 自动化测试小工具。主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash.android

Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。 猴子什么都不懂, 只知道乱敲。经过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操做来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。shell

2、质量要求:

版本release(发布)前,Monkey跑出来的结果中crash要为0,final release前,Monkey跑完的总次数应为25W,结果里不容许有nullPointException出现。

3、使用Monkey:

在cmd命令或者AndroidStudio中的Terminal中均可以使用adb(注意adb的位置,在SDK的tools文件夹下)微信

  一、首先须要将手机链接到PC,测试链接是否正常,找到adb的位置,通常在sdk的tools文件下 ,找到位置而后输入adb devices来进行验证;app

  二、因测试多针对一个特定的APP包,因此须要知道须要测试包的包名;能够直接问开发,也能够经过 adb shell pm list packages  列出全部包名来进行查找ide

  (不肯定包是否已安装,能够用adb shell pm list packages [options] <INTENT> 来进行确认,它的含义是列举出全部包含<INTENT>的package。    e.g. adb shell pm list packages com.taobao.taobao)工具

  三、对特定APP包进行测试的命令为adb shell monkey -p <pakage.name>oop

4、Monkey的基本参数:

一、容许启动手机里面全部的 App , 随机操做 1000 次

 adb shell monkey 1000 

二、-p : 容许启动 App 的包名

  • 启动一个包名的应用

QQ 的包名为: com.tencent.mobileqq测试

 adb shell monkey -p com.tencent.mobileqq 1000 

随机操做 手机 QQ 1000 次

  • 启动指定的多个 App

微信的包名为:com.tencent.mm

 adb shell monkey -p com.tencent.mobileqq -p com.tencent.mm 1000 

随机操做 手机 QQ 和 微信 1000 次

三、-v : 操做日志记录

命令行的每个-v将增长反馈信息的级别。

  • -v:Level 0(缺省值)除 启动提示、测试完成和最终结果以外,提供较少信息。
  • -v -v :Level 1提供较为详细的测试信息,如逐个发送到Activity的 事件。
  • -v -v -v :Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。

 adb shell monkey -p com.tencent.mobileqq -v -v -v 100 

四、-s : 伪随机数生成器的seed值

若是用相同的seed值再次运行monkey,将生成相同的事件序列。

 adb shell monkey -s 12345 -v 10 

五、--ignore-crashes : 忽略操做是崩溃异常

一般,应用发生崩溃或异常时Monkey会中止运行。若是设置此项,Monkey将继续发送事件给系统,直到事件计数完成。

 adb shell monkey --ignore-crashes -v 1000 

六、--ignore-timeouts : 忽略超时

一般,应用程序发生任何超时错误(如“Application Not responding”对话框)Monkey将中止运行,设置此项,Monkey将继续发送事件给系统,直到事件计数完成。

 adb shell monkey --ignore-timeouts -v 1000 

七、--ignore-security-exceptions : 忽略程序发生许可异常

一般,当程序发生许可错误(例如启动一些须要许可的Activity)致使的异常时,Monkey将中止运行。设置此项,Monkey将继续发送事件给系统,直到事件计数完成。

 adb shell monkey --ignore-security-exceptions -v 1000 

八、--throttle : 插入固定延迟

在事件之间插入固定延迟。经过这个选项能够减缓Monkey的执行速度。若是不指定该选项,Monkey将不会被延迟,事件将尽量快地被执行。

 adb shell monkey --throttle 500 -v 500 

随机执行 500 个事件,每一个事件之间延迟 500 毫秒被执行。

九、--help : 列出简单的用法

 adb shell monkey -help 

 

5、将log日志文件保存到指定位置:

  android studio 的terminal 下执行命令而且将测试结果保存到指定文件下:


             adb shell monkey -p 包名 -s 100 --ignore-crashes --ignore-timeouts  1000000 >C:\Users\dingchao\Desktop\testlog.txt

 

6、日志分析:

1)正常状况:顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 表明执行完成\

详细分析参考:

http://blog.sina.com.cn/s/blog_44d19b500102vefp.html

http://blog.csdn.net/huangyabin001/article/details/38442359


2)异常状况:

 

其中adb shell procrank 查询各进程内存使用状况;adb shell cat /proc/meminfo 查看当前的内存状况...

 

Monkey 测试出现错误后,通常的分析步骤
看Monkey的日志 (为了进一步分析问题的来源,能够找到Log中出现问题处的前一次Switch,随后根据Log主要是查看相关的Activity)
一、程序无响应的问题:在日志中搜索 “ANR”

可能缘由:当前有耗时操做在UI线程指定,致使卡UI了;在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸);BroadcastReceiver在10秒内没有执行完毕

二、崩溃问题:在日志中搜索 “Exception”   (若是出现空指针, NullPointerException)  确定是有bug
三、搜索"crash" 、"error"

 Monkey 执行中断, 在log最后也能看到当前执行次数;若以上步骤还不能定位问题,可使用以前执行的monkey命令再执行一遍,注意seed值要同样



可能出现Crash的场景

1)图片放大缩小

2)输入框无限输入各类类型字符

3)快速操做

4)和系统的交互等等



 

 

何时会有Log文件的产生 ?
Log的产生你们都知道 , 你们也都知道经过DDMS来看log , 但何时会产生log文件呢 ?通常在以下几种状况会产生log文件 。 
1,程序异常退出 , uncaused exception
2,程序强制关闭 ,Force Closed (简称FC)
3,程序无响应 , Application No Response (简称ANR) , 顺便,通常主线程超过5秒么有处理就会ANR
4,手动生成 。


拿到一个日志文件,要分红多段来看 。 log文件很长,其中包含十几个小单元信息,但不要被吓到 ,事实上他主要由三大块儿组成 。

1,系统基本信息 ,包括 内存,CPU ,进程队列 ,虚拟内存 , 垃圾回收等信息 。------ MEMORY INFO (/proc/meminfo) ------
------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
------ PROCRANK (procrank) ------
------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
------ VMALLOC INFO (/proc/vmallocinfo) ------

格式以下:
------ MEMORY INFO (/proc/meminfo) ------
MemTotal:         347076 kB
MemFree:           56408 kB
Buffers:            7192 kB
Cached:           104064 kB
SwapCached:            0 kB
Active:           192592 kB
Inactive:          40548 kB
Active(anon):     129040 kB
Inactive(anon):     1104 kB
Active(file):      63552 kB
Inactive(file):    39444 kB
Unevictable:        7112 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                44 kB
Writeback:             0 kB
AnonPages:        129028 kB
Mapped:            73728 kB
Shmem:              1148 kB
Slab:              13072 kB
SReclaimable:       4564 kB
SUnreclaim:         8508 kB
KernelStack:        3472 kB
PageTables:        12172 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      173536 kB
Committed_AS:    7394524 kB
VmallocTotal:     319488 kB
VmallocUsed:       90752 kB
VmallocChunk:     181252 kB


2,时间信息 , 也是咱们主要分析的信息 。
------ VMALLOC INFO (/proc/vmallocinfo) ------
------ EVENT INFO (/proc/vmallocinfo) ------

格式以下:
------ SYSTEM LOG (logcat -b system -v time -d *:v) ------
01-15 16:41:43.671 W/PackageManager( 2466): Unknown permission com.wsomacp.permission.PROVIDER in package com.android.mms
01-15 16:41:43.671 I/ActivityManager( 2466): Force stopping package com.android.mms uid=10092
01-15 16:41:43.675 I/UsageStats( 2466): Something wrong here, didn't expect com.sec.android.app.twlauncher to be paused
01-15 16:41:44.108 I/ActivityManager( 2466): Start proc com.sec.android.widgetapp.infoalarm for service com.sec.android.widgetapp.infoalarm/.engine.DataService: pid=20634 uid=10005 gids={3003, 1015, 3002}
01-15 16:41:44.175 W/ActivityManager( 2466): Activity pause timeout for HistoryRecord{48589868 com.sec.android.app.twlauncher/.Launcher}
01-15 16:41:50.864 I/KeyInputQueue( 2466): Input event
01-15 16:41:50.866 D/KeyInputQueue( 2466): screenCaptureKeyFlag setting 0
01-15 16:41:50.882 I/PowerManagerService( 2466): Ulight 0->7|0
01-15 16:41:50.882 I/PowerManagerService( 2466): Setting target 2: cur=0.0 target=70 delta=4.6666665 nominalCurrentValue=0
01-15 16:41:50.882 I/PowerManagerService( 2466): Scheduling light animator!
01-15 16:41:51.706 D/PowerManagerService( 2466): enableLightSensor true
01-15 16:41:51.929 I/KeyInputQueue( 2466): Input event
01-15 16:41:51.933 W/WindowManager( 2466): No focus window, dropping: KeyEvent{action=0 code=26 repeat=0 meta=0 scancode=26 mFlags=9}



3,虚拟机信息 , 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。 
------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------


格式以下 :
----- pid 21161 at 2011-01-15 16:49:01 -----
Cmd line: com.android.mms

DALVIK THREADS:
"main" prio=5 tid=1 NATIVE
  | group="main" sCount=1 dsCount=0 s=N obj=0x4001d8d0 self=0xccc8
  | sysTid=21161 nice=0 sched=0/0 cgrp=default handle=-1345017808
  | schedstat=( 4151552996 5342265329 10995 )
  at android.media.MediaPlayer._reset(Native Method)
  at android.media.MediaPlayer.reset(MediaPlayer.java:1218)
  at android.widget.VideoView.release(VideoView.java:499)
  at android.widget.VideoView.access$2100(VideoView.java:50)
  at android.widget.VideoView$6.surfaceDestroyed(VideoView.java:489)
  at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:572)
  at android.view.SurfaceView.updateWindow(SurfaceView.java:476)
  at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
  at android.view.View.dispatchDetachedFromWindow(View.java:6082)
  at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
  at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:2296)
  at android.view.ViewGroup.removeAllViews(ViewGroup.java:2254)
  at com.android.mms.ui.SlideView.reset(SlideView.java:687)
  at com.android.mms.ui.SlideshowPresenter.presentSlide(SlideshowPresenter.java:189)
  at com.android.mms.ui.SlideshowPresenter$3.run(SlideshowPresenter.java:531)
  at android.os.Handler.handleCallback(Handler.java:587)
  at android.os.Handler.dispatchMessage(Handler.java:92)
  at android.os.Looper.loop(Looper.java:123)
  at android.app.ActivityThread.main(ActivityThread.java:4627)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:521)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  at dalvik.system.NativeStart.main(Native Method)

---------------------------------------------------------------------------------------------------------------------------------------
闲话少说, 我总结了观察log文件的基本步骤 。 1,若是是ANR问题 , 则搜索“ANR”关键词 。 快速定位到关键事件信息 。
2,若是是ForceClosed 和其它异常退出信息,则搜索"Fatal" 关键词, 快速定位到关键事件信息 。
3,定位到关键事件信息后 , 若是信息不够明确的,再去搜索应用程序包的虚拟机信息 ,查看具体的进程和线程跟踪的日志,来定位到代码 。 

用这种方法,出现问题,根本不须要断点调试 , 直接定位到问题,屡试不爽 。 
下面,咱们就开始来分析这个例子的log 。

打开log文件 , 因为是ANR错误,所以搜索"ANR " , 为什么要加空格呢,你加上和去掉比较一下就知道了 。 能够屏蔽掉很多保存到anr.log文件的无效信息 。

 

 

 

关闭Monkey

在monkey运行中,断开USB链接,mokey仍可继续运行1. ps命令查找进程adb shell ps | grep monkey  返回来的第一个数字,便是monkey的进程号2.kill 命令结束进程adb shell kill [刚才查到的进程号]

相关文章
相关标签/搜索