第5章1节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 官方简介(原创)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://techgogogo.blog.csdn.net/article/details/44120667

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。

在MonkeyRunner的框架中,Monkey是作为一个服务来接受来自MonkeyRunner客户端发送过来的命令,然后针对每条命令请求进行相应的处理,所以它并不是作为一个随机压力测试的工具来运作。本书中的Monkey原理描述也不会把重点放在其作为压力测试工具这个方面,而是主要放在它是怎么作为MonkeyRunner的一个服务上。我相信这样已经足够了,因为这两种不同的运行方式只是事件的来源不一样而已,比如直接提供命令行参数选项运行时候的事件源是来自于Monkey自身的算法产生的伪随机事件流;而作为MonkeyRunner服务运行时候的事件源是来自网络MonkeyRunner客户端发送过来的字串格式事件命令。只要了解清楚来自网络的事件源在Monkey中是怎么处理的,那么就可以以点带面很快熟的清楚来自其他事件源的处理方式了。

这个小节中我们先看下来自Google官方对Monkey的简要介绍,好让没有接触过的读者有个基本的概念,这样才方便我们往下进行分析。

Monkey是一个运行在Android目标机器的一个应用,是一个基于命令行的应用界面测试工具,它可以独立的运行。根据用户提供的参数,它会根据算法自动生成不同用户事件的伪随机流来驱动测试的进行,比如点击,触控,手势,以及一些系统级别的事件,然后把这些事件发送到Android操作系统来触发事件的发生。用户可以使用Monkey来对你正在开发的应用以一种随机但可复用的方式进行压力测试。

Monkey支持一系列的参数选项来运行,但总的来所可以把这些选项划分成以下四个基本类别:

  • 基本配置选项: 比如配置将要测试的事件的数量
  • 运行约束选项: 如设置只对单独的一个包进行测试
  • 事件类型和频率:比如手势事件占所有随机产生事件的30%,点击占50%,触控占20%
  • 调试选项

在Monkey运行的时候,它将会根据输入选项生成相应的事件,然后把它们注入到安卓操作系统。同时Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理:

  • 如果设置了约束,限定了Monkey运行在一个或几个指定的包上,那么它会捕获并阻止试图浏览到其它包的操作
  • 如果应用程序崩溃或接收到任何没有处理的异常,Monkey将停止运行并报告相应的错误
  • 如果应用程序产生了“应用程序没有响应”的错误, Monkey将停止运行并报告相应的错误

根据用户选定的不同级别的反馈信息,用户可以看到Monkey的执行进度以及事件正在生成的进度。

用户可以通过在开发机器上的命令行或脚本来启动Monkey。由于Monkey运行在安卓模拟器/设备环境中,所以必须在其shell环境中启动。可以通过在每条命令前加上”adb shell”来实现,也可以在进入Shell后直接输入Monkey命令。基本语法如下:

$ adb shell monkey [options] 

如果不指定任何选项(options),Monkey将以静默模式启动,并会把事件发送到Android目标机器上已经安装的所有应用的任意一些包。以下是一个更典型的示例,它启动指定的应用程序,并向其发送500个伪随机事件:

$ adb shell monkey -p your.package.name -v 500

以下列出网上同行翻译的Monkey支持的所有选项以供参考,我这里就不做重造轮子的事情了:

表5-1-1 Monkey命令行选项
表5-1-1 Monkey命令行选项
表5-1-1 Monkey命令行选项2
表5-1-1 Monkey命令行选项3
表5-1-1 Monkey命令行选项4
表5-1-1 Monkey命令行选项5

——— 未完待续———


作者:天地会珠海分舵
微信公众号:TechGoGoGo
微博:http://weibo.com/techgogogo
CSDN:http://blog.csdn.net/zhubaitian

展开阅读全文

求助,monkeymonkeyrunner相关

02-13

最近研究了一下monkeyrunner的源码,发现它其实是依赖chimpchat实现的,跟了一下代码,最主要的原理就是在使用了adb forward和adb shell monkey --port两个命令后,通过socket将自定义格式的命令从PC端发送给设备上的monkey,让monkey去执行。对应的代码在MonkeySourceNetwork和MonkeySourceNetworkViews两个类中。rnSDK文档说The monkeyrunner tool is not related to the UI/Application Exerciser Monkey,其实他们两个关系非常密切。rn我直接在命令行执行forward和monkey --port命令后,用telnet去输入那些命令,这里就遇到问题了,像press,touch,key这些命令都能执行并得到回馈,但是如果执行listviews或者queryview这样的命令,就会没反应,如果是直接调试PC端这边的chimpchat,可以发现这边的代码是一直阻塞在readLine()方法。rn想请教一下高手,有些命令为什么直接在telnet里面无法执行,是还需要其他的命令还配合还是什么?rn下面是命令列表,大家可以试一下[code=Java]static rn // Add in all the commands we supportrn COMMAND_MAP.put("flip", new FlipCommand());rn COMMAND_MAP.put("touch", new TouchCommand());rn COMMAND_MAP.put("trackball", new TrackballCommand());rn COMMAND_MAP.put("key", new KeyCommand());rn COMMAND_MAP.put("sleep", new SleepCommand());rn COMMAND_MAP.put("wake", new WakeCommand());rn COMMAND_MAP.put("tap", new TapCommand());rn COMMAND_MAP.put("press", new PressCommand());rn COMMAND_MAP.put("type", new TypeCommand());rn COMMAND_MAP.put("listvar", new MonkeySourceNetworkVars.ListVarCommand());rn COMMAND_MAP.put("getvar", new MonkeySourceNetworkVars.GetVarCommand());rn COMMAND_MAP.put("listviews", new MonkeySourceNetworkViews.ListViewsCommand());rn COMMAND_MAP.put("queryview", new MonkeySourceNetworkViews.QueryViewCommand());rn COMMAND_MAP.put("getrootview", new MonkeySourceNetworkViews.GetRootViewCommand());rn COMMAND_MAP.put("getviewswithtext",rn new MonkeySourceNetworkViews.GetViewsWithTextCommand());rn COMMAND_MAP.put("deferreturn", new DeferReturnCommand());rn [/code]rnrn //queryview [id type] [id(s)] [command]rn //queryview viewid button1 gettextrn //queryview accessibilityids 12 5 getparent 论坛

没有更多推荐了,返回首页