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

Monkey

什么是Monkey

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

Monkey的特征

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

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

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

Monkey的基本用法

基本语法如下:

  1. adb shell monkey [options] <event-count>
options event-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个伪随机事件:

  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基本语法

  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无法支持错误

  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. #connect device 连接设备
  7. #第一个参数为等待连接设备时间
  8. #第二个参数为具体连接的设备
  9. device = mr.waitForConnection(1.0,'e0d98451')
  10. if not device:
  11. print >> sys.stderr,"fail"
  12. sys.exit(1)
  13. #定义要启动的Activity
  14. componentName='com.example.simulate/.ShellActivity'
  15. #启动特定的Activity
  16. device.startActivity(component=componentName)
  17. mr.sleep(3.0)
  18. #do someting 进行我们的操作
  19. #输入 helloworld
  20. device.type('helloworld')
  21. #输入回车
  22. device.press('KEYCODE_ENTER')
  23. #return keyboard
  24. #device.press('KEYCODE_BACK')
  25. #------
  26. #takeSnapshot截图
  27. mr.sleep(3.0)
  28. result = device.takeSnapshot()
  29. #save to file 保存到文件
  30. result.writeToFile('./shot1.png','png');

接下来命令行输入:

  1. monkeyrunner testrunner.py

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

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

monkeyRunner 的记录和回放

这才是真正实用的功能,直接看代码,创建一个recoder.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. from com.android.monkeyrunner import MonkeyRunner as mr
  16. from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
  17. device = mr.waitForConnection()
  18. recorder.start(device)

命令行下运行:

  1. monkeyrunner monkey_recorder.py

这时会弹出这样的界面:

按钮以及一些功能说明:

Button Description
Wait 等待时间
Press a Button 发送,MENU,HOME,or SEARCH 按钮.Press,Down,or Up事件
Type Something 发送一些字符串
Fling 用来操作虚拟键盘
Export Action 将我们的脚本导出来
Refresh Display 刷新当前界面

自己随心所以创建一些事件脚本,想做什么就可以做什么,通过MonkeyRecorder这个工具来操作设备界面,事件编辑完后选择Export Actions,导出到我们tools目录下命名为:action.mr

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

  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目录下:

  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. import sys
  16. from com.android.monkeyrunner import MonkeyRunner
  17. # The format of the file we are parsing is very carfeully constructed.
  18. # Each line corresponds to a single command.  The line is split into 2
  19. # parts with a | character.  Text to the left of the pipe denotes
  20. # which command to run.  The text to the right of the pipe is a python
  21. # dictionary (it can be evaled into existence) that specifies the
  22. # arguments for the command.  In most cases, this directly maps to the
  23. # keyword argument dictionary that could be passed to the underlying
  24. # command.
  25. # Lookup table to map command strings to functions that implement that
  26. # command.
  27. CMD_MAP = {
  28. 'TOUCH': lambda dev, arg: dev.touch(**arg),
  29. 'DRAG': lambda dev, arg: dev.drag(**arg),
  30. 'PRESS': lambda dev, arg: dev.press(**arg),
  31. 'TYPE': lambda dev, arg: dev.type(**arg),
  32. 'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)
  33. }
  34. # Process a single file for the specified device.
  35. def process_file(fp, device):
  36. for line in fp:
  37. (cmd, rest) = line.split('|')
  38. try:
  39. # Parse the pydict
  40. rest = eval(rest)
  41. except:
  42. print 'unable to parse options'
  43. continue
  44. if cmd not in CMD_MAP:
  45. print 'unknown command: ' + cmd
  46. continue
  47. CMD_MAP[cmd](device, rest)
  48. def main():
  49. file = sys.argv[1]
  50. fp = open(file, 'r')
  51. device = MonkeyRunner.waitForConnection()
  52. process_file(fp, device)
  53. fp.close();
  54. if __name__ == '__main__':
  55. main()

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

  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

