monkey

作者: Hope_wing | 来源:发表于2020-06-10 18:07 被阅读0次

monkey是一个运行在模拟器或设备上,并生成伪随机的用户事件流如点击,触摸或手势,以及一些系统级事件的程序,比如home键、音量键等按键。可以使用 monkey以随机但可重复的方式对正在开发的应用程序进行压力测试(也可以理解成稳定性测试)。 所以monkey是模拟用户的操作行为,来达到一个不断点击,或者说不断操作app的一个效果。

比如,我想模拟一万次的点击、滑动等一系列的操作,那么可以使用monkey去执行这一万次操作,并且这一万次操作,他是一个随机事件,就是说用户点哪,或者是滑动哪,是不一定的对,每次执行的时候他的坐标啊什么的都是不一样的。

monkey是一个命令行工具,可以在任何模拟器实例或设备上运行。他会将伪随机用户事件流发送到系统中,从而在正在开发的应用软件上进行压力测试。

monkey官网:https://developer.android.com/studio/test/monkey

monkey包含许多选项,其实这个选项就可以理解成是monkey 命令的参数

  • 基本配置选项,例如设置要尝试的事件数

  • 操作限制条件,比如说想测试豆瓣这个应用的一个稳定性或者说压力,那么可以使用这方面的一个参数进行设置。

  • 事件类型和频率,比如说我想做点击,属于事件一个类型,我想做滑动,也是事件的一个类型。比如说我想每次操作事件间隔一秒,或者两秒,或者三秒,这样的话就需要去控制我们这个操作频率。

  • 调试选项,因为我们说monkey本身就是一个压力测试工具,或者说稳定性测试工具。那么他在执行测试的过程中,我们的app可能会出现一些异常,比如说crash的错误,比如说可能超时了,比如说我们做monkey的时候,我要执行一万次的操作,但是执行到第两百次的时候app挂掉了,这种情况下,monkey碰到异常,也就结束了,但是这可能并不是我们希望的一种效果。
    一般情况下,我们希望,指定了一万次,那这一万次不管碰到什么情况下都能执行完成,那这个时候我们就需要用到一些调试选项。比如说忽略超时,忽略异常等等(虽然我们在参数上进行了忽略,这个只是为了保证monkey将我们的执行次数执行完成,但是这种错误的日志,异常的日志,monkey会进行记录。这样的话我们在执行完成之后,去分析日志的时候,也是能够看到这个异常的)

Monkey在运行时会生成时间并将其发送到系统。它还会监视被测系统并查找三种特殊情况:

  • 如果已将monkey限制为在一个或多个特定软件包中运行,它会监视转到任何其他软件包的尝试并组织他们。比如说我正在测豆瓣,突然跳到了电话,那这个时候monkey会去阻止这个动作,不让他跳出你要运行的APP。
  • 如果应用崩溃或收到任何未处理的异常,monkey会停止并报告错误。
  • 如果应用生成“应用无响应”错误,monkey会停止并报告错误。

一般后两种情况我们都会使用调试选项将它进行忽略

monkey安装

monkey这个工具是Android系统自带的,不用去安装

image.png

通过查找我们可以发现monkey在这个(./system/bin/monkey)路径下


image.png

我们可以看到monkey在Android系统上表现的形式是一个文件


image.png

我们可以看到这是一个shell的脚本对,导入了一个monkey.jar,其实就是monkey指向的这个jar包的一段代码。所以monkey本身也是一个程序,一个使用java编写的一个脚本,在Android系统中我们只是使用monkey的命令,monkey命令是一个shell脚本来驱动monkey.jar这个文件来进行测试的

monkey基本参数

  • -s
    表示的是伪随机数发生器的种子值。如果用相同的种子值重新运行 monkey,它将生成相同的事件序列。这也就是为什么说他是伪随机的,因为它能够回放我们之前所执行的内容,比如说我第一次执行的时候出现异常了,那开发可能说回放一下,重现一下问题,那这个时候我们就用刚才执行的这个-s的值,来指定我们重新执行的序列。
adb -s 192.168.56.101:5555 shell monkey -s 1001001 --ignore-crashes --ignore- timeouts --ignore-security-exceptions --pct-touch 50 --pct-motion 50 -p com.douban.frodo --throttle 1000 -v -v -v 100 > /Users/liyanjun/testing/Android/package/monkeyLog.txt
image.png

我们可以看到刚才执行的这一段参数里有一个-s,-s指定的值是1001001,那假设说我们刚才执行的这个过程,执行一百次的伪随机点击,出现了异常,现在想要重现它,这个时候就继续重新执行这条命令,就会生成和第一次执行的时候生成的事件的序列。

