移动测试_Monkey
Monkey是android系统自带的一个命令行工具,可以运行在模拟器或实际设备中。Monkey可以向被测试的应用程序发送伪随机的用户事件流(例如按键、触屏、手势等),实现对应用程序进行测试。
Monkey参数详解
adb shell monkey可以查看monkey的各个参数。利用Monkey及其提供的相关参数可以测试移动端应用软件的稳定性,健壮性。
参数及其功能描述
-v 指定打印信息的详细级别。每多包含一个“-v”就会增加一个信息的详细级别,默认为0,当指令包含一个“-v”参数时,会打印测试执行时的一些发送给被测试的activity的事件。包含两个“-v”参数时,信息详细级别为1,打印更全面,例如增加了哪些activity被选中。
包含三个“-v”参数时,信息详细级别为2,打印是最全面的。
-s 应用场合:使用Monkey执行测试完成后出现bug,若需要复现bug时。无法保证完全复现bug出现时执行的所有操作。但是可以复现bug的执行事件和序列。例如,上次是先单机在滑屏,复现时也是先单击再滑屏事件。
Monkey中的“-s”参数用于指定伪随机数生成器的seed(种子)值,如果seed相同,则两次Monkey测试所产生的事件序列相同。下列两次测试产生的随机操作序列是相同的。
第一次输入命令:Adb shell monkey –v –v –v –p com.android.calendar –s 100
第二次输入命令:Adb shell monkey –v –v –v –p com.android.calendar –s 100
Adb shell monkey –v –v –v –p com.android.calendar 100 > d:/testlog/testlog.txt 可将执行monkey的结果信息重定向保存至指定目录。
【monkey日志查找异常时可以关键字搜索ANR exception、crash等字样进行分析】
-p 用于指定一个或多个包被启动。需要手机具有root权限。
应用场景:使用Monkey进行测试时,有时想针对某一个应用、几个应用或者随机选择手机中的应用进行稳定性方面的测试,则可以通过“-p”参数指定应用包名。通过“-p”参数指定包名后,系统仅允许启动指定的app。若不指定包名系统将随机启动任意app。
例如:
1.adb shell monkey 100
未指定任何包信息,命令会向手机系统随机发送100个伪随机事件序列,执行完100次伪随机事件序列后停止运行。
2.adb shell monkey –p com.android.calendar 100
指定单个包名,向日历应用随机发送100个伪随机事件序列,执行过程中将只打开和日历应用相关的activity操作。
3.adb shell monkey –p com.android.calendar –p com.tencent.news 100
指定两个包名,向日历和腾讯新闻应用随机发送100个伪随机事件序列,执行过程中将只打开和这两个应用相关的activity操作。
-throttle 用于指定各个操作也就是随机事件间的延时。其后跟一个数字,单位是ms。例如,
Adb shell monkey –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次时间间隔3s。
–pct-touch 用于设定触屏事件生成的百分比,触屏事件指的是有手指按下和抬起事件的手势。例如控制按键、触屏等事件的比例。
Adb shell monkey –pct-touch 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次事件间隔3s,其中设定触屏事件占比为50%。
–pct-motion
用于设定滑动事件生成的百分比,滑动事件指的是一个先在某个位置手指按下,滑动一段距离后再抬起手指的手势。
Adb shell monkey –pct-motion 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次事件间隔3s,其中滑动事件占比50%
–pct-trackball 用于设定轨迹球事件生成的百分比,轨迹球事件是包含一系列随机移动和单击事件的时间
Adb shell monkey –pct-trackball 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次事件间隔3s,其中设定轨迹球事件占比50%。
–pct-nav 用于设置基本的导航事件的百分比,基本导航时间指的是模拟方向性设备输入向上、向下、向左、向右的事件。
Adb shell monkey –pct-nav 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次时间间隔3s,其中设定导航事件占比50%
–pct-majornav 用于设定主要导航事件百分比,主要导航事件通常会导致ui产生回馈事件,如单击back键,menu键。
Adb shell monkey –pct-majornav 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次时间间隔3s,其中主要导航时间占比50%
–pct-syskeys 用于设定系统按键事件的百分比,系统按键指的是这些按键通常被保留由系统使用,如home、back、拨号、挂断及音量控制键等。
Adb shell monkey –pct-syskeys 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次事件间隔3s,其中设定主要home、back、拨号、挂断及音量控制键时间占比50%
–pct-appswitch 用于设定启动活动(activity)事件的百分比,在随机的一定间隔后,monkey就会执行一个startActivity()尽可能多的覆盖包中全部活动。
Adb shell monkey –pct-appswitch 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次事件间隔为3s,其中设定主要覆盖包中50%的启动活动(activity)
–pct-anyevent 用于设定其他类型事件的百分比,如普通按键消息、不常用的设备按钮事件等生产的百分比。
Adb shell monkey –pct-anyevent 50 –p com.android.calendar –throttle 3000 100
向日历应用发送100次随机事件,每次事件间隔3s,其中设定普通按键消息、不常用的设备按钮事件等占比50%。
–hprof 用于设定monkey特定命令执行前后的性能表现,monkey会在发送事件序列的前后生成性能分析报告,通常会在data/misc目录下生成一个5MB左右的文件。
–ignore-crashes 用于设定monkey指定命令不受应用程序崩溃等异常情况影响。通常情况下monkey会在待测应用崩溃或发生异常后停止运行,指定此参数后可以保证随机事件能够执行完成。例如:
1.adb shell monkey –p com.android.calendar –ignore-crashes 100
向日历应用发送100次随机事件,测试过程中即使应用崩溃,monkey仍会继续发送事件知道事件数目达到100为止。
2. adb shell monkey –p com.android.calendar 100
向日历应用发送100次随机事件,测试过程中如果应用崩溃,monkey就会中断,停止运行。
–ignore-timeouts 用于设定随机事件在出现超时错误情况下指令能够执行完成。通常情况下应用发送任何超时错误(如application not responding)时monkey会停止运行,如果指定了此参数则将会在产生错误信息后继续向系统发送事件,直到指定的事件消息全部完成为止。
Adb shell monkey –p com.android.calendar –ignore-timeouts 100
向日历应用发送100次随机事件,测试过程中如果出现ANR错误,monkey会继续发送事件直到数目达到100为止。
–ignore-security-exceptions 用于设定随机事件在出现访问权限问题情况下可以执行完成。通常情况下应用发送许可错误(如证书许可、网络许可等)monkey会停止运行,指定此参数后monkey可以继续发送事件直至完成。
Adb shell monkey –p com.android.calendar –ignore-security-exceptions 100
向日历应用发送100次随机事件,测试过程中即使出现证书许可错误或网络许可错误等,monkey仍然继续发送事件直至完成100次。
–kill-process-after-error 用于设定发生错误的应用程序进程停止。通常情况下,如果monkey由于一个错误而停止时,出错的应用程序会继续处于运行状态,设置此参数后会通知系统停止发送错误的进程。
注意:当monkey正常执行完后,不会关闭所启动的应用,设备依然保留其最后接收到的消息状态
–monitor-native-crashes 监视并报告android系统本地代码的崩溃事件,如果设置了—kill-process-after-error,系统将停止运行。
–wait-dbg 启动monkey后,先中断其运行,等待调试器和他相连接。
Monkey综合示例:
Adb shell monkey –ignore-crashes –ignore-timeouts –kill-process-after-error –ignore-security-exceptions –throttle 1000 –v –v –v –s 5 1000000
向系统发送1000000次随机事件,各个随机事件的间隔为1s,种子为5,测试过程中忽略相关的安全、超时、崩溃等异常。
【智能POS的monkey测试示例】
logcat -v time > /sdcard/logcat.log &
monkey --ignore-crashes --ignore-timeouts --ignore-security-exceptions --throttle 300 --ignore-native-crashes -s 3614 -v -v -v 1000000000 > /mnt/sdcard/monkey.log 2 > /mnt/sdcard/error.log
Monkey命令
Monkey工具为执行基于android平台的自动化测试提供了途径, 命令可以在java工程代码中用于设计基于Android平台的自动化。脚本源码
DispatchPointer命令
该命令用于向一个坐标点(x,y)发送手势消息。
命令原型 DispatchPointer(long downtime,long eventTime,int action,float x,float y,float pressure,float size,int metaState,float xPrecision,float yPrecision,int device,int edgeFlags)
通常设置前5个参数,其他参数可设为0
Downtime 表示键最初被按下的时间
EventTime 表示事件发生的时间
Action 表示发生消息的类型,0-按下,1-抬起,2-移动
x X坐标
Y Y坐标
Pressure 表示当前事件的压力,范围0-1,0表示完全没有压力,1表示正常压力
Size 表示触摸的近似值,范围0-1
MetaState 表示当前按下的meta键的标识,meta键指的是alt、shift、caps_lock。
XPrecision 表示X坐标的精确值
YPrecision 表示Y坐标精确值
Device 表示事件来源
EdgeFlags 表示边缘的指示,如果有的话该位置会触发位移事件
例如:
1.在坐标为(505,802)的位置发送按下和抬起事件
DispatchPointer(0,0,0,505,802,0,0,0,0,0,0,0)
DispatchPointer(0,1,1,505,802,0,0,0,0,0,0,0)
2.输入手势密码“一”
DispatchPointer(0,0,0,155,476,0,0,0,0,0,0,0)
DispatchPointer(0,0,2,155,476,0,0,0,0,0,0,0)
DispatchPointer(0,0,0,357,474,0,0,0,0,0,0,0)
DispatchPointer(0,0,2,357,474,0,0,0,0,0,0,0)
DispatchPointer(0,0,0,547,485,0,0,0,0,0,0,0)
DispatchPointer(0,0,2,547,485,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,547,485,0,0,0,0,0,0,0)
DispatchTrackball命令
用于向一个坐标点发送跟踪球消息,使用方法和DispatchPointer相同。命令原型除名称外,其余参数与DispatchPointer相同。
DispatchKey命令
用于发送按键消息给指定的设备或模拟器。
命令原型 DispatchKey(long downtime,long eventTime,int action,int code,int repeat,int metaState,int device,int scancode)
Downtime 表示键最初被按下的时间
EventTime 表示事件发生的时间
Action 表示发生消息的类型,0-按下,1-抬起,2-移动
code 表示按键的值
repeat 按键的重复次数
例如,先打开邮件应用,执行如下命令会在邮件正文处输入Abc的操作。
DispatchKey(0,0,0,29,0,0,0,0) // 29是KEYCODE_A
DispatchKey(0,0,1,29,0,0,0,0)
DispatchKey(0,0,0,30,0,0,0,0)
DispatchKey(0,0,1,30,0,0,0,0)
DispatchKey(0,0,0,31,0,0,0,0)
DispatchKey(0,0,1,31,0,0,0,0)
DispatchFlip命令
用于打开或关闭软键盘。原型为DispatchFlip(Boolean keyboardOpen)
LaunchActivity命令
用于启动任意引用的一个活动界面。原型为LaunchActivity(String pkg_name,String cl_name),参数指定为需要启动的应用包名和活动名称。例如,
LaunchActivity(com.yuy.test,com.yuy.test.MainActivity)
LaunchInstrumentation命令
用于运行一个仪表盘测试用例。LaunchInstrumentation(test_name, runner_name),参数指定测试用例名和测试用例类名。
UserWait命令
用于让脚本中断一段时间。原型为UserWait(long sleeptime),单位为ms
RunCmd命令
用于在设备上运行Shell命令,由于Monkey在运行时可以具有超级用户root权限,因此其可以启动任意的命令,包括android系统底层使用的linux命令。原型为RunCmd(cmd)。
例如,RunCmd(monkey –v 1000)
Tap命令
用于模拟一次手指单击事件。原型为Tap(x,y,tapDuration),参数指定横纵坐标和单击的持续时间。
ProfileWait命令
用于等待5s,原型为ProfileWait()。
DeviceWakeUp命令
用于唤醒设备并解锁。原型为DeviceWakeUp()。
DispatchString命令
用于向Shell输入一个字符串,原型为DispatchString(input),参数指定字符串内容。例如,DispatchString(hello)
Monkey脚本执行
Monkey脚本的特殊格式要求:
/** monkey event queue. It takes a script to produce events sample script format:*
- type= raw events
- count= 10
- speed= 1.0
- start data >> <!—即 “start data >>”,相当于monkey事件序列执行语句的入口 -->
- captureDispatchPointer(5109520,5109520,0,230.75429,458.1814,0.20784314,0.06666667,0,0.0,0.0,65539,0)
- captureDispatchKey(5113146,5113146,0,20,0,0,0,0)
- captureDispatchFlip(true)
- …
*/
脚本运行:
先将脚本push至机器目录下(例如/data/)
执行命令adb shell monkey -f data/脚本文件名 -v -v 200
Monkey实例
Monkey脚本的固定部分内容,不需要修改,start data >>大小写敏感,中间仅一个空格
type = raw events
count = 1
speed = 1.0
start data >>
LaunchActivity(com.tencent.mobileqq, com.tencent.mobileqq.activity.SplashActivity) // 启动qq
UserWait(5000) // 等待5s
DispatchPointer(0,0,0,59,332,0,0,0,0,0,0,0) //单击qq号的输入框,使其获得焦点
DispatchPointer(0,0,1,59,332,0,0,0,0,0,0,0)
UserWait(200)
DispatchPress(KEYCODE_1) // 输入qq号12077,延时可避免脚本操作过快使光标位置错乱
UserWait(300)
DispatchPress(KEYCODE_2)
UserWait(300)
DispatchPress(KEYCODE_0)
UserWait(300)
DispatchPress(KEYCODE_7)
UserWait(300)
DispatchPress(KEYCODE_7)
UserWait(300)
DispatchPointer(0,0,0,59,428,0,0,0,0,0,0,0) // 将光标定位到密码输入框
DispatchPointer(0,0,1,59,428,0,0,0,0,0,0,0)
UserWait(200)
DispatchPress(KEYCODE_w) //输入qq密码
UserWait(200)
DispatchPress(KEYCODE_a)
UserWait(200)
DispatchPress(KEYCODE_n)
UserWait(200)
DispatchPress(KEYCODE_g)
UserWait(200)
DispatchPointer(0,0,0,360,612,0,0,0,0,0,0,0) //单击登录按钮
DispatchPointer(0,0,1,360,612,0,0,0,0,0,0,0)
UserWait(200)
1170

被折叠的 条评论
为什么被折叠?



