欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

程序员文章站 2024-03-26 13:08:11
...

一、什么是Monkey?

                                           Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

我们来看一段官方介绍:

UI/Application Exerciser Monkey:Monkey 是一个在模拟器或设备上运行的程序,可生成伪随机用户事件(例如点击、轻触或手势)流以及很多系统级事件。您可以使用 Monkey 以随机且可重复的方式对正在开发的应用进行压力测试。

来自:https://developer.android.com/studio/test/monkey

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

Monkey 包含许多选项,主要分为以下四个类别:

  • 基本配置选项,例如设置要尝试的事件数。
  • 操作限制条件,例如将测试对象限制为单个软件包。
  • 事件类型和频率。
  • 调试选项。

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

  • 如果您已将 Monkey 限制为在一个或多个特定软件包中运行,它会监视并阻止转到任何其他软件包的尝试。
  • 如果应用崩溃或收到任何未处理的异常,Monkey 会停止并报告错误。
  • 如果应用生成“应用无响应”错误,Monkey 会停止并报告错误。

二、Monkey的安装和配置

Windows环境下下载adb工具然后配置环境变量即可;

Mac下可参考之前写的文章进行adb的安装:https://blog.csdn.net/xianyu9264/article/details/106349118    

三、Monkey的基本语法

启动方式:shell。基本语法如下:

adb shell monkey [options] <event-count>

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

如果未指定任何选项,Monkey 将以静默(非详细)模式启动,并将事件发送到目标上。下面是一个更典型的命令行,它会启动您的应用并向其发送 500 个伪随机事件:

第一步:先获取当前正在运行的app的包名(如果是你自己的app或知道要测试的app包名,就不用进行这一步了)

adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

这里可以知道QQ浏览器的包名是:com.tencent.mtt

adb shell monkey -p your.package.name -v 500

当执行了上面的命令后,我们就可以看到monkey已经启动并随机测试点击QQ浏览器了

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

其中,我们可以看到

args: [-p, com.tencent.mtt, -v, 500]

 arg: "-p" // 包名参数

 arg: "com.tencent.mtt" // 我们测试的app的包名

 arg: "-v" // 打印日志

 arg: "500" // 随机事件数为500

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

当设置的事件数执行完毕后,monkey会停止测试 // Monkey finished

 

四、Monkey的参数选项参考

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

现在看到这张截图,是不是看不出来在说什么?没事,我们慢慢来说

类型

选项

说明

示例

常规

--help

输出简单的使用指南

 

 

-v [-v] ... 

命令行上的每个 -v 都会增加详细程度级别。级别 0(默认值)只提供启动通知、测试完成和最终结果。级别 1 提供有关测试在运行时的更多详细信息,例如发送到您的 Activity 的各个事件。级别 2 提供更详细的设置信息,例如已选择或未选择用于测试的 Activity。

  • 日志级别 Level0。示例 adb shell monkey -p your.package.name –v 100  //说明缺省值,仅提供启动提示、测试完成和最终结果等少量信息
  • 日志级别 Level 1。示例 adb shell monkey -p your.package.name –v -v 100 // 说明提供较为详细的日志,包括每个发送到Activity的事件信息
  • 日志级别 Level 2。示例 adb shell monkey -p your.package.name –v -v –v 100 // 说明最详细的日志,包括了测试中选中/未选中的Activity信息

事件

-s <seed>

伪随机数生成器的种子值。如果您使用相同的种子值重新运行 Monkey,它将会生成相同的事件序列

Monkey 测试1:adb shell monkey -p your.package.name -s 10 100

Monkey 测试2:adb shell monkey -p your.package.name –s 10 100

两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。

 

--throttle <milliseconds>

在事件之间插入固定的延迟时间。您可以使用此选项减慢 Monkey 速度。如果未指定,则不延迟,系统会尽快地生成事件。单位是毫秒

adb shell monkey -p com.tencent.mtt --throttle 2000 -v 500

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

我们可以看到在测试过程中每隔2秒才触发一次事件

 

--pct-touch <percent>

调整轻触事件所占百分比。(轻触事件是指屏幕上的单个位置上的按下/释放事件。)

 

 

--pct-motion <percent>

调整动作事件所占百分比。 (动作事件包括屏幕上某个位置的按下事件,一系列伪随机动作和一个释放事件。)

adb shell monkey -p your.package.name --pct-motion 20 1000

 

--pct-trackball <percent>

调整轨迹球事件所占百分比。 (轨迹球事件包括一个或多个随机动作,有时后跟点击。)

adb shell monkey -p your.package.name --pct-trackball 30 1000

 

--pct-nav <percent>

调整“基本”导航事件所占百分比。 (导航事件包括向上/向下/向左/向右,作为方向输入设备的输入。)

adb shell monkey -p your.package.name --pct-nav 40 1000

 

--pct-majornav <percent>

调整“主要”导航事件所占百分比。 (这些导航事件通常会导致界面中的操作,例如 5 方向键的中间按钮、返回键或菜单键。)

adb shell monkey -p your.package.name --pct-majornav 50 1000

 

--pct-syskeys <percent>

调整“系统”按键事件所占百分比。 (这些按键通常预留供系统使用,例如“主屏幕”、“返回”、“发起通话”、“结束通话”或“音量控件”。)

 

 

--pct-appswitch <percent>

调整 Activity 启动次数所占百分比。Monkey 会以随机间隔发起 startActivity() 调用,以最大限度地覆盖软件包中的所有 Activity。

 

 

