作为初入测试行业的小白,了解一些Monkey测试是很有必要的,在此小编整理了一些App方面Monkey测试的基础以及Monkey脚本的编写,希望可以帮助到大家。
1. Monkey的概念
Monkey测试又称"猴子测试",是指没有测试经验的人对产品进行乱点乱按。Monkey是Android 系统自带的一个命令行工具,可以向测试的应用程序发送伪随机的用户事件流(如按键、触屏、手势等),实现对应用程序进行测试的目的。通常使用Monkey进行压力测试和稳定性测试。
什么时候使用monkey测试比较合适?
答:一般产品比较稳定,没有特别多bug的时候,一般会用monkey去测试待测应用的稳定性,健壮性(是否会发生闪退、崩溃、ANR问题)
2. Monkey使用
第一部分介绍了Monkey的基本概念,那么对于测试小白要怎么使用Monkey呢?
第一步
:需要在电脑上安装adb工具,如果不知道怎么安装的可以参考小编的另一篇博客ADB命令介绍
第二步
:找一台真机或者模拟器,大家还是直接使用真机吧,比较方便,需要打开手机上的USB调试模式,使用数据线连接电脑。
第三步
:打开命令行输入命令:
adb shell monkey
或者
adb shell monkey --help
之后就会看到命令行中一大堆的内容,以下内容是Monkey的帮助信息,主要是Monkey工具中参数的使用
2.1 Monkey参数的使用
首先 先看一下事件参数表
,其中包含了一些常用的参数,接下来就给大家挑几个介绍一下基本的用法
参数 | 说明 |
---|---|
-s | 伪随机数生成的种子,如果用相同的随机种子值再次运行相同的Monkey,前后两次执行将会生成相同的事件序列 |
–throttle | 在两个事件之间插入一个固定延时,可以减缓Monkey的执行速度。 |
–pct-touch | 设定触屏事件生成的百分比,触屏事件是一个有手指按下,抬起事件的手势 |
–pct-motion | 设定滑动事件生成的百分比 |
–pct-trackball | 设定轨迹球事件生成的百分比,轨迹球事件是包含一系列随机移动和单击事件的事件 |
–pct-nav | 设置基本的导航事件的百分比,基本导航事件是模拟方向性设备输入向上、向下、向左、向右的事件 |
–pct-majornav | 设定主要导航事件的百分比,主要导航事件通常会导致UI产生回馈事件,如:单击back事件,MENU键 |
–pct-syskeys | 设定系统按键事件的百分比,系统按键是指这些按键通常被保留,由系统使用,如HOME、BACK、拨号、挂断及音量控制键 |
–pct-appswitch | 设定启动活动事件的百分比。在随机的一定间隔后,Monkey就会执行一个start Activity()函数尽可能多覆盖包中全部活动 |
–pct-anyevent | 设定其他类型事件的百分比,如普通的按键消息、不常用的设备按钮事件等 |
-p | 设定一个或多个包名,每个包名前都需要有一个-p |
–ignore-crashes | 一般情况下,Monkey会在待测应用程序崩溃或发生任何异常后停止运行,若指定了该参数,则Monkey将会在产生异常后,继续向系统发送事件,直到指定的事件消息全部完成为止。 |
–ignore-timeouts | 一般情况下,当应用程序发生任何超时错误时,monkey将停止运行,若指定了该参数,则monkey将会在产生错误信息后,继续向系统发送事件,直到指定的事件消息全部完成为止 |
-
-p
指的package,指定要操作的应用程序,也就是我们平时说的apk包。adb shell monkey -p packagename 1000 -p 参数指定要运行的包, 1000表示事件次数 当存在多个包时 adb shell monkey -p packagename1 -p packagename2 1000
-
-s
随机种子,在测试的过程中非常推荐使用的一种方法,如果第一次运行时出现了异常,可以通过随机种子复现之前异常的步骤,adb shell monkey -p packagename -s 10 1000
-
-v
通过-v可以查看Monkey执行的过程,在Monkey日志分为三个级别:0、1、2,分别对应的是一个-v、-v -v、-v -v -v;如果Monkey命令中什么都不写的情况话默认为0级别。0级:adb shell monkey -p packagename -v 1000 1级:adb shell monkey -p packagename -v -v 1000 2级:adb shell monkey -p packagename -v -v -v 1000
具体案例分析:
输入命令:adb shell monkey -p packagename -v -v -v 1000
命令窗口中会输出一大堆的内容,下面从中截取了一段:~ ~ adb shell monkey -p com.qiniu.pili.droid.shortvideo.demo -v -v -v 100 bash arg: -p bash arg: com.qiniu.pili.droid.shortvideo.demo bash arg: -v bash arg: -v bash arg: -v bash arg: 100 args: [-p, com.qiniu.pili.droid.shortvideo.demo, -v, -v, -v, 100] arg: "-p" arg: "com.qiniu.pili.droid.shortvideo.demo" arg: "-v" arg: "-v" arg: "-v" arg: "100" data="com.qiniu.pili.droid.shortvideo.demo" :Monkey: seed=1633995691825 count=100 :AllowPackage: com.qiniu.pili.droid.shortvideo.demo :IncludeCategory: android.intent.category.LAUNCHER :IncludeCategory: android.intent.category.MONKEY // Selecting main activities from category android.intent.category.LAUNCHER // - NOT USING main activity com.android.browser.launch.SplashActivity (from package com.android.browser) // - NOT USING main activity com.android.calendar.homepage.AllInOneActivity (from package com.android.calendar) // Seeded: 1633995691825 // 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% // 9: 2.0% // 10: 1.0% // 11: 13.0% :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity;end // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity } in package com.qiniu.pili.droid.shortvideo.demo // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity } in package com.qiniu.pili.droid.shortvideo.demo Sleeping for 0 milliseconds :Sending Touch (ACTION_MOVE): 0:(417.50476,1845.2583) :Sending Touch (ACTION_MOVE): 0:(416.0715,1845.2562) :Sending Touch (ACTION_MOVE): 0:(408.3729,1843.4117) :Sending Touch (ACTION_MOVE): 0:(404.40262,1840.556) :Sending Touch (ACTION_MOVE): 0:(378.433,1833.2344) :Sending Touch (ACTION_UP): 0:(369.19046,1832.6873) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER :Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER :Sending Key (ACTION_UP): 82 // KEYCODE_MENU Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(391.0,92.0) :Sending Touch (ACTION_UP): 0:(403.20142,94.02997) Events injected: 100 :Sending rotation degree=0, persist=false :Dropped: keys=0 pointers=0 trackballs=0 flips=1 rotations=0 ## Network stats: elapsed time=601ms (0ms mobile, 0ms wifi, 601ms not connected) // Monkey finished ➜ ~
接下来对以上日志进行分析
:Monkey: seed=1633995691825 count=100 Monkey在使用伪随机数seed产生事件序列时,在没有指定随机种子时,系统会随机分配一个值,count表示随机事件次数 :AllowPackage: com.qiniu.pili.droid.shortvideo.demo 表示只启动com.qiniu.pili.droid.shortvideo.demo 包中的Activity。 :IncludeCategory: android.intent.category.LAUNCHER :IncludeCategory: android.intent.category.MONKEY 表示启动的意图重量为”LAUNCHER“和”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% // 9: 2.0% // 10: 1.0% // 11: 13.0% 本次伪随机事件中各种类型的事件比例,如 按键、滑屏等事件,这些事件等占比也可以自己进行相应参数等设定 :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity;end 表示跳转到“com.qiniu.pili.droid.shortvideo.demo”包中的“.activity.MainActivity”这个活动。 // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity } in package com.qiniu.pili.droid.shortvideo.demo 表示允许启动“com.qiniu.pili.droid.shortvideo.demo”包中的“.activity.MainActivity”这个活动。 Sleeping for 0 milliseconds 表示Monkey允许在发送各种随机事件时有一个延迟,因为我们没有在命令行中指定,所以Monkey只能尽可能快的发送事件消息。 Events injected: 100 上面的信息表示产生了100次注入事件,因为命令行中设置的为100 :Sending rotation degree=0, persist=false 表示屏幕旋转,旋转角度为0,是否保持旋转状态,为假。 :Dropped: keys=0 pointers=0 trackballs=0 flips=1 rotations=0 表示丢弃的屏幕旋转相关信息,丢弃:键=0,指针=0,轨迹球=0,键盘轻弹=1,屏幕翻转=0. // Monkey finished 如果在日志中看到这句就代表执行成功,在此过程中没有什么问题。
-
日志保存
adb shell monkey -p com.qiniu.pili.droid.shortvideo.demo -v -v -v 100 >/Users/Downloads/monkey.log adb logcat -v time '*E' > monkey.log (只保存error级别的日志)
-
综合案例展示
针对Monkey中的参数我们知道什么意思,怎么使用就可以了,接下来给大家进行综合案例展示
:adb shell monkey -v -v -v --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions -p com.qiniu.pili.droid.shortvideo.demo -s 100 --pct-touch 50 --throttle 3000 1000 >monkey.log 测试过程中忽略相关的安全、超时、崩溃等异常 --pct-touch 50 触屏事件为百分之五十 --throttle 3000 事件间隔为3秒 -s 100 种子为100
3. Monkey脚本
先给大家展示一下Monkey脚本,脚本名字为monkey.txt,内容如下:
对于Tap(960,274)中的坐标问题我们可以通过uiautomatorviewer工具解决,当然还有一个最简单的办法是:手机设置——开发者模式——指针位置,这样我们就可以获取button的坐标了。
type = raw events # 表示脚本的类型
count = 1 # 用于说明执行的次数,但是无论改成什么都只是执行一次??
speed = 1.0 # 用于调整两次执行随机事件的发送频率。
start data >> # 启动 或者start data >>
LaunchActivity(com.qiniu.pili.droid.shortvideo.demo) # 包名,界面名
Tap(960,274) ## button 的坐标(点击)
UserWait(5000) # 等待时间
Tap(390,1538)
UserWait(13000)
Tap(780,1583)
UserWait(5000)
Tap(777,1183)
UserWait(5000)
Tap(30,1335)
UserWait(5000)
Tap(30,1456)
UserWait(5000)
Tap(945,81)
UserWait(5000)
DispatchPress(KEYCODE_BACK) # 点击返回键
第一步
: 写monkey脚本,可以将其保存为monkey.txt( 名字任意)
第二步
: 将脚本Push到手机某一个文件中
adb push monkey.txt /sdcard/
第三步
: 运行脚本
adb shell monkey -f /sdcard/monkey.txt -v -v 1
以上就是Monkey的全部内容了,希望可以帮助到大家。