monkey test 使用笔记

字数 699阅读 7161

Monkey 测试是一种安卓自动化测试,可以用Monkey随机、多次模拟事件来测试应用的负荷程度,并从中获取出错信息,从而优化应用。

  • monkey

monkey的使用比较简单

monkey 命令

adb shell monkey [options] [event-count]
options:这个是配置monkey的设置
event-count: monkey执行的事件数

Monkey命令语法

参数名 基本功能 示例
-p 参数-p用于约束限制,用此参数指定一个或多个包(Package,即App) 。指定包之后,Monkey将只允许系统启动指定的App。如果不指定包,Monkey将允许系统启动设备中的所有APP。 adb shell monkey -p com.sam.demo 100将在Demo包上执行100个随机事件
指定多个包:adb shell monkey -p com.sam.demo –p com.htc.pdfreader -p com.htc.photo.widgets 100
不指定包:adb shell monkey 100:Monkey随机启动APP并发送100个随机事件。
-v 用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别:level0-2 Level 0adb shell monkey -p com.sam.demo –v 100 缺省值,仅提供启动提示、测试完成和最终结果等少量信息;
Level 1adb shell monkey -p com.sam.demo –v -v 100; 提供较为详细的日志,包括每个发送到Activity的事件信息 ;
Level 2adb shell monkey -p com.sam.demo –v -v –v 100 最详细的日志,包括了测试中选中/未选中的Activity信息
-s <seed> 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试产生的时间序列也相同。 adb shell monkey -p com.sam.demo –s 10 100即使执行两次效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的.
--throttle <毫秒> 用于指定用户操作(即事件)间的时延,单位是毫秒 adb shell monkey -p com.sam.demo –-throttle 3000 100
--ignore-crashes 用于指定当应用程序奔溃时(Force & Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序奔溃,Monkey依然会发送事件,直到事件计数完成。 adb shell monkey -p com.sam.demo --ignore-crashes 1000测试过程中即使程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止;
adb shell monkey -p com.sam.demo 1000测试过程中,如果程序崩溃,Monkey将会停止运行。
--ignore-timeouts 用于指定当前应用程序发生ANR(Application No Responding)错误时,Monkey是否停止运行,如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。 类似--ignore-crashes
--ignore-security-exceptions 用于指定当程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发送许可错误,Monkey依然会发送事件,直到事件计数完成 类似--ignore-crashes
--kill-process-after-error 用于指定应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。 类似--ignore-crashes
--monitor-native-crashes 用于指定是否监视并报告应用程序发生崩溃的本地代码 类似--ignore-crashes
--pct- {+事件类别} {+事件类别百分比} 用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数据占总事件数目的百分比) 以下几个
--pct-touch {+百分比} 调整触摸时间的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某个单一位置) adb shell monkey -p com.sam.demo --pct-touch 10 1000
--pct-motion 调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成) adb shell monkey -p com.sam.demo --pct-motion 20 1000
--pct-trackball {+百分比 } 调整轨迹事件的百分比(轨迹事件由一个或者几个随机的移动组成,有时还伴随有点击) adb shell monkey -p com.sam.demo --pct-trackball 30 1000
--pct-nav 调整“基本”导航事件的百分比(导航事件由来自方向输入设备up/down/left/right组成) adb shell monkey -p com.sam.demo --pct-nav 40 1000
--pct-majornav {+百分比} 调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键) adb shell monkey -p com.sam.demo --pct-majornav 50 1000
--pct-syskeys {+百分比} 调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量 adb shell monkey -p com.sam.demo --pct-syskeys 60 1000
--pct-appswitch {+百分比} 调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity adb shell monkey -p com.sam.demo --pct-appswitch 70 1000
--pct-anyevent {+百分比} 调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不正常的设备按钮,等等 指定单个类型事件的百分比:adb shell monkey -p com.sam.demo --pct -anyevent 100 1000
指定多个类型事件的百分比:adb shell monkey -p com.sam.demo --pct-anyevent 50 --pct-appswitch 50 1000
注意:各事件类型的百分比总数不能超过100%
--wait-dbg 停止执行中的Monkey,直到有调试器和它相连接。

以上表格数据来源 http://www.jianshu.com/p/bc59b36bb438
好像没什么卵用,基本上只要adb shell monkey -p com.sam.demo -v 100这句就够用了

