Android 测试工具Monkey

      由于Android本身的设计,以及应用程序和系统在开发过程中的缺陷,经常会在测试过程中遇到各种各样异常和ANR问题。在完成功能开发后通常通过压力测试来保证系统的稳定性,本文介绍Android的压力测试工具Monkey使用方法。

一,简介: 

     Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的法。

二:操作方法

    通过help 可以列出命令的选项,如下:

shell@mstarnapoli_hifly:/ # monkey --help

** Error: Unknown option: --help

usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]

              [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]

              [--ignore-crashes] [--ignore-timeouts]

              [--ignore-security-exceptions]

              [--monitor-native-crashes] [--ignore-native-crashes]

              [--kill-process-after-error] [--hprof]

              [--pct-touch PERCENT] [--pct-motion PERCENT]

              [--pct-trackball PERCENT] [--pct-syskeys PERCENT]

              [--pct-nav PERCENT] [--pct-majornav PERCENT]

              [--pct-appswitch PERCENT] [--pct-flip PERCENT]

              [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]

              [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]

              [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]

              [--wait-dbg] [--dbg-no-events]

              [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]

              [--port port]

              [-s SEED] [-v [-v] ...]   

              [--throttle MILLISEC] [--randomize-throttle]

              [--profile-wait MILLISEC]

              [--device-sleep-time MILLISEC]

              [--randomize-script]

              [--script-log]

              [--bugreport]

              [--periodic-bugreport]

              COUNT

-p 选项:【如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity,要指定多个包,需要使用多个-p选项,每个-p选项指定一个包】

-s 选项:【伪随机数生成器的 seed 值。如果用相同的seed 值再次运行Monkey ,它将生成相同的事件序列,如果是概率出现的问题,通过设置相同的seed值来复现问题

-v选项: 【指定返回日志级别,共分三个级别】

比如命令:

monkey -p com.hybroad.launcher.activity -p com.hybroad.launcher.view -v -v -v  –s 10 10000

表示伪随机数生成器的种子是10,在com.hybroad.launcher.activitycom.hybroad.launcher.view中执行10000个事件序列,并提供较高级别的日志

三:测试结果分析

Monkey Test 执行过程中在下列三种情况下会自动停止:

1如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。

2.如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。

3.如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。

通过多次并且不同设定下的Monkey 测试才算它是一个稳定性足够的程序。

      获取到monkey 执行的log后我们需要查看日志是否出现上述2 和3 报错,显然2属于系统崩溃问题在日志中搜索“Exception"  3是ANR问题,在日志中搜索“ANR”便能很方便找到问题,如下红色部分表明出现空指针异常了。

Sending Touch (ACTION_DOWN): 0:(1882.0,455.0)
:Sending Touch (ACTION_UP): 0:(1882.2484,460.26718)
:Sending Touch (ACTION_DOWN): 0:(1581.0,97.0)
:Sending Touch (ACTION_UP): 0:(1580.5397,85.56268)
:Sending Touch (ACTION_DOWN): 0:(440.0,283.0)
:Sending Touch (ACTION_UP): 0:(433.6487,274.82684)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-3.0)
:Sending Touch (ACTION_DOWN): 0:(1206.0,263.0)
:Sending Touch (ACTION_UP): 0:(1185.9463,256.7876)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-3.0)
:Sending Touch (ACTION_DOWN): 0:(1074.0,738.0)
:Sending Touch (ACTION_UP): 0:(1049.6573,762.4713)
:Sending Touch (ACTION_DOWN): 0:(1113.0,903.0)
:Sending Touch (ACTION_UP): 0:(1117.7465,878.39905)
:Sending Touch (ACTION_DOWN): 0:(1085.0,300.0)
:Sending Touch (ACTION_UP): 0:(1080.334,299.08066)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,0.0)
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
// CRASH: com.hybroad.launcher (pid 3620)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: unknown
// Build Changelist: V1.0.svn-38.0716
// Build Time: 1405522645000
<span style="color:#FF0000;">// java.lang.NullPointerException
// at com.hybroad.launcher.activity.VideoDetailActivity$13.onClick(VideoDetailActivity.java:448)</span>
// at android.view.View.performClick(View.java:4240)
// at android.view.View.onKeyUp(View.java:7928)
// at android.widget.TextView.onKeyUp(TextView.java:5579)
// at android.view.KeyEvent.dispatch(KeyEvent.java:2854)
// at android.view.View.dispatchKeyEvent(View.java:7343)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1933)
// at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1408)
// at android.app.Activity.dispatchKeyEvent(Activity.java:2384)
// at com.hybroad.launcher.activity.VideoDetailActivity.dispatchKeyEvent(VideoDetailActivity.java:157)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1860)
// at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3832)
// at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3815)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3420)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3470)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3439)
// at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3524)
// at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3447)
// at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3581)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3420)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3470)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3439)
// at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3447)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3420)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3470)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3439)
// at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3557)
// at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3707)
// at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:1982)
// at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1698)
// at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1689)
// at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1959)
// at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
// at android.os.MessageQueue.nativePollOnce(Native Method)
// at android.os.MessageQueue.next(MessageQueue.java:132)
// at android.os.Looper.loop(Looper.java:124)
// at android.app.ActivityThread.main(ActivityThread.java:5103)
// at java.lang.reflect.Method.invokeNative(Native Method)
// at java.lang.reflect.Method.invoke(Method.java:525)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:773)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
// at dalvik.system.NativeStart.main(Native Method)
//
** Monkey aborted due to error.
Events injected: 3098
:Sending rotation degree=0, persist=false
:Dropped: keys=1 pointers=5 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=23339ms (0ms mobile, 0ms wifi, 23339ms not connected)
** System appears to have crashed at event 3098 of 1000000 using seed 1409267204529

