monkey工具的学习

又到了轻松愉快的周末了,各位大盆友,此刻的你们是不是还在睡懒觉哇?今天想给大家分享一个很好用的自动化工具--monkey(猴子大人)。

         ~ monkey程序由android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar

     ~Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey

通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行测试。比如,Android的设备上面要是有休眠功能的话,咱们可以设置手机休眠功能为15秒,然后我们通过monkey(adb shell monkey -p android.chrome.com -v-v-v --throttle 16000 --pct-motion 50  --pct-syskeys 50 -s 12 100000 > d:\monkey_05.log)设定15秒或者16秒后点击一次,这样连续点击个一万次甚至更多来看看程序是否会发生异常。最后只要查看日志就好了。

首先,我们要搭建环境,只要下载一个jdk和sdk就可以了,具体的操作流程可以参考:

jdk:https://blog.csdn.net/write6/article/details/79136388

sdk:https://blog.csdn.net/u011541946/article/details/77142045

里面的博客写的很详细清晰的啦

其次,打开手机的开发者调试工具,用usb数据线l连接你的手机。

关于测试:

         a, 运行cmd,打开dos窗口

         b, 执行adb devices, 查看连接的手机

         c, 执行adb connect 手机IP, 连接手机

         d, 执行adb shell 进入控制台

         e, 执行adb shell monkey --help, 看是否掉同monkey工具文档,(如果提示,common not found,即找不到monkey工具,环境变量配置有问题,如果提示帮助文档信息,即可调用monkey)

对于一些重要的命令详解,希望大家都了解一下,经常用到的就记一下啦。

  基础参数

              -p <allowed-package-name>        指定一个包或多个包

              -s <seed>                                       指定一个随机生成器的seed值

              -v                                                    指定反馈信息级别(日志之别的详细程度,可以支持3个-v)

              -throttle <millseconds>                 指定事件之间的固定延迟(ms)

              -c <main-category>                       指定一个或多个类别名

              -f <scriptfile>                                 指定运行monkey脚本

   事件参数(值得注意的是,所有的时间参数的总和不能大于100%)

               --pct-touch <percent>                      指定触摸事件百分比 

               --pct-motion <percent>                    指定动作事件百分比

              --pct-trackball <percent>                  指定轨迹事件百分比

              --pct-syskeys <percent>                    指定系统按键事件百分比

              --pct-nav <percent>                           指定基本导航事件百分比

              --pct-majornav <percent>                  指定主要导航事件百分比

              --pct-appswitch <percent>               指定应用启动事件百分比

              --pct-flip <percent>                           指定flip(弹)事件的百分比

              --pct-anyevent <percent>                 指定其他类型事件百分比  

             --pct-pinchzoom <percent>               指定缩放(捏)事件百分比

 
 
   调试参数
           --ignore-crashes                                 忽略因崩溃或异常引起的停止运行

           --ignore-timeouts                               忽略应用发生超时错误(ANR)

           --ignore-security-exceptions              忽略应用发生任何权限错误

           --monitor-native-crashes                    监视并报告monkey运行时native code的崩溃事件

           --ignore-native-crashes                      忽略因native code的崩溃事件

           --kill-process-after-error                     在应用出错后通知系统杀死发生错误的进程

           --hprof                                                 在事件序列前后立即生成profilfing report

           --dbg-no-events                                  监视应用程序所调用的包之间的转换

           --wait-dbg                                           暂停执行中的monkey,直到有调试器与它连接