--pct-anyevent <percent>

调整其他类型事件所占百分比。这包括所有其他类型的事件,例如按键、设备上的其他不太常用的按钮等等。

 

约束

-p <allowed-package-name>

如果您通过这种方式指定一个或多个软件包,Monkey 将仅允许系统访问这些软件包内的 Activity。如果应用需要访问其他软件包中的 Activity(例如选择联系人),您还需要指定这些软件包。 如果未指定任何软件包,Monkey 将允许系统启动所有软件包中的 Activity。如需指定多个软件包,请多次使用 -p 选项,每个软件包对应一个 -p 选项

  • adb shell monkey -p your.package.name 10 // 指定一个包
  • adb shell monkey -p your.package.name1 -p your.package.name1 10 // 指定两个包
  • adb shell monkey 10 // 不指定包

 

-c <main-category>

如果您通过这种方式指定一个或多个类别,Monkey 将仅允许系统访问其中一个指定类别中所列的 Activity。如果没有指定任何类别,Monkey 会选择 Intent.CATEGORY_LAUNCHER 或 Intent.CATEGORY_MONKEY 类别所列的 Activity。要指定多个类别,请多次使用 -c 选项 - 每个类别对应一个 -c 选项

 

调试

--dbg-no-events

指定后,Monkey 将初始启动到测试 Activity,但不会生成任何其他事件。 为了获得最佳结果,请结合使用 -v、一个或多个软件包约束条件以及非零限制,以使 Monkey 运行 30 秒或更长时间。这提供了一个环境,您可以在其中监控应用调用的软件包转换操作。

 

 

--hprof

如果设置此选项,则会在 Monkey 事件序列之前和之后立即生成分析报告。这将在 data/misc 下生成大型(约为 5Mb)文件,因此请谨慎使用。如需了解如何分析性能分析报告,请参阅分析应用性能

 

 

--ignore-crashes

通常,当应用崩溃或遇到任何类型的未处理异常时,Monkey 将会停止。如果指定此选项,Monkey 会继续向系统发送事件,直到计数完成为止。

adb shell monkey -p com.tencent.mtt --ignore-crashes 1000

测试过程中即使程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止

adb shell monkey -p com.tencent.mtt 1000

测试过程中,如果QQ浏览器程序崩溃,Monkey将会停止运行

备注:长时间monkey测试,建议加上这个命令参数

 

--ignore-timeouts

通常,当应用遇到任何类型的超时错误(例如“应用无响应”对话框)时,Monkey 将会停止。如果指定此选项,Monkey 会继续向系统发送事件,直到计数完成为止。

adb shell monkey -p com.tencent.mtt --ignore-timeouts 1000

测试过程中即使程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止

adb shell monkey -p com.tencent.mtt 1000

测试过程中,如果QQ浏览器程序崩溃,Monkey将会停止运行

备注:长时间monkey测试,建议加上这个命令参数

 

--ignore-security-exceptions

通常,当应用遇到任何类型的权限错误(例如,如果它尝试启动需要特定权限的 Activity)时,Monkey 将会停止。如果指定此选项,Monkey 会继续向系统发送事件,直到计数完成为止。

adb shell monkey -p com.tencent.mtt --ignore-security-exception 1000

 

--kill-process-after-error

通常,当 Monkey 因出错而停止运行时,出现故障的应用将保持运行状态。设置此选项后,它将会指示系统停止发生错误的进程。 注意,在正常(成功)完成情况下,已启动的进程不会停止,并且设备仅会处于最终事件之后的最后状态。

注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程

adb shell monkey -p com.tencent.mtt --kill-process-after-error 1000

 

--monitor-native-crashes

监视并报告 Android 系统原生代码中发生的崩溃。如果设置了 --kill-process-after-error,系统将会停止。

adb shell monkey -p com.tencent.mtt --monitor-native-crashes 1000

 

--wait-dbg

阻止 Monkey 执行,直到为其连接了调试程序。

 

那么我们测试过程中的日志如何输出呢?不能仅在控制台上输出吧?

adb shell monkey -p com.tencent.mtt -v -v 1000 -> test2.txt

测试完毕后我们进入对应盘符找到文件:

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

综上所述,我们想配合使用这些命令,该如何进行呢?

举个例子,我们想要跑QQ浏览器app,设置30%的点击事件和30%的动作事件和30%的轨迹事件以及10%的其他事件,日志信息等级为3,每个事件时延200毫秒,总体发送事件数为10000,结果输出到123.txt中:

adb shell monkey -p com.tencent.mtt --pct-touch 30 --pct-motion 30 --pct-trackball 30 --pct-anyevent 10 --throttle 200 -v -v -v 10000 -> monkeyTest.txt

执行完毕后,我们可以进入盘符找到对应的文件进行分析(其实最重要的不是这里输出的日志,而是待测app打印的日志),所以我们要配合adb logcat使用:

adb shell monkey -p com.tencent.mtt --pct-touch 30 --pct-motion 30 --pct-trackball 30 --pct-anyevent 10 --throttle 200 -v -v -v 10000 -> monkeyTest.txt & adb logcat -v time>logcat.log

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

Monkey测试初识 [一篇非常全面详细的monkey入门介绍!]

 

后续:

学习完以上这些,小伙伴们是不是已经迫不及待去使用了?

下篇文章,我带着大家来一起看一下monkey的原理、源码以及脚本实现方式!