热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android测试工具Monkey

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

      由于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
// java.lang.NullPointerException
// at com.hybroad.launcher.activity.VideoDetailActivity$13.onClick(VideoDetailActivity.java:448)

// 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)
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:

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




推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • macOS命令行创建Android模拟器
    macOS下不安装AndroidStudio使用VSCode来开发Flutter应用使用命令行创建和管理Android模拟器设备avdmanageravdmanager 是一种命令 ... [详细]
  •  项目地址https:github.comffmydreamWiCar界面做的很难看,美工方面实在不在行。重点是按钮触摸事件的处理,这里搬了RepeatListener项目代码,例 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
author-avatar
多米音乐_35562359
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有