蓝色部分日志表明出现了ANR异常:

// NOT RESPONDING: com.hybroad.launcher (pid 6012)
<span style="color:#000099;">ANR in com.hybroad.launcher (com.hybroad.launcher/.activity.SubMenuActivity)
Reason: keyDispatchingTimedOut
Load: 3.97 / 2.2 / 0.93
CPU usage from 6313ms to 101ms ago:</span>
  98% 1375/system_server: 52% user + 45% kernel / faults: 2239 minor
  75% 1630/com.hybroad.phone_remote: 39% user + 35% kernel / faults: 131 minor
  68% 2385/com.hybroad.airplay: 40% user + 28% kernel / faults: 17 minor
  18% 1035/tvos: 9.3% user + 9.1% kernel
  18% 6012/com.hybroad.launcher: 13% user + 5.3% kernel / faults: 3363 minor 5 major
  5.6% 1019/surfaceflinger: 2% user + 3.5% kernel
  2.5% 5657/mediaserver: 0.3% user + 2.2% kernel / faults: 18 minor
  0.6% 1608/com.hybroad.inputmethod.remote: 0.6% user + 0% kernel / faults: 1 minor
  0.6% 4772/com.android.commands.monkey: 0.3% user + 0.3% kernel / faults: 24 minor
  0.3% 1029/livecap: 0% user + 0.3% kernel
  0.3% 2255/RTW_CMD_THREAD: 0% user + 0.3% kernel
  0.1% 5/kworker/u:0: 0% user + 0.1% kernel
  0.1% 22/kworker/u:1: 0% user + 0.1% kernel
  0.1% 420/cifs_mem_clear: 0.1% user + 0% kernel
  0.1% 1812/mdnsd: 0% user + 0.1% kernel / faults: 1 minor
  0% 2244/rel_supplicant: 0% user + 0% kernel / faults: 51 minor 3 major
49% TOTAL: 27% user + 21% kernel + 0% softirq
CPU usage from 681ms to 1214ms later:
  67% 1375/system_server: 37% user + 30% kernel / faults: 23 minor
    7.5% 1728/Binder_7: 5.6% user + 1.8% kernel
    5.6% 1688/Binder_3: 3.7% user + 1.8% kernel
    5.6% 1689/Binder_4: 1.8% user + 3.7% kernel
    5.6% 1729/Binder_8: 3.7% user + 1.8% kernel
    5.6% 1899/Binder_A: 3.7% user + 1.8% kernel
    3.7% 1375/system_server: 1.8% user + 1.8% kernel
    3.7% 1386/Binder_1: 3.7% user + 0% kernel
    3.7% 1387/Binder_2: 1.8% user + 1.8% kernel
    3.7% 1397/ActivityManager: 0% user + 3.7% kernel
    3.7% 1714/Binder_5: 1.8% user + 1.8% kernel
    3.7% 1715/Binder_6: 3.7% user + 0% kernel
    3.7% 1730/Binder_9: 1.8% user + 1.8% kernel
    3.7% 1900/Binder_B: 3.7% user + 0% kernel
  33% 1630/com.hybroad.phone_remote: 24% user + 9.4% kernel / faults: 1 minor
    30% 1813/Timer-0: 22% user + 7.5% kernel
  16% 1035/tvos: 3.7% user + 13% kernel
    3.7% 1369/1035keypad Inpu: 1.8% user + 1.8% kernel
    3.7% 1414/HDMITx_Task: 3.7% user + 0% kernel
    3.7% 1700/Mdebug Monitor: 0% user + 3.7% kernel
    1.8% 1406/Picture Monitor: 0% user + 1.8% kernel
    1.8% 1698/Internal_MHLthr: 0% user + 1.8% kernel
  3.7% 1019/surfaceflinger: 0% user + 3.7% kernel
    3.7% 1186/SurfaceFlinger: 0% user + 3.7% kernel
  3.7% 2385/com.hybroad.airplay: 3.7% user + 0% kernel
    3.7% 2402/Timer-0: 3.7% user + 0% kernel
