转-Android初体验之Monkey和MonkeyRunner

来源:互联网 发布:java 启动定时器 编辑:程序博客网 时间:2024/06/05 15:14

转载自-Never-say-Never

仅作学习用。


本文部分解释性语段摘自网络百科或其它BLOG,语句内容网络随处可见,也不知道谁是初始原创,便不再署名出处,如有雷同,还请见谅。


Monkey


 什么是Monkey


Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。


 Monkey的特征

1、 测试的对象仅为应用程序包,有一定的局限性。

2、 Monky测试使用的事件流数据流是随机的,不能进行自定义。

3、 可对Test的对象,事件数量,类型,频率等进行设置。

Monkey的基本用法

基本语法如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. adb shell monkey [options] <event-count>  


optionsevent-count这个是配置monkey的设置,例如,指定启动那个包,不指定将会随机启动所有程序这个是让monkey发送多少次事件

详细的monkey介绍,和options的参数请查看 (http://developer.android.com/guide/developing/tools/monkey.html)

如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。


Monkey测试的停止条件

 
1、如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。

2、如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。

3、如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。


实例

下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. adb shell monkey -p your.package.name -vvv 500 > monkeytest.txt  

-p表示对象包  -v 为 verbose的缩写(信息级别就是日志的详细程度),就是详细输出事件等级,这个3个v就是输出等级1至3的所有事件.(使用管道命令将输出结果放到一个文本里面方便查看)


举例:

eclipse连接真机设备,Window打开CMD,命令行输入:adb shell,进入shell界面后:


我运行的是手机上的 计算器 程序,具体你可以指定自己的APP包名就可以了~

真机效果:


如图所示,它真的就是随机输入数值,随机按钮,随机.....的...................缺点是我们不能控制触摸或按钮事件,接下来MonkeyRunner就要登场了~




MonkeyRunner


什么是monkeyrunner

monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件。


monkeyrunner同monkey的区别

Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。monkeyrunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器,它支持,自己编写插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放。


monkeyrunner的测试类型

1、多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。

2、 功能测试: monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。

3、 回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。

4、 可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API之外,您还可以使用标准的Python os和subprocess模块来调用Android Debug Bridge这样的Android工具。


运行monkeyrunner

您可以直接使用一个代码文件运行monkeyrunner,抑或在交互式对话中输入monkeyrunner语句。不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。如果您提供一个文件名作为运行参数,则monkeyrunner将视文件内容为Python程序,并加以运行;否则,它将提供一个交互对话环境。


monkeyrunner基本语法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>  


具体介绍…看官方文档(http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html)


实例

连接真机(模拟器),打开CMD,进入:E:\android-sdk-windows\tools文件夹内(里面有monkeyrunner.bat)

创建一个Python脚本文件:testrunner.py,内容如下:

注意!如果monkeyrunner脚本文件要使用中文,记得格式保存为utf8,不然会ASCNII无法支持错误

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #导入我们需要用到的包和类并且起别名  
  2. import sys  
  3. from com.android.monkeyrunner import MonkeyRunner as mr  
  4. from com.android.monkeyrunner import MonkeyDevice as md  
  5. from com.android.monkeyrunner import MonkeyImage as mi  
  6.    
  7. #connect device 连接设备  
  8. #第一个参数为等待连接设备时间  
  9. #第二个参数为具体连接的设备  
  10. device = mr.waitForConnection(1.0,'e0d98451')  
  11. if not device:  
  12.     print >> sys.stderr,"fail"  
  13.     sys.exit(1)  
  14. #定义要启动的Activity  
  15. componentName='com.example.simulate/.ShellActivity'  
  16. #启动特定的Activity  
  17. device.startActivity(component=componentName)  
  18. mr.sleep(3.0)  
  19. #do someting 进行我们的操作  
  20. #输入 helloworld  
  21. device.type('helloworld')  
  22. #输入回车  
  23. device.press('KEYCODE_ENTER')  
  24. #return keyboard  
  25. #device.press('KEYCODE_BACK')  
  26. #------  
  27. #takeSnapshot截图  
  28. mr.sleep(3.0)  
  29. result = device.takeSnapshot()  
  30.    
  31. #save to file 保存到文件  
  32. result.writeToFile('./shot1.png','png');  


接下来命令行输入:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. monkeyrunner testrunner.py  


这是一个小的脚本文件,主要是启动com.example.simulate包名下的ShellActivity界面,接下来按下Enter按钮,最后截屏,并保存在当前目录下为shot1.png,可以在toosl文件夹下查看。


这个脚本的实质就是一个python脚本,懂python的朋友,可以利用这个实现非常强悍的功能~~~~~~~~~~~~~~~~~~~~~~~~



monkeyRunner 的记录和回放

这才是真正实用的功能,直接看代码,创建一个recoder.py:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #!/usr/bin/env monkeyrunner  
  2. # Copyright 2010, The Android Open Source Project  
  3. #  
  4. # Licensed under the Apache License, Version 2.0 (the "License");  
  5. # you may not use this file except in compliance with the License.  
  6. # You may obtain a copy of the License at  
  7. #  
  8. #     http://www.apache.org/licenses/LICENSE-2.0  
  9. #  
  10. # Unless required by applicable law or agreed to in writing, software  
  11. # distributed under the License is distributed on an "AS IS" BASIS,  
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  13. # See the License for the specific language governing permissions and  
  14. # limitations under the License.  
  15.   
  16. from com.android.monkeyrunner import MonkeyRunner as mr  
  17. from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder  
  18.   
  19. device = mr.waitForConnection()  
  20. recorder.start(device)  

命令行下运行:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. monkeyrunner monkey_recorder.py  

这时会弹出这样的界面:


按钮以及一些功能说明:

ButtonDescriptionWait等待时间Press a Button发送,MENU,HOME,or SEARCH 按钮.Press,Down,or Up事件Type Something发送一些字符串Fling用来操作虚拟键盘 
imageExport Action将我们的脚本导出来Refresh Display刷新当前界面
自己随心所以创建一些事件脚本,想做什么就可以做什么,通过MonkeyRecorder这个工具来操作设备界面,事件编辑完后选择Export Actions,导出到我们tools目录下命名为:action.mr

我们看一下工具生成的action.mr脚本,如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. TOUCH|{'x':297,'y':533,'type':'downAndUp',}  
  2. WAIT|{'seconds':2.0,}  
  3. TOUCH|{'x':136,'y':278,'type':'downAndUp',}  
  4. WAIT|{'seconds':2.0,}  
  5. TOUCH|{'x':123,'y':356,'type':'downAndUp',}  
  6. WAIT|{'seconds':10.0,}  
  7. PRESS|{'name':'HOME','type':'downAndUp',}  
  8. WAIT|{'seconds':2.0,}  
  9. TOUCH|{'x':235,'y':720,'type':'downAndUp',}  
  10. WAIT|{'seconds':2.0,}  
  11. TOUCH|{'x':303,'y':630,'type':'downAndUp',}  
  12. WAIT|{'seconds':2.0,}  
  13. TOUCH|{'x':16,'y':71,'type':'downAndUp',}  
  14. WAIT|{'seconds':2.0,}  
  15. TOUCH|{'x':244,'y':735,'type':'downAndUp',}  



然后需要制作一个运行这一系列动作的脚本:monkey_playback.py,保存到tools目录下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #!/usr/bin/env monkeyrunner  
  2. # Copyright 2010, The Android Open Source Project  
  3. #  
  4. # Licensed under the Apache License, Version 2.0 (the "License");  
  5. # you may not use this file except in compliance with the License.  
  6. # You may obtain a copy of the License at  
  7. #  
  8. #     http://www.apache.org/licenses/LICENSE-2.0  
  9. #  
  10. # Unless required by applicable law or agreed to in writing, software  
  11. # distributed under the License is distributed on an "AS IS" BASIS,  
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  13. # See the License for the specific language governing permissions and  
  14. # limitations under the License.  
  15.   
  16. import sys  
  17. from com.android.monkeyrunner import MonkeyRunner  
  18.   
  19. # The format of the file we are parsing is very carfeully constructed.  
  20. # Each line corresponds to a single command.  The line is split into 2  
  21. # parts with a | character.  Text to the left of the pipe denotes  
  22. # which command to run.  The text to the right of the pipe is a python  
  23. # dictionary (it can be evaled into existence) that specifies the  
  24. # arguments for the command.  In most cases, this directly maps to the  
  25. # keyword argument dictionary that could be passed to the underlying  
  26. # command.   
  27.   
  28. # Lookup table to map command strings to functions that implement that  
  29. # command.  
  30. CMD_MAP = {  
  31.     'TOUCH': lambda dev, arg: dev.touch(**arg),  
  32.     'DRAG': lambda dev, arg: dev.drag(**arg),  
  33.     'PRESS': lambda dev, arg: dev.press(**arg),  
  34.     'TYPE': lambda dev, arg: dev.type(**arg),  
  35.     'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)  
  36.     }  
  37.   
  38. # Process a single file for the specified device.  
  39. def process_file(fp, device):  
  40.     for line in fp:  
  41.         (cmd, rest) = line.split('|')  
  42.         try:  
  43.             # Parse the pydict  
  44.             rest = eval(rest)  
  45.         except:  
  46.             print 'unable to parse options'  
  47.             continue  
  48.   
  49.         if cmd not in CMD_MAP:  
  50.             print 'unknown command: ' + cmd  
  51.             continue  
  52.   
  53.         CMD_MAP[cmd](device, rest)  
  54.   
  55.   
  56. def main():  
  57.     file = sys.argv[1]  
  58.     fp = open(file, 'r')  
  59.   
  60.     device = MonkeyRunner.waitForConnection()  
  61.       
  62.     process_file(fp, device)  
  63.     fp.close();  
  64.       
  65.   
  66. if __name__ == '__main__':  
  67.     main()  


接下来运行我们的保存的脚本,然后,你就看到真机(模拟器),进行你刚才一样的操作~

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. E:\android-sdk-windows\tools>monkeyrunner monkey_playback.py action.mr  


我的脚本是执行一些press down 和press up动作,同时会有延迟,之后按下home按钮,最后打开桌面的短信程序,并打开某一条信息~是不是有点像按键精灵的感觉?但是得依靠命令行执行脚本~~~


至此,monkey和monkeyrunner介绍完毕。


附件传送门地址,网上一位朋友写好的常用的recorder、playback脚本,包括我以上所列py,你可以自己看着修改,别人的资源,免费共享:

http://download.csdn.net/detail/mad1989/7674089

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝出生17天睡眠不安稳怎么办 月子里宝宝睡觉老是睡不安稳怎么办 孕妇晚期咳嗽鼻涕黄咽喉痛怎么办 狗狗流脓鼻涕拉稀没食欲怎么办 孕妇眼睛充血很快就有眼屎怎么办 婴儿的眼睛流泪生眼屎怎么办呀 刚出生的婴儿眼睛有眼屎怎么办 25天的婴儿鼻子有鼻屎不通怎么办 一个月的宝宝好多鼻屎怎么办 隆鼻取线的时候好多鼻屎怎么办 小孩流浓鼻涕怎么办最简单方法 小孩流黄鼻涕怎么办最简单方法 一岁八个月宝宝鼻涕和痰多怎么办 空调铜管过不了预埋管的弯头怎么办 如果朝鲜和韩国打起来中国怎么办 寄信时不知道对方的邮编怎么办 地下钱庄转账后银行户被冻结怎么办 老师遇到素质极差的垃圾学生怎么办 验证码忘了手机号也换了怎么办 手机上的验证码忘了怎么办 进入医联网的验证码忘了怎么办 育碧换电脑了无法同步云存档怎么办 刺客信条起源育碧需要激活码怎么办 电脑连不上网怎么办wifi可以用 电脑登录账号密码错误锁定了怎么办 白色T恤衫上沾上黑色的黄油怎么办 家教遇到成绩好的学生该怎么办 跟越南人离婚孩子中国户口9怎么办 老婆是个越南人至今没户口怎么办 等离子屏z板链接处排线打火怎么办 等离子自动调焊的成形不好怎么办 村里内村道路中间被抢占了怎么办 华为换电池之后卡没反应怎么办 汽车钥匙换电池后没反应怎么办 汽车解锁换电池后没反应怎么办 包裹显示待收件人向海关申报怎么办 在越南签证被公安扣了怎么办 酷派手机收不到验证码怎么办 苹果想把图片上的字盖上怎么办 婴儿自己把眼珠子抠红了怎么办 如果美陆战队员进入台湾那怎么办?