一、何为monkey
Android自动化测试命令行工具,启动脚本位于Android系统的/system/bin目录的Monkey中,jar包位于Android系统的/system/framework目录,Monkey可以运行在模拟器或者设备上,生产随机的用户事件,例如单击、触摸等等。使用Monkey进行自动化测试时,主要涉及四个方面:
1.基本配置: 设置事件数
2.操作限制:例如将测试限制为单个程序包
3.事件类型和时间频率
4.调试选项 Monkey运行时会监控被测系统,并处理:
- 如果限制了Monkey在一个或者多个特定程序包运行,它将监视并阻止导航到其他任何程序的操作。
- 如果测试中出现了无响应问题,Monkey将停止并报错。
- 根据调试选项,生成有关Monkey进度和正在生成事件的报道。
启动:adb shell
cd /system/bin
输入Monkey启动
monkey命令格式:
$ adb shell monkey [options] <event-count>
二、monkey事件
Monkey执行的事件有11种:触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、系统按键事件、启动Activity事件、键盘事件、其他类型事件。
1.触摸事件
在屏幕按下并抬起的操作,[--pct-touch PERCENT] 指定事件在所有事件中的百分比,事件输出日志是一组Touch(ACTION_DOWN)和Touch(ACTION_UP)。
2.手势事件
在屏幕的某处按下、随机移动、抬起的操作,指直线滑动。 [--pct-motion PERCENT]指令配置,事件输出日志:一个ACTION_DOWN事件、一系列ACTION_MOVE事件和一个ACTION_UP事件。
3.二指缩放事件
模拟双指操作, [--pct-pinchzoom PERCENT],日志输出:一个ACTION_DOWN事件和一个ACTION_POINTER_DOWN事件,即模拟两个手指同时点下;中间是一系列的ACTION_MOVE事件,即两个手指同时在屏幕上直线滑动;结束是由一个ACTION_POINTER_UP事件和一个ACTION_UP事件组成的,即两个手指同时放开
4.轨迹事件
一个或多个随机移动组成,有时会伴随点击,这类事件包含了曲线滑动,类似以前的轨迹球操作。[--pct-trackball PERCENT] 命令配置,该事件是由一系列的Trackball(ACTION_MOVE)事件组成的。
5.基本导航事件
点击方向输入设备的上、下、左、右的按键操作,很少设备有这个按键。[--pct-nav PERCENT] 配置,日志输出Key(ACTION_DOWN)和Key(ACTION_UP)
6.主要导航事件
主要导航按键的操作,这些按键通常会导致UI界面中的动作,如键盘的中间键、回退按键、菜单按键,[--pct-majornav PERCENT]配置,日志输出Key(ACTION_DOWN)和Key(ACTION_UP)
7.系统按键事件
点击系统保留使用的按键的操作,如点击Home键、返回键、音量调节键等。可通过[--pct-syskeys PERCENT]参数来配置其事件百分比。日志输出Key(ACTION_DOWN)和Key(ACTION_UP)。
8.启动Activity事件
启动Activity事件是指在手机上启动一个Activity的操作。在随机的时间间隔中,Monkey将执行一个startActivity()方法,作为最大限度上覆盖被测包中全部Activity的一种方法。可通过[--pct-appswitch PERCENT]参数来配置其事件百分比,该事件是由一个Switch操作组成的。
9.键盘事件
键盘事件主要是一些与键盘相关的操作。比如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等。可通过 [--pct-flip PERCENT]参数来配置其事件百分比。
10.其他类型事件
[--pct-anyevent PERCENT] 指前面事件外的所有事件。该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是其他的一些系统按键,如字母按键、数字按键等。因为现在手机很少带字母按键或数字按键,所以这个事件一般使用得比较少。
11.屏幕旋转事件
--pct-rotation日志输出,degree表示旋转方向,顺时针旋转,0-3分别表示90°、180°、270°、360°。
三、monkey参数
1.事件类参数
- [-s SEED]伪随机数生成种子值,可以通过此值设置每次测试运行都执行一样的事件
- [--throttle MILLISEC] 时间间隔,事件之间的固定延迟时间,单位ms
2.调试参数
- [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...] 包约束,如果应用需要访问其他包里的activity,需要在此指定包名,否则只能访问已指定包名的activity,如果不指定任何包名,monkey将允许系统启动全部包里的activity.
- [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...] 指定运行的activity类别。
-
[--ignore-crashes] 应用程序发生崩溃后继续发送事件,如果不设置此项,monkey遇到崩溃异常后将停止运行
-
[--ignore-timeouts] 应用程序发生超时后继续发送事件
- [--ignore-security-exceptions] 应用程序发生权限错误时继续运行
- [--monitor-native-crashes] 监视并且报告native层的崩溃事件
- [--ignore-native-crashes] 忽略native层crash
- [--kill-process-after-error] 发生错误时,通知系统停止发生错误的进程
- [--dbg-no-events] 监视应用程序所调用的包之间的转换
- [--hprof] 在事件序列前后立即生成profiling report
- [--wait-dbg]暂停执行中的monkey,直到有调试器与它连接
四、monkey日志
1.日志级别
-v指定日志级别,[-v]的个数代表日志的详细程序,越多-v越详细,不过目前最多支持3个
-v:0级 初启动、测试完成、最终结果外提供较少信息。
-v -v:提供较详细的测试信息
-v -v -v:提供更详细的安装信息
2.日志输出
日志可以保存在PC或者手机上、标准流和错误流分开保存。
- 保存在PC中 adb shell monkey [options] <event-count> >d:monkey.txt
- 保存在手机上 adb shell monkey [options] <event-count> >/sdcard/monkey.log
- 标准流与错误流分开保存 monkey [options] <event-count> 1>d:monkey.txt 2>d:monkeyerror.txt
monkey脚本实践
上述指令只能执行随机的事件流,如果需要测试某个特定场景和操作,需要借助自定义脚本。脚本只能通过坐标的方式来定位点击、移动,坐标信息可以通过开发者选项-开启显示指针位置获取。
脚本调用 [-f scriptfile [-f scriptfile] ...]
API参数
- LaunchActivity(pkg_name, cl_name):启动应用的Activity。参数:包名和启动的Activity。
- Tap(x, y, tapDuration): 模拟一次手指单击事件。参数:x,y为控件坐标,tapDuration为点击的持续时间,此参数可省略。
- UserWait(sleepTime): 休眠一段时间
- DispatchPress(keyName): 按键。参数: keycode。
- RotateScreen(rotationDegree, persist): 旋转屏幕。 参数:rotationDegree为旋转角度, e.g. 1代表90度;persist表示旋转之后是否固定,0表示旋转后恢复,非0则表示固定不变。
- DispatchString(input): 输入字符串。
- DispatchFlip(true/false): 打开或者关闭软键盘。
- PressAndHold(x, y, pressDuration): 模拟长按事件。
- Drag(xStart, yStart, xEnd, yEnd, stepCount): 用于模拟一个拖拽操作。
- PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放手势。
- LongPress(): 长按2秒。
- DeviceWakeUp(): 唤醒屏幕。
- PowerLog(power_log_type, test_case_status): 模拟电池电量信息。
- WriteLog(): 将电池信息写入sd卡。
- RunCmd(cmd): 运行shell命令。
- DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags): 向指定位置,发送单个手势。
- DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFilags): 发送按键消息。
- LaunchInstrumentation(test_name,runner_name): 运行一个instrumentation测试用例。
- DispatchTrackball: 模拟发送轨迹球事件。
- ProfileWait: 等待5秒。
- StartCaptureFramerate(): 获取帧率。
- EndCaptureFramerate(input): 结束获取帧率。
脚本格式
脚本包含头文件信息和monkey命令
# 头文件
type = raw events
count = 1
speed = 1.0
# monkey命令
# 启动测试
start data >>
LaunchActivity(com.tencent.mm,com.tencent.mm.ui.LauncherUI)
UserWait(2000)
运行
将上述文件保存到D:monkey_test.txt,push到手机中:adb push d:monkey_test.txt /sdcard
adb shell monkey -f /sdcard/monkey_test.txt -v -v 100>d:monkey_2.txt
注意:如果不push到手机里,而是adb shell monkey -f d:monkey_test.txt -v -v 100 >d:monkey_1.txt的话,会运行失败。