Monkey自动化测试
程序员文章站
2022-07-12 18:40:09
...
之前听说过自动化测试的概念,也听过像Appium、Selenium、Monkey、DeviceTest这样的自动化测试框架,但是由于自己代码能力比较差,一直也没有对这些东东做过解读。
最近看了一本腾讯的书《腾讯Android自动化测试实战》,看到了其中关于Monkey的自动化测试章节,感觉Monkey测试应该是最容易入门和实操的了,当然有一些进阶的内容就比较高深了。
一、Monkey整体结构
Monkey的整体概念非常简单,就是使用ADB命令启动Android系统中自带的一个Monkey工具,这个工具能够生成一系列的伪随机事件,模仿用户操作,从而观察测试对象的稳定性,会不会有崩溃等异常。
二、Monkey参数
2.1 用户事件
用户事件包括:
- 触摸事件
- 手势事件
- 二指缩放事件
- 轨迹事件
- 屏幕旋转事件
- 基本导航事件
- 主要导航事件
- 系统按键事件
- 启动Activity事件
- 键盘事件
- 其他类型事件
触摸事件
触摸事件动作分解为:一个手指按下动作和一个手指抬起动作
# 这里括号里的内容是点击的坐标
# 这个0在下文中比较容易看明白
:Sending Touch (ACTION_DOWN): 0,(444.0,1716.0)
:Sending Touch (ACTION_UP): 0,(447.18365,1728,0087)
手势事件
手势事件分解为:一个手指按下动作,一系列的移动动作和一个手指抬起动作
:Sending Touch (ACTION_DOWN): 0:(282.0,750.0)
:Sending Touch (ACTION_MOVE): 0:(281.0507,745.5253)
:Sending Touch (ACTION_MOVE): 0:(274.9443,743.3276)
:Sending Touch (ACTION_MOVE): 0:(269.18774,738.50525)
:Sending Touch (ACTION_MOVE): 0:(260.14917,733.6212)
:Sending Touch (ACTION_UP): 0:(254.1414,730.6132)
二指缩放事件
二指缩放事件可以分解为:2个手指在屏幕上两处同时按下,同时移动,最后同时抬起。
# 这里可以看出有个0和1,可以猜测是代表不同的手指
# Action_Down和Action_Pointer_Down模拟两个手指同时点下
:Sending Touch (ACTION_DOWN): 0:(274.0,193.0)
:Sending Touch (ACTION_POINTER_DOWN 1): 0:(272.80875,198.17978) 1:(26.0,312.0) :Sending Touch (ACTION_MOVE): 0:(251.31396,198.5104) 1:(24.973522,308.64676)
:Sending Touch (ACTION_MOVE): 0:(240.28494,202.44012) 1:(23.442032,307.8576)
:Sending Touch (ACTION_MOVE): 0:(221.90855,206.75597) 1:(22.903313,306.47507) :Sending Touch (ACTION_MOVE): 0:(210.28592,212.24286) 1:(17.78174,303.11304)
轨迹事件
这个命令是针对早年有滚动球的手机的,比如当年的HTC G7、HTC G5。
PS:这个手机的设计是真的好看,HTC当年好多手机都超级经典。
屏幕旋转事件
这个用来模拟手机的横屏和竖屏。
:Sending rotation degree=1, persist=false
:Sending rotation degree=3, persist=true
:Sending rotation degree=2, persist=true
:Sending rotation degree=0, persist=true
基本导航事件
这个现在使用的也比较少。
系统按键事件
Home键、返回键、音量调节等。
# 同样是两个动作构成一个事件
:Sending Key (ACTION_DOWN): 5 // KEYCODE_CALL
:Sending Key (ACTION_UP): 5
:Sending Key (ACTION_DOWN): 4 // KEYCODE_BACK
:Sending Key (ACTION_UP): 4
:Sending Key (ACTION_DOWN): 3 // KEYCODE_HOME
:Sending Key (ACTION_UP): 3
:Sending Key (ACTION_DOWN): 24 // KEYCODE_VOLUME_UP
:Sending Key (ACTION_UP): 24
:Sending Key (ACTION_DOWN): 25 // KEYCODE_VOLUME_DOWN
:Sending Key (ACTION_UP): 25
2.2 命令行参数
参数包括:
- 基本配置类参数
- 事件类型和频率参数
- 约束限制类参数
- 调试类参数
- 官方隐藏参数
基本配置类参数
包括帮助和日志信息。
- –help
- -v表示输出日志的级别,有-v、-v-v、-v-v-v三个级别,v越多,日志越详细。
事件类型和频率参数
上面已经说了不同的事件类型,通过事件和pct(percent)参数,能够限制不同事件的百分比情况。
约束限制类参数
下面有2个参数可以注意下:
- -s:伪随机数的种子,这个东东在好多编程语言里有类似的概念,主要用于Random函数的,如果给Random函数一个种子,那么可以复现上次Random的值;
- -p:可以限制包名,遮掩就能对特定的App进行Monkey测试了。
#
调试类参数
这里的参数可以对应着看一看,我主要看了2个:
- –ignore-crashes:忽略崩溃,就是即使app崩溃了,Monkey也要继续运行;
- –ignore-timeouts:忽略超时,这个也比较容易理解
2.3 命令行使用方法
Monkey运行依赖于Adb命令,所以电脑上安装Adb就可以了,这个不细说。
一个典型的Monkey测试命令
adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion 25 --pct-appswitch 10 --pct-rotation 5 -s 12358 --throttle 400 --ignore-crashes --ignore-timeouts -v 500000
- adb shell monkey:启动Monkey
- -p com.***:安卓的应用程序名称,通过
adb shell pm list package
命令能够看到应用的包名 - –pct-touch 40:touch事件的比例,后面的命令也是类似的意思
- -s 12358:伪随机种子,在Monkey测试里种子应该特别重要,因为事件是随机生成的,如果测出了Crash而无法复现,那就白测了,通过种子能够复现测试场景。
- –throttle 400:事件和事件之间的时间,以ms为单位,这个也比较好理解
- –ignore-crashes:忽略崩溃
- –ignore-timeouts:忽略超时
- -v:日志级别
- 50000:生成50000个随机事件
三、实际尝试
3.1 实际尝试命令
我用自己的手机进行了下尝试,执行的命令如下:
adb shell monkey --pct-touch 80 --pct-motion 20 --throttle 500 --ignore-crashes --ignore-timeouts -v 100
#
下面是执行这个命令时,生成的记录文件(一部分)。
(base) 海贼 王路飞的电脑 ~ % adb shell monkey --pct-touch 80 --pct-motion 20 --throttle 500 --ignore-crashes --ignore-timeouts -v 100
bash arg: --pct-touch
bash arg: 80
bash arg: --pct-motion
bash arg: 20
bash arg: --throttle
bash arg: 500
bash arg: --ignore-crashes
bash arg: --ignore-timeouts
bash arg: -v
bash arg: 100
args: [--pct-touch, 80, --pct-motion, 20, --throttle, 500, --ignore-crashes, --ignore-timeouts, -v, 100]
arg: "--pct-touch"
arg: "80"
arg: "--pct-motion"
arg: "20"
arg: "--throttle"
arg: "500"
arg: "--ignore-crashes"
arg: "--ignore-timeouts"
arg: "-v"
arg: "100"
arg="--pct-touch" mCurArgData="null" mNextArg=1 argwas="--pct-touch" nextarg="80"
data="80"
arg="--pct-motion" mCurArgData="null" mNextArg=3 argwas="--pct-motion" nextarg="20"
data="20"
arg="--throttle" mCurArgData="null" mNextArg=5 argwas="--throttle" nextarg="500"
data="500"
arg="--ignore-crashes" mCurArgData="null" mNextArg=7 argwas="--ignore-crashes" nextarg="--ignore-timeouts"
arg="--ignore-timeouts" mCurArgData="null" mNextArg=8 argwas="--ignore-timeouts" nextarg="-v"
:Monkey: seed=1598627240825 count=100
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 80.0%
// 1: 20.0%
// 2: 0.0%
// 3: 0.0%
// 4: -0.0%
// 5: -0.0%
// 6: 0.0%
// 7: 0.0%
// 8: 0.0%
// 9: 0.0%
// 10: 0.0%
// 11: 0.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.phone/.MobileNetworkSettings;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.phone/.MobileNetworkSettings } in package com.android.phone
// Allowing start of Intent { cmp=com.android.phone/.MSimMobileNetworkSettings } in package com.android.phone
// activityResuming(com.android.phone)
:Sending Touch (ACTION_DOWN): 0:(971.0,2001.0)
:Sending Touch (ACTION_UP): 0:(964.4397,1990.9722)
:Sending Touch (ACTION_DOWN): 0:(916.0,891.0)
:Sending Touch (ACTION_UP): 0:(914.7328,878.2497)
:Sending Touch (ACTION_DOWN): 0:(1025.0,576.0)
:Sending Touch (ACTION_UP): 0:(1021.9408,579.6345)
:Sending Touch (ACTION_DOWN): 0:(55.0,2118.0)
:Sending Touch (ACTION_UP): 0:(65.43259,2114.8442)
:Sending Touch (ACTION_DOWN): 0:(987.0,1060.0)
:Sending Touch (ACTION_UP): 0:(999.927,1050.3134)
:Sending Touch (ACTION_DOWN): 0:(965.0,585.0)
:Sending Touch (ACTION_UP): 0:(974.86755,592.76666)
从上面的日志能看出很多信息,包括:
- 事件分布
- 种子
- IncludeCategory,这个还不懂,后续更新补充一下
- Package
- 生成的详细用户事件
- 网络情况
四、Monkey进阶
还不会~ ~
上一篇: nginx 反向代理