adb shell monkey -p com.ajb.sp -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > E:\MonkeyTest\monkey_log.txt adb shell monkey -p com.ykq.anjubao_yunkaoqin -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 500 > E:\MonkeyTest\monkey_log.txt
adb shell ps: 查询进程名html
程序编写完成后进行测试必定是必不可少的,Android Sdk给咱们提供了Monkey和Monkeyrunner这两个自动化测试工具。时光境迁,随着版本的不断更新迭代,Monkey和Monkeyrunner也在不断的改变,改变的速度甚至已经到了官方文档有时都跟不上了,这无疑给咱们的学习带来不少困扰。python
今天我把我近期使用Monkey和Monkeyrunner的一些体会与你们分享,Sdk版本为Rev22.01,Api17(4.22).android
Monkey是一个命令行工具,能够运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。Monkey包括许多选项,它们大体分为四大类:
· 基本配置选项,如设置尝试的事件数量。
· 运行约束选项,如设置只对单独的一个包进行测试。
· 事件类型和频率。
· 调试选项。shell
基本语法以下:express
$ adb shell monkey [options]<event-count>
若是不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的所有包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:apache
$ adb shell monkey -p your.package.name -v 500
一些经常使用的参数信息:编程
-v 命令行的每个-v将增长反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果以外,提供较少信息。Level 1提供较为详细的测试信息,如逐个发送到Activity的事件。Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。 事件 -s <seed> 伪随机数生成器的seed值。若是用相同的seed值再次运行Monkey,它将生成相同的事件序列。 --throttle <milliseconds> 在事件之间插入固定延迟。经过这个选项能够减缓Monkey的执行速度。若是不指定该选项,Monkey将不会被延迟,事件将尽量快地被产成。 --pct-touch <percent> 调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。 --pct-motion <percent> 调整动做事件的百分比(动做事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。 --pct-trackball <percent> 调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。 --pct-nav <percent> 调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。 --pct-majornav <percent> 调整“主要”导航事件的百分比(这些导航事件一般引起图形界面中的动做,如:5-way键盘的中间按键、回退按键、菜单按键) --pct-syskeys <percent> 调整“系统”按键事件的百分比(这些按键一般被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。 --pct-appswitch <percent> 调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,做为最大程度覆盖包中所有Activity的一种方法。 --pct-anyevent <percent> 调整其它类型事件的百分比。它包罗了全部其它类型的事件,如:按键、其它不经常使用的设备按钮、等等。 约束限制 -p <allowed-package-name> 若是用此参数指定了一个或几个包,Monkey将只容许系统启动这些包里的Activity。若是你的应用程序还须要访问其它包里的Activity(如选择取一个联系人),那些包也须要在此同时指定。若是不指定任何包,Monkey将容许系统启动所有包里的Activity。要指定多个包,须要使用多个 -p选项,每一个-p选项只能用于一个包。 -c <main-category> 若是用此参数指定了一个或几个类别,Monkey将只容许系统启动被这些类别中的某个类别列出的Activity。若是不指定任何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,须要使用多个-c选项,每一个-c选 项只能用于一个类别。 调试 --dbg-no-events 设置此选项,Monkey将执行初始启动,进入到一个测试Activity,而后不会再进一步生成事件。为了获得最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,能够监视应用程序所调用的包之间的转换。 --hprof 设置此选项,将在Monkey事件序列以前和以后当即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),因此要当心使用它。 --ignore-crashes 一般,当应用程序崩溃或发生任何失控异常时,Monkey将中止运行。若是设置此选项,Monkey将继续向系统发送事件,直到计数完成。 --ignore-timeouts 一般,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将中止运行。若是设置此选项,Monkey将继续向系统发送事件,直到计数完成。 --ignore-security-exceptions 一般,当应用程序发生许可错误(如启动一个须要某些许可的Activity)时,Monkey将中止运行。若是设置了此选项,Monkey将继续向系统发送事件,直到计数完成。 --kill-process-after-error 一般,当Monkey因为一个错误而中止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统中止发生错误的进程。注意,正常的(成功的)结束,并无中止启动的进程,设备只是在结束事件以后,简单地保持在最后的状态。 --monitor-native-crashes 监视并报告Android系统中本地代码的崩溃事件。若是设置了--kill-process-after-error,系统将中止运行。 --wait-dbg 中止执行中的Monkey,直到有调试器和它相链接。-v 命令行的每个-v将增长反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果以外,提供较少信息。Level 1提供较为详细的测试信息,如逐个发送到Activity的事件。Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。 事件 -s <seed> 伪随机数生成器的seed值。若是用相同的seed值再次运行Monkey,它将生成相同的事件序列。 --throttle <milliseconds> 在事件之间插入固定延迟。经过这个选项能够减缓Monkey的执行速度。若是不指定该选项,Monkey将不会被延迟,事件将尽量快地被产成。 --pct-touch <percent> 调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。 --pct-motion <percent> 调整动做事件的百分比(动做事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。 --pct-trackball <percent> 调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。 --pct-nav <percent> 调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。 --pct-majornav <percent> 调整“主要”导航事件的百分比(这些导航事件一般引起图形界面中的动做,如:5-way键盘的中间按键、回退按键、菜单按键) --pct-syskeys <percent> 调整“系统”按键事件的百分比(这些按键一般被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。 --pct-appswitch <percent> 调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,做为最大程度覆盖包中所有Activity的一种方法。 --pct-anyevent <percent> 调整其它类型事件的百分比。它包罗了全部其它类型的事件,如:按键、其它不经常使用的设备按钮、等等。 约束限制 -p <allowed-package-name> 若是用此参数指定了一个或几个包,Monkey将只容许系统启动这些包里的Activity。若是你的应用程序还须要访问其它包里的Activity(如选择取一个联系人),那些包也须要在此同时指定。若是不指定任何包,Monkey将容许系统启动所有包里的Activity。要指定多个包,须要使用多个 -p选项,每一个-p选项只能用于一个包。 -c <main-category> 若是用此参数指定了一个或几个类别,Monkey将只容许系统启动被这些类别中的某个类别列出的Activity。若是不指定任何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,须要使用多个-c选项,每一个-c选 项只能用于一个类别。 调试 --dbg-no-events 设置此选项,Monkey将执行初始启动,进入到一个测试Activity,而后不会再进一步生成事件。为了获得最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,能够监视应用程序所调用的包之间的转换。 --hprof 设置此选项,将在Monkey事件序列以前和以后当即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),因此要当心使用它。 --ignore-crashes 一般,当应用程序崩溃或发生任何失控异常时,Monkey将中止运行。若是设置此选项,Monkey将继续向系统发送事件,直到计数完成。 --ignore-timeouts 一般,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将中止运行。若是设置此选项,Monkey将继续向系统发送事件,直到计数完成。 --ignore-security-exceptions 一般,当应用程序发生许可错误(如启动一个须要某些许可的Activity)时,Monkey将中止运行。若是设置了此选项,Monkey将继续向系统发送事件,直到计数完成。 --kill-process-after-error 一般,当Monkey因为一个错误而中止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统中止发生错误的进程。注意,正常的(成功的)结束,并无中止启动的进程,设备只是在结束事件以后,简单地保持在最后的状态。 --monitor-native-crashes 监视并报告Android系统中本地代码的崩溃事件。若是设置了--kill-process-after-error,系统将中止运行。 --wait-dbg 中止执行中的Monkey,直到有调试器和它相链接。
Monkey的详细参数信息能够在这里查看http://developer.android.com/tools/help/monkey.html,这里就再也不累述了。app
Windows下(注:2—4步是为了查看咱们能够测试哪些应用程序包,可省略):框架
一、 经过eclipse启动一个Android的emulatorless
二、 在命令行中输入:adb devices查看设备链接状况
C:\Documents and Settings\Administrator>adb devices List of devices attached emulator-5554 device
三、 在有设备链接的前提下,在命令行中输入:adb shell 进入shell界面
C:\Documents and Settings\Administrator>adb shell
四、 查看data/data文件夹下的应用程序包。注:咱们能测试的应用程序包都在这个目录下面
C:\Documents and Settings\Administrator>adb shell
如:
com.android.htmlviewer
com.android.settings
com.android.netspeed
com.android.providers.userdictionary
com.android.browser
com.android.contacts
com.android.alarmclock
等
5.在其中找到咱们须要测试的包名com.marshalchen.MonkeyTest1
六、 以com.marshalchen.MonkeyTest1 做为对象进行MonkeyTest
#monkey -p com.marshalchen.MonkeyTest1 -v 500
其中-p表示对象包 –v 表示事件数量
运行过程当中,Emulator中的应用程序在不断地切换画面。
按照选定的不一样级别的反馈信息,在Monkey中还能够看到其执行过程报告和生成的事件。
如:Sending Pointer ACTION_DOWN x=35.0 y=259.0
:Sending Pointer ACTION_UP x=195.0 y=259.0
:Sending Pointer ACTION_DOWN x=295.0 y=223.0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0
等等信息。
Monkey Test执行过程当中在下列三种状况下会自动中止:
一、若是限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操做,并对其进行阻止。
二、若是应用程序崩溃或接收到任何失控异常,Monkey将中止并报错。
三、若是应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会中止并报错。
经过屡次而且不一样设定下的Monkey测试才算它是一个稳定性足够的程序。
Monkey的使用简洁有效,可是老是给人感受功能不够强大。因此,接下来向你们介绍很是给力的工具MonkeyRunner。
monkeyrunner工具提供了一个API,使用此API写出的程序能够在Android代码以外控制Android设备和模拟器。经过monkeyrunner,您能够写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工做站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您固然也能够将其用于其它目的。
monkeyrunner工具与monkey工具并没有关联。monkey工具直接运行在设备或模拟器的adbshell中,生成用户或系统的伪随机事件流。而monkeyrunner工具则是在工做站上经过API定义的特定命令和事件控制设备或模拟器。
monkeyrunner工具为Android测试提供了如下特性:
1.多设备控制:monkeyrunner API能够跨多个设备或模拟器实施测试套件。您能够在同一时间接上全部的设备或一次启动所有模拟器(或通通一块儿),依据程序依次链接到每个,而后运行一个或多个测试。您也能够用程序启动一个配置好的模拟器,运行一个或多个测试,而后关闭模拟器。
2.功能测试: monkeyrunner能够为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,而后观察输出结果的截屏。
3.回归测试:monkeyrunner能够运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。
4.可扩展的自动化:因为monkeyrunner是一个API工具包,您能够基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API以外,您还可使用标准的Python os和subpress模块来调用如adb这样的Android工具。
您还能够向monkeyrunner API中添加您本身的类。
monkeyrunner工具使用Jython(使用Java编程语言的一种Python实现)。Jython容许monkeyrunnerAPI与Android框架轻松的进行交互。使用Jython,您可使用Python语法来获取API中的常量、类以及方法。
MonkeyRunner的参考文献在这里:http://developer.android.com/tools/help/monkeyrunner_concepts.html
您能够直接使用一个代码文件运行monkeyrunner,抑或在交互式对话中输入monkeyrunner语句。不论使用哪一种方式,您都须要调用SDK目录的tools子目录下的monkeyrunner命令。若是您提供一个文件名做为运行参数,则monkeyrunner将视文件内容为Python程序,并加以运行;不然,它将提供一个交互对话环境。
monkeyrunner的命令语法为:
monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>
monkeyrunnerbasic.py:
# 导入此程序所需的monkeyrunner模块 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice # 链接当前设备,返回一个MonkeyDevice对象 device = MonkeyRunner.waitForConnection() # 安装Android包,注意,此方法返回的返回值为boolean,由此您能够判断安装过程是否正常 device.installPackage('myproject/bin/MyApplication.apk') # 运行此应用中的一个活动device.startActivity(component='com.marshalchen.Monkeyrunner.MainActivity') # 按下菜单按键 device.press('KEYCODE_MENU','DOWN_AND_UP') # 截取屏幕截图 result = device.takeSnapShot # 将截图保存至文件 result.writeToFile('myproject/shot1.png','png')
而后转到$SDK\TOOLS下执行 monkeyrunner monkeyrunnerbasic.py 就可执行测试了。
PS:上述内容,部分参考了 子杨 的博客,在此表示感谢。
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(1.0,'emulator-5554') if not device: print >> sys.stderr,"fail" sys.exit(1) #定义要启动的Activity componentName='kg.monkey/.MonkeyActivity' #启动特定的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('takeSnapshot\\result1.png','png');
利用
1. <span style="font-family:SimSun;">monkeyrunner monkey_recorder.py</span>
脚本,能够打开如图所示可视化模拟器,各类操做能够显示在屏幕右侧,而且经过“Export Actions”导出。
导出以后能够运行monkeyrunner monkey_playback.py monkey_test1.mr,(monkey_test1.mr为刚才保存的脚本),这时能够看到模拟器,进行刚才同样的操做。
补充多设备操做:能够在monkey_playback.py中的main()方法的device设备获取时指定多设备。
下面是这两个有用的脚本:
monkey_recorder.py:
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) monkey_playback.py: 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()
PS:脚本内容 部分参考了 youxilua ,很是感谢。
您能够用Java语言建立新的类,并打包成一个或多个.jar
文件,以此来扩展monkeyrunnerAPI。您可使用您本身写的类或者继承现有的类来扩展monkeyrunnerAPI。您还可使用此功能来初始化monkeyrunner环境。
为了使monkeyrunner加载一个插件,您应当如使用如表1中所述的-plugin
参数来调用monkeyrunner
命令。
在您编写的插件中,您能够导入或继承位于com.android.monkeyrunner
包中的几个主要的monkeyrunner类:MonkeyDevice
, MonkeyImage
和MonkeyRunner.
请注意,插件没法让你访问
Android
的
SDK
。您不能导入
com.android.app
等包。这是由于
monkeyrunner
是在框架
API
层次之下与设备或模拟器进行交互的。
用于插件的.jar
文件能够指定一个类,使其在脚本执行以前就实例化。如欲指定这个类,您须要在.jar
文件的manifest中添加键MonkeyRunnerStartupRunner
。其值为启动时运行的类的名称。如下代码段显示了如何在一个ant
构建脚本达到这样的目的:
如欲访问
monkeyrunner
的运行时环境,启动类能够实现
com.google.common.base.Predicate
。例如,用这个类在默认的命名空间中设置一些变量:
1.
package com.android.example; 2. 3. import com.google.common.base.Predicate; 4. import org.python.util.PythonInterpreter; 5. 6. public class Main implements Predicate { 7. @Override 8. public boolean apply(PythonInterpreter anInterpreter) { 9. 10. /* 11. * Examples of creating and initializing variables in the monkeyrunner environment's 12. * namespace. During execution, the monkeyrunner program can refer to the variables "newtest" 13. * and "use_emulator" 14. * 15. */ 16. anInterpreter.set("newtest", "enabled"); 17. anInterpreter.set("use_emulator", 1); 18. 19. return true; 20. } 21. }
1.“device.touch(10,100, 'DOWN_AND_UP')” 为何报错?
ANS:能够把 'DOWN_AND_UP' 替换为 'MonkeyDevice.DOWN_AND_UP' ,这个问题的主要缘由跟Monkeyrunner有关。
2.我输入了不少指令,可是不少没有执行
Ans:能够尝试 MonkeyRunner.sleep(time_in_seconds) 方法,让不一样的动做之间有间隔。