monkey test 使用笔记

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进行操作的脚本录制有回放,但是我觉得太卡了,不好用,有兴趣的自行百度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • Monkey是Android SDK自带的测试工具,在实际应用中经常有公司用来做一些APP的稳定性测试,由于测试事...
    CC先生之简书阅读 8,259评论 0 21
  • Monkey概念介绍 Monkey是猴子的意思。Monkey测试,就像一只猴子,在电脑面前,乱敲键盘在测试。猴子什...
    正规程序员阅读 3,433评论 0 50
  • monkey 测试 读书笔记 1. monkey 的基本使用 monkey文档官方网址:https://devel...
    csmijo阅读 8,508评论 0 23
  • monkey 介绍 Monkey是Google提供的一个用于稳定性与压力测试的命令行工具。可以运行在模拟器或者实际...
    望月成三人阅读 14,402评论 2 12
  • 她想要的是一个小小生命里的大轰烈,干嘛要接受一个七十分的男生呢?。她想要个心上人,那个人的爱会比她的生命悠长...
    槿絮阅读 86评论 0 0