如果不指定-s参数的值,那么如果出异常了,想重现刚才都点了哪些点,都做了什么动作,是没有办法去重现的。所以我们通常执行的时候都会把-s这个值加上

  • --throttle,表示在事件之间插入一个固定的延迟。可以使用这个选项来减慢 monkey的速度。我们上面执行的命令里面指定了一个1000,这个单位是毫秒,1000就是1秒,相当于给他指定了每个动作间隔一秒,这个也是随机的,并不是说我指定了100个事件,然后每次间隔1000毫秒,所以这个值,不能够用来计算,总共所执行的时长。

  • --pct-touch,调整触摸时间的百分比,这个是最常用的,就是我们俗称的点击

  • --pct-motion,是由屏幕某处的down事件,就是我们所说的滑动

  • --pct-trackball,调整轨迹球事件的百分比,轨迹球事件,在一般普通的应用上是没有的,所以这个参数不常用啊

  • --pct-nav,表示的是基本的导航事件的百分比。上下左右,做为来自定向输入设备的输入。一般在使用app的时候很少去使用上下左右键,所以这个参数也基本不用,除非做的是手机整机的稳定性测试

  • --pct-majornav,表示调整主要导航事件的百分比,主要指的是后退或者菜单。通常情况下也很少去用他,因为比如说点了后退键,或者是菜单键,我们的手机通常会直接回到桌面,这个时候monkey就不能在我们要测的应用上完完整整的去执行测试了

  • –pct-syskeys,系统事件的百分比,主页,返回,开始呼叫,结束呼叫,或音量控制。这种对于普通的app来说也基本没有撒用

  • --pct-appswitch,调整activity启动的百分比,在随机的时间间隔内,Monkey会发出一个startActivity()调用,以此来最大限度地覆盖包中的所有activity,切换activity。activity可以理解为app的每一个界面,一个界面就是一个activity。也就是说monkey会在随机的间隔时间内,去调用任何一个界面,这样的话他能够更大限度的覆盖我们所有的界面。但实际上这个参数也没有太大的用处,因为每一个界面它调用的时候都有权限,并不是说我想去调哪一个界面,就掉哪一个界面,这根web端是不一样的,手机app的界面通常只有一个可以运行的activity,就是起始的activity,所以这个参数我们通常也不怎么用。

  • --pct-anyevent,调整其他事件的百分比,其他事件指的就是除了上面所提到的这些事件以外的事件。比如按键,设备上其他使用较少的按钮,这是任意的事件,通常也不是我们期望的一种事件。

所以对于我们普通app来说只有点击和滑动这两个事件是最常用的。同时-s和-throttle这两个参数也是最常用的,这样的话我们可以总结出一个最基本的参数组合

adb -s 192.168.56.101:5555 shell monkey -s 535353 -p com.douban.frodo --pct-touch 60 --pct-motion 40 --throttle 1000 -v -v -v 100

-s这个值要写一个自己能够记住的数,其实在日志里我们也能够看到这个数
--p,指定我们要执行的应用
--pct-touch,指的是在整体事件中的占比百分之六十,现在总共是100次事件,所以这个touch事件有60次
--pct-motion 40,滑动事件在整体事件中占比百分之四十
--throttle,是去指定每次事件之间的时间的间隔,1000毫秒。
-v -v -v ,连续三个-v表示最详细的日志

monkey约束参数

  • -p,以这种方式指定一个或多个软件包,Monkey将只允许系统访问这些软件包中的界面。如果应用程序需要访问其他包中的activity(例如选择联系人),则还需要指定这些包。如果不指定任何软件包,Monkey将允许系统在所有软件包中启动活动。需要指定多个软件包,就多次使用-p。例如我想指定豆瓣和知乎则多测使用-p
adb shell monkey -s 1919000 -p com.douban.frodo -p com.zhihu.android --pct-touch 60 --pct-motion 40 --throttle 1000 -v -v -v 100
  • -c,以这种方式指定一个或者多个类别,Monkey将只允许系统访问使用指定类别之一列出的活动。也就是说我们的activity,可以使用-c去指定,不常用

monkey调试参数

  • --dbg-no-events,将执行初始的启动到一个测试的activity,但不会 产生任何进一步的事件。也就是说加上这个参数之后,他回去启动应用,但不会去执行。基本不用。

  • --hprof,如果我们指定了这个参数,在我们执行测试的过程中会产生一个大于5兆的文件,这个文件实际上是一个内存的数据文件,我们可以针对他进行一个解析。然后去看内存等信息,但是官方告诉我们要谨慎使用这个。因为我们并不知道他会产生多大的文件,如果这个文件太大的话,可能在我们执行测试的过程中,本身就会导致我们手机的一些卡顿,所以也不是很常用。

  • --ignore-crashes,忽略异常,carshes,在我们执行测试的过程中,需要去忽略crash,我们知道monkey在执行的过程中碰到crash的话,在默认情况下会终止执行。这里的忽略仅仅是暂时忽略异常,会在日志中进行记载,以便monkey测试继续执行,完成本次测试任务。

  • --ignore-crashes,忽略超时,他指的是应用程序未响应,一般情况下我们的主线程会在5秒内等待这个动作,5秒内如果这个动作没有任何反馈的话,一般情况下手机上就会出现超时、异常停止的这种现象。

  • --ingnore-security-exceptions,忽略安全异常,有的时候会报一些安全的异常,但并不不是我们app的,可能是系统的,所以我们需要忽略他,继续执行。

  • --kill-process-after-error,当monkey因错误而停止时,失败的应用程序将保持运行。当这个选项被设置时,它会通知系统停止发生错误的过程,请注意,在正常(成功)完成的情况下,启动的进程不会停止并且在最终事件之后,设备仍然处于最后一个状态。这个参数不常用,是说执行完之后,如果指定了这个参数,他执行完之后就会把进程干掉,但是干掉之后,我们的手机就回到桌面了,也就是说我们看不到最后的一个现象,所以通常情况下我们不对他进行指定。

  • --monitor-native-crashes,监视并报告Android系统本机代码中发生的崩溃。通常我们做APP的测试是一般不用去管手机自身犯得一些错误,不常用。

  • --wait-dbg,停止执行Monkey直到调试器被连接到它,不常用

adb -s 192.168.56.101:5555 shell monkey -s 7654321 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --pct-touch 50 --pct-motion 50 -p com.douban.frodo --throttle 1000 -v -v -v 100 >/Users/liyanjun/Desktop/monkeytest.txt 

我们通常在做monkey测试的时候,还要去配合adb logcat去抓日志,如果不抓的话,很多异常就会拿不到
另外ANR错误,还有一种处理的方式,他会默认的放到data/anr/traces.txt这个目录下,如果有,他会生成在我们的安卓手机上


image.png

相关文章

网友评论

      本文标题:monkey

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