一、Monkey是什么
1、Monkey测试是Android自动化测试的一种手段,是个命令行工具,可以运行在模拟器或实际设备之中;
2、Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常;
3、当Monkey程序在模拟器或真实设备运行的时候,程序会产生一定数量或一定时间内的随机模拟用户操作事件, 如点击,按键,手势等, 以及一些系统级别的事件;
4、Monkey测试通常也称随机测试或者稳定性/健壮性测试或者称之为压力测试,类似于软暴力猴子测试,抓起手机打开APP,一顿狂点,各种快速,高频,无规律的随机性操作,看app是否能正常相应,或者出现崩溃,闪退,内存溢出等等问题
二、Monkey的局限性
1、测试对象仅仅是应用程序包,有一定的局限性
2、Monkey测试使用的事件流数据流是随机的,不能进行自定义
3、可以对测试的对象,事件数量,类型,频率等进行设置
三、Monkey测试的停止条件
1、如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
2、如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
3、如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
四、使用monkey的前提
1、准备一部安卓手机,Apple是不行的!
2、手机最好恢复为出厂设置的状态,如果能root就更好了
3、设置用成用不黑屏的状态,黑屏和锁屏会影响命令执行
4、手机不要设置锁屏和解锁密码,开机,常亮,没有人工操作,永远不黑屏锁屏
5、开启开发者选项,允许usb调试,如果有调试选项,记得选择MTP模式
6、PC电脑上安装adb tool相关工具(后续单独写一篇文章讲ADB工具如何安装配置吧!)
7、usb线将手机和电脑连接,弹出的提示信任的,选信任,提示允许usb调试的请允许调试
8、Dos窗口cd到你的adb目录下来执行monkey命令(后文的演示环境下,adb安装在d盘的adb文件夹下)
9、手机上安装你要测试的app的包,这一步不会的,请到此为止,别往下看了!
五、Monkey实际操作过程
1、首先电脑和手机通过usb连接,连接后进入adb目录下,查看一下adb功能是否正常,如下图:
2、在adb目录下执行【adb devices】命令,就可以看到一个设备机已经连接可用,如果不可用,那么请检查你的usb调试选项,开发者选项是否允许和打开,下图显示device已经正常可以使用,我测试的是一台华为手机:
3、手机安装上你的apk的测试包,此时需要知道你的包的ID,才能在命令行里输入相应命令针对这个app进行随时事件测试,如何知道ID呢?(不是上面的设备名字,而是app的ID,也是不你的app的中文名,而是在系统文件里的一串英文名)在adb目录下,执行命令【adb shell】,然后执行【pm list packages】,列出的清单里,找到你的app的名字,具体怎么判断,根据经验即可,比如我下图中箭头所指的是baidu的app,package:后面的【com.XXXX.XXXX】就是应用的ID了,找到你的应用ID,就可以去执行测试了(找ID这个过程有几种方法,这个最简单一点,后文还补充了一种方法)
4、在手机上打开你的app,登录到应用的主页面,然后在adb的目录下,执行【adb shell monkey -p com.aaa.aaaaaaaa -v 500 >F:/monkeylog2018.txt】这条命令的意思是对aaa.aaaaaaaa这个ID应用包,执行500次随机事件(可能包含点击,滑动等等,随机生成的,无法人为控制),然后执行的日志输出到F盘的monkey2018.txt文件里,输入命令后,回车,等待结果,在这个时间里你会看到你的手机的这个app会自动做各种操作,点击,滑动等等,都是自动化的,这就是正在执行monkey测试了,我把我公司开发的app名称打码了,命令执行很快,就是这个效果:
5、命令执行完成,接下来就去看看log吧,打开F盘自动生成的这个文件,详细看看都生成了什么内容:
六、Monkey日志简要分析
前四行基本是介绍概况,第一行是总计进行了多少次随机事件,第二行是告诉你本次测试的app的id,第三四行是说做了什么类型的操作,第五行开始是介绍这次500次随机事件或命令的分布百分比,至于0-11是什么意思,稍后介绍,下面是log的全文,贴出来看看(#后面是我写的注释,不是日志原文):
Monkey: seed=1515610273991 count=500 #累计执行了多少次随机事件
:AllowPackage: com.aaa.aaaaa #包名
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// 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% #启动activity事件百分比
// 9: 2.0% #键盘轻弹事件百分比
// 10: 1.0% #其他事件百分比
:Switch: #表示跳转到我们要测试的包的里,命令里制定的包的activity里面activity#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.aaa.aaaa/.activity.SplashActivity;end
#表示允许次intent跳转
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.aaa.aaaa/.activity.SplashActivity } in package com.aaa.aaaa
:Sending Trackball (ACTION_MOVE): 0:(-5.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,1.0)
:Sending Touch (ACTION_DOWN): 0:(844.0,452.0)
:Sending Touch (ACTION_UP): 0:(856.3925,455.1536)
// Injection Failed #注入touch事件失败啦,为什么呢?因为app还没反应过来,它就执行下一个命令了,还有就是app里没有滑动点击的功能,点了也没反应之类的,以后的文章详细介绍monkey命令再详解
:Sending Touch (ACTION_DOWN): 0:(246.0,256.0)
:Sending Touch (ACTION_UP): 0:(244.92224,247.17607)
:Sending Touch (ACTION_DOWN): 0:(428.0,476.0)
:Sending Touch (ACTION_UP): 0:(440.89676,405.66605)
// Injection Failed
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0)
:Sending Touch (ACTION_DOWN): 0:(1070.0,1121.0)
:Sending Touch (ACTION_UP): 0:(1073.162,1132.0884)
:Sending Touch (ACTION_DOWN): 0:(641.0,438.0)
:Sending Touch (ACTION_UP): 0:(657.7884,396.05533)
:Sending Trackball (ACTION_MOVE): 0:(0.0,-4.0)
//[calendar_time:2018-01-10 16:32:49.912 system_uptime:16578533]
// Sending event #100 #注入事件成功100次
:Sending Trackball (ACTION_MOVE): 0:(1.0,-2.0)
:Sending Touch (ACTION_DOWN): 0:(768.0,1602.0)
:Sending Touch (ACTION_UP): 0:(896.64996,1583.9524)
:Sending Touch (ACTION_DOWN): 0:(1045.0,1781.0)
:Sending Touch (ACTION_UP): 0:(1043.9761,1774.2175)
:Sending Touch (ACTION_DOWN): 0:(1037.0,1271.0)
:Sending Touch (ACTION_UP): 0:(983.8985,1251.1171)
:Sending Touch (ACTION_DOWN): 0:(393.0,1354.0)
:Sending Touch (ACTION_UP): 0:(241.84598,1213.4604)
:Sending Touch (ACTION_DOWN): 0:(737.0,243.0)
:Sending Touch (ACTION_UP): 0:(739.0893,253.83078)
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.aaa.aaaa/.activity.SplashActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.aaa.aaaa/.activity.SplashActivity } in package com.aaa.aaaa
:Sending Touch (ACTION_DOWN): 0:(839.0,474.0)
:Sending Touch (ACTION_UP): 0:(838.525,469.33966)
:Sending Touch (ACTION_DOWN): 0:(150.0,1406.0)
//[calendar_time:2018-01-10 16:32:50.269 system_uptime:16578890]
// Sending event #200
:Sending Touch (ACTION_UP): 0:(122.750374,1494.216)
:Sending Touch (ACTION_DOWN): 0:(548.0,1164.0)
:Sending Touch (ACTION_UP): 0:(562.61395,1165.6589)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,3.0)
// Rejecting start of Intent { act=com.huawei.membranetouch.action.MT_GUIDE pkg=com.huawei.membranetouch cmp=com.huawei.membranetouch/.MtGuideActivity } in package com.huawei.membranetouch
:Sending Touch (ACTION_DOWN): 0:(30.0,474.0)
:Sending Touch (ACTION_UP): 0:(32.203053,478.70514)
:Sending Touch (ACTION_DOWN): 0:(736.0,1180.0)
:Sending Touch (ACTION_UP): 0:(687.7853,1144.4519)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,-4.0)
:Sending Touch (ACTION_DOWN): 0:(278.0,0.0)
:Sending Touch (ACTION_UP): 0:(277.88403,0.0)
:Sending Touch (ACTION_DOWN): 0:(880.0,947.0)
:Sending Touch (ACTION_UP): 0:(892.1809,885.9538)
:Sending Touch (ACTION_DOWN): 0:(543.0,1594.0)
:Sending Touch (ACTION_UP): 0:(573.5902,1647.6938)
:Sending Touch (ACTION_DOWN): 0:(309.0,1204.0)
:Sending Touch (ACTION_UP): 0:(298.53745,1205.275)
Events injected: 500 #事件注入了500次,我的log在这篇文章里是删减了,都差不多,贴太长没用
:Sending rotation degree=0, persist=false #发送屏幕翻转 度=0,存留=假
:Dropped: keys=0 pointers=11 trackballs=0 flips=6 rotations=0 #丢弃:键=0,指针=11,轨迹球=0,键盘轻弹=6,屏幕翻转=0
## Network stats: elapsed time=2266ms (0ms mobile, 0ms wifi, 2266ms not connected) #网络状态:占用时间=2266ms(手机0ms,wifi0ms,未连接2266ms)
// Monkey finished #测试结束
以上内容包含了测试过程的操作和步骤,以及日志的基本分析,要深入的学习monkey还需要深入的分析日志,这个专题,下次再写。
补充:
查看ID其他方法1:要查看设备中所有的包,在CMD窗口中执行以下命令:
>adb shell
#cd data/data
#ls
会列出所有的ID,从中找出自己的ID即可,但是这个方法的前提是root或者说有data目录的权限,有的机器上执行这个命令的结果是拒绝的,并不会列出包名,这种情况下,用上文提到的方法可以搞定;这个是全面出击
查看ID其他方法2: 在手机连接电脑的情况下,点击运行你要查看id的APP后,在adb目录下执行这个命令,也可以看到app的ID:
>adb shell dumpsys activity | find "mFocusedActivity" 这个是精准定位
查看ID其他方法3:在adb目录下执行:adb shell pm list packages -3 这个命令是输出第三方的包,在这列表里选出自己的app
作者码字辛苦,凡是读后有益者,请麻烦给个评价,点个喜欢,如果喜欢我的文章,请长期关注。2018年,长期更新。
有兴趣沟通交流的可以加QQ群:222728298