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

Monkey自动化测试

程序员文章站 2022-07-12 18:40:09
...

之前听说过自动化测试的概念,也听过像Appium、Selenium、Monkey、DeviceTest这样的自动化测试框架,但是由于自己代码能力比较差,一直也没有对这些东东做过解读。

最近看了一本腾讯的书《腾讯Android自动化测试实战》,看到了其中关于Monkey的自动化测试章节,感觉Monkey测试应该是最容易入门和实操的了,当然有一些进阶的内容就比较高深了。

一、Monkey整体结构

Monkey的整体概念非常简单,就是使用ADB命令启动Android系统中自带的一个Monkey工具,这个工具能够生成一系列的伪随机事件,模仿用户操作,从而观察测试对象的稳定性,会不会有崩溃等异常。

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当年好多手机都超级经典。

Monkey自动化测试

屏幕旋转事件

这个用来模拟手机的横屏和竖屏。

: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测试了。
    #Monkey自动化测试

调试类参数

这里的参数可以对应着看一看,我主要看了2个:

  • –ignore-crashes:忽略崩溃,就是即使app崩溃了,Monkey也要继续运行;
  • –ignore-timeouts:忽略超时,这个也比较容易理解

Monkey自动化测试

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进阶

还不会~ ~