美文网首页北京西路程序员
Monkey系列之01--基本操作

Monkey系列之01--基本操作

作者: 无以解忧杂货铺 | 来源:发表于2018-01-10 17:00 被阅读421次


    monkey

    一、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功能是否正常,如下图:

    adb相关

    2、在adb目录下执行【adb devices】命令,就可以看到一个设备机已经连接可用,如果不可用,那么请检查你的usb调试选项,开发者选项是否允许和打开,下图显示device已经正常可以使用,我测试的是一台华为手机:

    adb list

    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名称打码了,命令执行很快,就是这个效果:

    执行monkey测试

    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查找

    查看ID其他方法3:在adb目录下执行:adb shell pm list packages -3   这个命令是输出第三方的包,在这列表里选出自己的app

    查看第三方包ID

    作者码字辛苦,凡是读后有益者,请麻烦给个评价,点个喜欢,如果喜欢我的文章,请长期关注。2018年,长期更新。

    有兴趣沟通交流的可以加QQ群:222728298    


    相关文章

      网友评论

      • 无以解忧杂货铺:>adb shell pm list packages -e "baidu"
        这个是个过滤条件,可以过滤出启动的,带baidu字样的app的id

      本文标题:Monkey系列之01--基本操作

      本文链接:https://www.haomeiwen.com/subject/vvmonxtx.html