日志解析

  1. :Monkey: seed=0 count=100
    :AllowPackage: com.example.myspinner
    :IncludeCategory: android.intent.category.LAUNCHER
    :IncludeCategory: android.intent.category.MONKEY
    seed对应其语法中的第一项(伪随机seed值),count表示执行次数;AllowPackage表示测试的包名;IncludeCategory两个是策略。
  • Seeded: 0** //种子为0**

  • Event percentages:** //事件百分比**

  0:触摸事件百分比,即参数--pct-touch
    1:滑动事件百分比,即参数--pct-motion
    2:缩放事件百分比,即参数--pct-pinchzoom
    3:轨迹球事件百分比,即参数--pct-trackball
    4:屏幕旋转事件百分比
    5:基本导航事件百分比,即参数--pct-nav
    6:主要导航事件百分比,即参数--pct-majornav
    8:Activity启动事件百分比,即参数--pct-appswitch
    9:键盘翻转事件百分比,即参数--pct-flip
    10:其他事件百分比,即参数--pct-anyevent
  • :SendKey (ACTION_DOWN): 59 // KEYCODE_SHIFT_LEFT
    :SendKey (ACTION_UP): 59
    SendKey表示发送的动作(action),ACTION_DOWN表示鼠标按下,ACTION_UP表示鼠标抬起。//后面注释的是按键类型

  • :Sending Pointer ACTION_DOWN x=234.0 y=357.0
    触摸事件,x、y指定触摸的坐标。

  • Events injected: 100
    事件注入成功总数。

  • :Sending rotation degree=0, persist=false
    发送生屏幕翻转 度=0,存留=否

  • :Dropped: keys=0 pointers=3 trackballs=0 flips=0 rotations=0
    丢失情况,按键事件丢失为0,触摸事件丢弃3种,轨迹球事件丢失为0,键盘轻弹丢失0,键盘翻转事件丢失为0。

  • Network stats: elapsed time=3800ms (0ms mobile, 0ms wifi, 3800ms not connected)
    网络状态:占用时间=3800ms(手机0ms,wifi 0ms,未连接3800ms)

  • 使用命令adb shell monkey -p com.sam.demo -v 100 >log.txt 后面的>log.txt可以将日志保存到当前目录下的log.txt文件


随机事件使用结束,好像只能压测用,因为没办法控制,下面介绍配合python脚本进行测试


  • monkeyRunner

monkeyrunner支持,自己编写插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放!

首先千方百计得到一个python脚本

自己写或者网上下载都行,注意!如果脚本文件有使用中文,记得格式保存为utf8,不然会编码格式无法支持错误

#导入我们需要用到的包和类并且起别名
import sys
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
 
#connect device 连接设备
#第一个参数为等待连接设备时间
#第二个参数为具体连接的设备
device = mr.waitForConnection()
if not device:
    print >> sys.stderr,"fail"
    sys.exit(1)
#定义要启动的Activity
componentName='com.sam.sometime/com.sam.sometime.activity.MainActivity'
#启动特定的Activity
device.startActivity(component=componentName)
mr.sleep(3.0)
#do someting 进行我们的操作
#输入 a s d
device.type('asd')
#输入回车
device.press('KEYCODE_ENTER')
#return keyboard 点击返回用于取消等下看到截图的下方的白条
#device.press('KEYCODE_BACK')
#------
#takeSnapshot截图
mr.sleep(3.0)
result = device.takeSnapshot()
 
#save to file 保存到文件
result.writeToFile('D:\\monkeytest\\takeSnapshot\\result1.png','png');

运行 monkeyrunner program.py 注意py文件使用完整路径

运行成功后就可以在看到 result1这张图片了。

一些操作的API

1. #导入模块;
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

2. #连接当前设备,并返回一个MonkeyDevice对象;
    device = MonkeyRunner.waitForConnection()
    if not device:
        print "Please connect a device to start!"
    else:
        print "Start "
    
3. #安装Android包,注意,此方法返回的返回值为boolean,由此可以判断安装过程是否正常 ;
    device.installPackage('myproject/bin/MyApplication.apk') 

4. #启动一个Activity; 
   device.startActivity(component='com.android.htccontacts/com.android.htccontacts.ContactsTabActivity')

5. #截图;
    result = device.takeSnapshot()
    result.writeToFile('C:\\Users\\Martin\\Desktop\\test.png','png')

6. #时延(秒);
    MonkeyRunner.sleep(3)

7. #滑动屏幕;
    for i in range(1,70):
        device.drag((250,850),(250,110),0.1,10)
    for i in range(1,70):
       device.drag((250,110),(250,850),0.1,10)
   MonkeyRunner.sleep(1)

8. #触击屏幕;
    device.touch(507,72,"DOWN_AND_UP")

9. #执行adb shell命令;
    device.shell("input text goup01")

10. #长按的实现 
device(100,100,MonkeyDevice.DOWN)
  MonkeyRunner.sleep(1)
  device(100,100,MonkeyDevice.UP)
  当然,也可以通过drag方法实现:device.drag((100,100),(100,100),1,10)

11. 使用"DOWN_AND_UP"如果可以换成MonkeyDevice.DOWN_AND_UP

网上有通过 MonkeyRecorder进行操作的脚本录制有回放,但是我觉得太卡了,不好用,有兴趣的自行百度

推荐阅读更多精彩内容