实战:

 a,获取包名称

         筛选包名称:adb shell dumpsyswindow w | findstr \/ | findstr name="PACKAGENAME"

     b,组合参数驱动包名称进行

         adb shell monkey -p PACKAGENAME -v -v -v --throttle 200 -s 1 --ignore-crashes --ignore-timeouts --ignore-native-          crashes --pct-touch 30 100000 2>/Users/admin/Desktop/error.txt 1>/Users/admin/Desktop/info.txt

         解释:

              -p PACKAGENAME     对你的app包进行测试

              -v -v -v                         第一个-v:level0级别 日志输出,仅提供启动提示,测试完成和最终结果等少了信息

                                                   第二个-v:level1级别  日志输出,提供较详细的日志,包括每个发送到Activity的事件信息

                                                   第三个-v:level2级别  日志输出,最详细的日志,包括测试中选中或未选中的Acitvity信息

              -s 1                                伪随机数生成seed值,值为1 ,相同seed值再次执行monkey,讲产生相同的时间操作(场景多用于复现bug)

              --throttle 200                    事件间隔200毫秒

              --ignore-crashes                忽略应用程序崩溃,继续往下执行直到结束

              --ignore-timeouts              忽略应用程序发送的ANR错误,继续往下执行直到结束

              --ignore-native-crashes     忽略Android native-code引起的崩溃,继续往下执行直到结束

              --pct-touch 30                   模拟触摸事件占比30%

              100000                              模拟执行10万次

              2>Users/admin/Desktop/error.txt         Level2级别日志保存到error.txt日志文件

              1>/Users/admin/Desktop/info.txt         Level1级别日志保存到info.txt日志文件

         注意:以上命令,操作事件只占权重百分比的30%,还可以继续添加其他事件,看事件情况,模拟事件可以指定多个,但权重不得超过100%

常会用的命令:

    获取activity:adb shell dumpsys activity | findstr “mResume”

    查看本机所有包:adb shell pm list package -f

     查看本机所有的包:adb shell pm list packages

    查看第三方的安装包:adb shell pm list package -3

  查找系统所有包:adb shell pm list package -s

    查看启动包中搜索包:adb shell pm list packages -e “packagename” 

获取当前打开的包:adb shell dumpsys window | findstr mCurrentFocus  

(前面的为包名,斜杠后面的是当前启动的acivity)

在执行向下滑动的命令时,打开了通知栏,然后又开始了瞎点的操作。这时可在执行monkey命令之前,先执行禁用通知栏的命令

禁用:adb shell settings put global policy_control immersive.full=*

解禁:adb shell settings put global policy_control null

最后咱们再看一下日志分析吧 :

4.1 在日志中搜索关键字:

         a.搜索报告中的关键字“ANR”,看有无应用无响应的事件(Application Not Responding)

         b.搜索报告中的关键字“crash”,看有无崩溃的事件

         c.搜索报告中的关键字“exception”,看有无其他异常事件。(如果出现空指针, NullPointerException,需格外重视)

         d.内存泄露问题搜索"GC"(需进一步分析)

    4.2 初步分析法:

         a.先找到出现错误的位置

         b.查看出现错误之前2个switch之间的activity

         c.手动执行事件,复现问题

         d.若以上步骤还不能找出,产生错误时,有会seed值,输入相同的seed值,重新按照之前命令跑monkey。还有就是时间后面的权重不能超过100,不然monkey跑不起来。

    4.3 详细分析法:

          a.ANR问题:在日志中搜索“ANR”(“Application Not Responding"),说明有bug,出现ANR,一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应。这个就是一个比较严重的缺陷。把耗时的操作另起线程来处理就可以了。

          b.分析log中的具体信息:查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。

          c.内存泄漏

              c1:内存泄漏弹出out of memory对话框

              c2:对于有内存泄漏但是没有单出out of memory对话框的情况,可以通过logcat文件GC出信息,(GC:java的垃圾回收机制)

                     GC_FOR_ALLOC: 因为在分配内存时候内存不够引起的
                     GC_EXPLICIT 表明GC被显式请求触发的,如System.gc调用,
                     GC_CONCCURRENT: 表明GC在内存使用率达到一定的警戒值时候,自动触发
                     GC_BEFORE_OOM 表明在虚拟机抛出内存不够异常oom之前,执行最后一次回收内存垃圾

              c3:发现内存泄露--内存报告分析(利用hprof参数的内存快照生成内存报告,在发现内存泄露后,可以执行相同的monkey,只需多加一个参数--hprof 

最后,给大家送一张图:

其实讲到这里,monkey工具的用法其实都讲完了,就看你怎么实操了。如何把用例写好,或者想到更好的用例,然后通过monkey命令的形式去进行测试。有更好的建议欢迎大家留言。

猜你喜欢

转载自blog.csdn.net/weixin_39456575/article/details/106169328