前面的内容请参见Android应用自动化测试-提纲。
这篇起,我们来介绍Android自动化测试,首先我们要看到是一个基本工具,也是在实际项目中最经常用到的一个自动化的测试工具-Monkey。
Monkey,顾名思义,也叫猴子测试。一般指无目的地随机测试,就像一个猴子在那乱按乱点。它是Android SDK中自带的一个黑盒自动化测试工具,通过随机触发界面事件来发现应用的问题,一般多用于App的稳定性测试和异常发现。但Monkey工具其实触发的是一个伪随机的事件流,也就是这个事件流并不会完全随机的。
它的命令格式是:
adb shell monkey [options]
官网给出了Monkey测试的主要参数及其用法
但我们如果看Monkey源码的话,会发现并不是所有的参数都在这个表格中给出。
还有一些其他参数如:
-f -- 指定脚本
--port -- 指定连接monkeyserver的端口
pkg-blacklist-file -- 包黑名单,不触发名单中的包
pkg-whitelist-file -- 包白名单,仅触发名单中的包
这里我们来看下常用的几个参数含义:
-h 打印出Monkey的基本使用方法
-v 这是一个重要的参数,monkey通过-v参数来确定执行输出日志的详细程度,支持3级,给出-v -v -v则输出最详细的日志信息。
-s 前面提过,monkey工具是一个伪随机事件流,-s参数则代表执行的事件种子,通过这个事件种子号,我们可以生成同样的一套事件流,在我们发现问题,需要复现时,这个参数就非常重要了。
--throttle 延时参数,单位是毫秒,是执行中每两个事件之间的时间间隔,不知道则默认为0
--pct-touch 指定在当前事件流所有的事件中,触屏事件的占比,其他的pct事件也类似,具体代表的事件可以参见前面的官方说明
-p 通过给定包名指定被测应用
-c 确定一个或多个特定的类别,Monkey就只允许系统去访问这些特定类别下列出的Activity了。若不指定的话,默认访问Intent.CATEGORY_LAUNCHER 或Intent.CATEGORY_MONKEY下的Activity
主要的category:
intent.CATEGORY.ALTERNATIVE
intent.CATEGORY.BROWSABLE
intent.CATEGORY.DEFAULT
intent.CATEGORY.DEVELOPMENT_PREFERENCE
intent.CATEGORY.EMBED
intent.CATEGORY.HOME
intent.CATEGORY.INFO
intent.CATEGORY.LAUNCHER
intent.CATEGORY.MONKEY
intent.CATEGORY.OPENABLE
intent.CATEGORY.PREFERENCE
intent.CATEGORY.SELECTED_ALTERNATIVE
intent.CATEGORY.TAB
--hprof monkey执行过程记录hprof文件,便于使用traceview工具来进一步分析
--ignore-crashes 忽略crash,monkey在执行中,如果发生crash,默认为停止在crash事件发生的地方并退出执行。使用这个参数可以忽略这个crash并继续按设定执行完所有的event。
-f 未在官方文档上列出的参数,但很有用。支持Monkey脚本,后面会专门用一篇说明
--port 未在官方文档上列出,也很有用。是monkey的网络功能,也就是可以使用Monkey的server功能,后面也会专门用一篇说明。
Monkey执行日志解析
下面我们以monkey执行计算器应用的日志说明下Monkey执行日志的含义
adb shell monkey -p com.android.calculator2 -v -v 10
-p参数指定包名,-v -v输出两级日志,10表示触发10个事件
:Monkey: seed=1486970253229 count=10
## 执行Monkey工具,本次执行的种子值是1486970253229,对应的事件数量10次
:AllowPackage: com.android.calculator2
## 指允许包名为com.android.calculator2的应用触发事件
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
## 包含默认支持的Category:LAUNCHER、MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// + Using main activity com.android.calculator2.Calculator (from package com.android.calculator2)
## 使用默认的LAUCHER Activity:com.android.calculator2.Calculator
// Selecting main activities from category android.intent.category.MONKEY
// Seeded: 1486970253229
## 种子值
// Event percentages:
## 不同事件占比
// 0: 15.0%
## pct-touch,触屏点击事件
// 1: 10.0%
## pct-motion移动事件
// 2: 2.0%
// 3: 15.0%
## pct-trackball轨迹球事件
// 4: -0.0%
## pct majornav主导航事件
// 5: -0.0%
## pct-nav导航事件
// 6: 25.0%
// 7: 15.0%
## pct-syskeys 系统按键事件
// 8: 2.0%
## pct-appswitch应用切换事件
// 9: 2.0%
// 10: 1.0%
## pct-anyevent其他事件
// 11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.calculator2/.Calculator;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.calculator2/.Calculator } in package com.android.calculator2
Sleeping for 0 milliseconds
##事件间隔0毫秒
:Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN
:Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN
Sleeping for 0 milliseconds
:Sending Touch (ACTION_DOWN): 0:(409.0,317.0)
:Sending Touch (ACTION_UP): 0:(417.92798,318.7205)
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 98 // KEYCODE_BUTTON_C
:Sending Key (ACTION_UP): 98 // KEYCODE_BUTTON_C
Sleeping for 0 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(-4.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-5.0)
## 触发事件过程....
Events injected: 10
## 触发事件数量10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=53ms (0ms mobile, 0ms wifi, 53ms not connected)
## 执行时长,以及其中网络(移动网络、wifi网络、未使用网络)的耗时占比
// Monkey finished
## 完成测试