Android的Monkey和MonkeyRunner的更多相关文章

  1. android 测试 Monkey 和 MonkeyRunner 的使用

    一.Monkey的使用 Monkey使用起来比较简单,简而言之就是模拟手机点击效果,随机发送N个点击动作给手机,主要对于程序的稳定和承受压力的测试. 1.首先连接上你的手机或者启动模拟器: 2.运行C ...

  2. Android初体验之Monkey和MonkeyRunner

    原文地址https://blog.csdn.net/mad1989/article/details/38087737 Monkey 什么是Monkey Monkey是Android中的一个命令行工具, ...

  3. Android软件测试Monkey测试工具

    前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.其 ...

  4. Robotium 系列(2) - 简单介绍Monkey和MonkeyRunner

    除了Robotium,Android还有其他的自动化测试方法,比如Monkey和MonkeyRunner. 这里就做一个简单的介绍和使用方法. 本文提纲: 1. Android SDK以及SDK中的工 ...

  5. Android自己的自动化测试Monkeyrunner和用法示例

    眼下android SDK在配有现成的测试工具monkey 和 monkeyrunner两. 也许我们不看一样的兄弟名字.但事实是完全跑了两个完全不同的工具.在测试的不同区域的应用程序.总体,monk ...

  6. Android App 压力测试 monkeyrunner

    Android App 压力测试 第一部分 背景 1. 为什么要开展压力测试? 2. 什么时候开展压力测试?第二部分 理论 1. 手工测试场景 2. 自动测试创建 3. Monkey工具 4. ADB ...

  7. monkey测试===monkeyrunner测试教程(1)

    1.安装测试环境 jdk 安装与配置 android sdk安装与配置 Python编辑器安装与配置 以上安装请自行百度教程 Monkeyrunner使用方法 http://www.android-d ...

  8. Monkey、Monkeyrunner之间的区别

    Monkey.Monkeyrunner之间的区别 一.Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输 ...

  9. Monkey与MonkeyRunner之间的区别

    为了支持黑盒自动化测试的场景,Android SDK提供了monkey和monkeyrunner两个测试工具,这两个测试工具除了名字类似外,还都可以向待测应用发送按键等消息,往往容易产生混淆,以下是他 ...

随机推荐

  1. Tomcat网站上的core和deployer的区别

    8.5.13 Please see the README file for packaging information. It explains what every distribution(分布) ...

  2. pt-archiver使用记录

    pt-archiver使用记录 功能:将MySQL表中的行存档到另一个表或文件中用法:pt-archiver [OPTIONS] --source DSN --where WHERE ; trunca ...

  3. (转载)自然语言处理中的Attention Model:是什么及为什么

    转载说明来源:http://blog.csdn.net/malefactor/article/details/50550211 author: 张俊林 原文写得非常好! 原文: 要是关注深度学习在自然 ...

  4. 苹果CMSv10宝塔全自动定时采集教程

    伙伴们在建立好自己的网站添加自定义资源库后,由于手动采集方式比较耗时间和精力更新也不够及时,是不是特别希望能有一个全自动定时采集方法来帮助网站增加视频资源解放自己的双手,那么现在就教大家如何用宝塔一步 ...

  5. (一)SQL -- 基础知识

    SQL是一个标准的数据库语言,是面向集合的描述性非过程化语言. 优点:功能强.效率高.简单易学易维护. 缺点:非过程化语言,大多数语言都是独立执行,与上下文无关,而大多数 应用都是一个完整的过程,显然 ...

  6. CentOS7修改计算机名!

    https://www.cnblogs.com/acgpiano/p/4170546.html sudo hostnamectl set-hostname <host-name>

  7. squid的处理request和reply的流程

    request处理: Breakpoint , SQUID_MD5Final ( digest= { (gdb) bt # SQUID_MD5Final ( digest= # ) at store_ ...

  8. url的匹配问题

    1.例如我当前访问的路径是 127.0.0.1:8000/app01/customer/ 此时我需要在这个界面跳转另外一个界面127.0.0.1:8000/app02/books/,于是我定义一个a标 ...

  9. autoprefixer不起作用的坑

    概述 今天同事说,nuxt.js的项目好像没有自动加前缀,我花了很长时间查找原因,最后终于发现,原来是没有加.browserslistrc文件...记录下来,供以后开发时参考,相信对其他人也有用. b ...

  10. datalist的模板里的label要绑定一个函数

    列下如何在前台绑定数据时呼叫後台方法 如下GetInfoByID是后台方法,Eval("ID").ToString()是你在前台绑定数据传入的字段名 <asp:Label I ...