33% TOTAL: 17% user + 15% kernel
procrank:
  PID Vss Rss Pss Uss cmdline
 1375 70196K 69848K 47811K 44824K system_server
 1515 66980K 64488K 43472K 40784K com.android.systemui
 6012 55568K 43604K 23783K 21476K com.hybroad.launcher
 1035 56792K 18508K 17888K 17580K /applications/bin/tvos
 1630 31496K 31412K 13415K 12060K com.hybroad.phone_remote
 1020 37196K 37072K 10593K 5184K zygote
 5511 39404K 28252K 9760K 7964K com.android.systemui:screenshot
 4772 22584K 22556K 9660K 6436K com.android.commands.monkey
 1954 24868K 24780K 6770K 5188K com.miui.mihome2
 1921 23480K 23388K 6647K 5312K com.miui.mihome.lockscreen
 5657 10796K 10792K 6327K 5164K /system/bin/mediaserver
 1532 22468K 22380K 5764K 4708K android.process.media
 1660 24420K 24344K 5759K 4224K system:ui
 1560 23100K 23004K 5574K 4172K com.miui.mihome2:download
 1641 21048K 20948K 4481K 3524K com.jrm.servicecontainer
 1608 20764K 20680K 4463K 3532K com.hybroad.inputmethod.remote
 2385 18860K 18764K 3807K 3048K com.hybroad.airplay
 1019 46628K 7604K 3380K 2328K /system/bin/surfaceflinger
 1778 18440K 18348K 3262K 2504K com.hybroad.dlna
 1574 18404K 18296K 3024K 2200K com.mstar.android.providers.tv
 1794 17868K 17772K 2728K 1812K com.hybroad.phone_remote.daemon
 1820 17444K 17344K 2621K 1868K org.opencv.engine:OpenCVEngineProcess
 1652 17396K 17296K 2531K 1772K com.broadcom.bluetoothmonitor
 1871 16808K 16712K 2434K 1708K com.android.settings
 2035 16416K 16312K 2223K 1500K com.jrm.localmm
 1018 2440K 2440K 2101K 2088K /system/bin/debuggerd
 1905 16432K 16332K 2095K 1388K com.android.onetimeinitializer
 2426 16104K 16004K 2064K 1356K com.mstar.tvsetting
 1029 5072K 5072K 1818K 1260K /system/bin/livecap
 1021 4372K 4372K 1490K 1024K /system/bin/drmserver
 6274 1652K 1652K 1410K 1404K procrank
 1028 1252K 1252K 975K 968K /system/bin/upnp_tv_receiver
 2244 1892K 1892K 955K 832K rel_supplicant
 1027 22020K 2180K 788K 316K /system/bin/virtualkeypad
 1017 1612K 1612K 744K 644K /system/bin/netd
 1015 1508K 1508K 679K 596K /system/bin/vold
 1812 848K 848K 553K 544K /system/bin/mdnsd
    1 536K 536K 450K 388K /init
 1024 1228K 1228K 435K 360K /system/bin/keystore
 2242 356K 356K 356K 356K /system/bin/busybox
 1016 928K 928K 355K 316K /system/bin/resourcemanager
 1031 716K 716K 226K 208K /system/bin/browserserver
 2905 488K 488K 205K 128K sh
 1036 476K 476K 197K 120K /system/bin/sh
 2091 504K 504K 187K 176K /system/bin/dhcpcd
 1023 456K 456K 162K 152K /system/bin/installd
  674 220K 220K 154K 92K /sbin/ueventd
 1037 168K 168K 148K 148K /sbin/adbd
 6216 432K 428K 147K 132K /system/bin/dnssd
 1014 348K 344K 109K 104K /system/bin/servicemanager
 1026 348K 344K 105K 100K /system/bin/logwrapper
 1034 332K 332K 94K 88K /system/bin/dnssd_daemon
                          ------ ------ ------
                         267207K 226160K TOTAL
RAM: 598736K total, 135424K free, 12932K buffers, 156884K cached, 7668K shmem, 19324K slab
// procrank status was 0
[ 192.609759] RTL871X: no packet in tx packet buffer (0)
[ 193.919795] RTL871X: survey done event(b)
anr traces:
----- pid 6012 at 2014-08-16 12:44:43 -----
Cmd line: com.hybroad.launcher
JNI: CheckJNI is off; workarounds are off; pins=0; globals=159



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值