一、Monkey是什么
Monkey是Android中的一个命令行工具,它其实就是SDK中附带的一个工具,可以运行在模拟器里或实际设备中;
二、Monkey测试的目的
在运行过程中向系统发送大量伪随机用户事件流(键盘输入、手势什么的)来检测app是否存在异常,找出其中潜在的未知问题,使软件更加趋近于稳定、健壮;
三、Monkey测试的特点
测试的对象仅为应用程序包,有一定的局限性;
Monkey测试,所有的事件都是随机产生的,不带任何人的主观性;
可对Monkey测试的对象,可对事件数量,类型,频率等进行设置;
四、Monkey的使用及命令详解
常用参数的详细解释
-p
用于约束限制,用此参数指定一个或多个包;
-s
用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的;
--ignore-crashes
通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成;
--ignore-timeouts
通常,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成;
--ignore-security-exceptions
通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity) 时,Monkey将停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成;
-v
命令行的每一个-v将增加反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息。Level 1 提供较为详细的测试信息,如逐个发送到Activity的事件。Level 2 提供更加详细的设置信息,如测试中被选中的或未被选中的Activity事件;
--monitor-native-crashes
监视并报告Android系统中本地代码的崩溃事件。直到有调试器和它相连接;
monkey的简单示例
adb shell monkey -p com.edu.android.daliketang -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --throttle 100 -v -v 200000 > ~/Downloads/monkeytest.log
【命令释义】:monkey作用的包:com.edu.android.daliketang;产生时间序列的种子值:100,忽略程序崩溃、忽略超时、忽略程序错误、监视本地程序崩溃、事件之间延迟时间设定为100ms、日志详细信息级别为2 , 产生20万个事件,日志写入Downloads的monkeytest.log文档中
五、Monkey日志分析
args: [-p, com.edu.android.daliketang, -s, 100, --ignore-crashes, --ignore-timeouts, --ignore-security-exceptions, --monitor-native-crashes, --throttle, 100, -v, -v, 200000](打印monkey命令携带的参数)
:Monkey: seed=100 count=200000(打印seed值和执行次数)
:AllowPackage: com.edu.android.daliketang
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// - NOT USING main activity com.android.browser.launch.SplashActivity (from package com.android.browser)
// - NOT USING main activity com.android.calendar.homepage.AllInOneActivity (from package com.android.calendar)
// - NOT USING main activity com.xiaomi.vipaccount.ui.splash.SplashActivity (from package com.xiaomi.vipaccount)
// + Using main activity com.edu.android.daliketang.activity.MainActivity (from package com.edu.android.daliketang)(允许启动的APP)
// Seeded: 100
// 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%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.edu.android.daliketang/.activity.MainActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.edu.android.daliketang/.activity.MainActivity } in package com.edu.android.daliketang(启动指定intent,可以查看在大致在哪个模块或页面)
Sleeping for 100 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
Events injected: 100
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
Network stats: elapsed time=470ms (0ms mobile, 0ms wifi, 470ms not connected)
// Monkey finished
查看Monkey日志,初步分析方法:
Monkey测试出现错误后,一般的查错步骤为以下几步:
找到是monkey里面的哪个地方出错(如(快捷键Ctrl+f)搜索crash/anr/exception,查看crash位置前后是否有当前app的包名,如果有,则定位到crash由app引起的)
查看Monkey里面出错前的一些事件动作,并手动执行该动作
若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样
六、困扰的解决方式
monkey的随机事件可以帮助我们发现app中的一些缺陷,但是这些“随机”也会给我们带来一些困扰:
手机经常会在一个页面出不去,导致其他业务测试不到
手机会困在一个页面出不去;那我们需要做的就是在跑Monkey的间隔把APP从页面推出去;方法是使用“back”键退出程序:adb shell input keyevent 4 循环几次就可以退出去了
但是现实中还是有退不出的情况,怎么办?
另一个方法就是强制退出:adb shell am force-stop yourPkgName
手机网络关掉后,导致APP大部分是在无网情况下运行,都是无效的
目前的方案就是停止monkey,在网络环境好的情况下重新跑monkey:
adb shell(登录设备)
top|grep "monkey" (实时查询monkey的进程号)
kill -9 31819(-9:强制杀死进程;31819为查询出来的进程号)
怎样才能知道手机跑monkey时候的运行状态,如内存
adb shell cat /proc/meminfo;运行这个命令,就可以获取相关的内存信息了