MonkeyRunner在准备好AndroidDebugBridge和DeviceMonitor等服务之后,就基本上是攻克了和目标设备通信的问题了,那往下须要做的就是把測试脚本执行起来了。

178   public static void main(String[] args) {
179 MonkeyRunnerOptions options = MonkeyRunnerOptions.processOptions(args);
180
181 if (options == null) {
182 return;
183 }
184
185
186 replaceAllLogFormatters(MonkeyFormatter.DEFAULT_INSTANCE, options.getLogLevel());
187
188 MonkeyRunnerStarter runner = new MonkeyRunnerStarter(options);
189 int error = runner.run();
190
191
192 System.exit(error);
193 }
194 }

代码8-5-1 MonkeyRunnerStarter - Main

从以上代码和本章上面几节分析可知,MonkeyRunnerStarter在实例化MonkeyRunnerStarter的过程中启动了AndroidDebugBridge和DeviceMonitor。然后就会进入下一行189行去调用MonkeyRunnerStarter的run方法。

66   private int run()
67 {
68 String monkeyRunnerPath =
System.getProperty("com.android.monkeyrunner.bindir")
+
File.separator + "monkeyrunner";
69
70
71 Map<String, Predicate<PythonInterpreter>> plugins = handlePlugins();
72 if (this.options.getScriptFile() == null) {
73 ScriptRunner.console(monkeyRunnerPath);
74 this.chimp.shutdown();
75 return 0;
76 }
77 int error = ScriptRunner.run(monkeyRunnerPath,
this.options.getScriptFile().getAbsolutePath(), this.options.getArguments(), plugins);
78
79 this.chimp.shutdown();
80 return error;
81 }

代码8-5-2 MonkeyRunnerStarter - run

  • 68行:取得monkeyrunner脚本的绝对路径。“com.android.monkeyrunner.bindir"我们在前面分析过,它代表的就是你的sdk安装文件夹下的”/tools”,然后再加上文件分隔符”/”以及”monkeyrunner”这个脚本。

    所以终于的结果就相似于”/Users/apple/Develop/sdk/tools/monkeyrunner”

  • 72-73行: 假设用户在命令行执行monkeyrunner时没有提供脚本文件路径这个參数。那么就调用ScriptRunner类的console来请求jython解析器打开一个交互窗体来让用户进行交互
  • 74行: 用户停止交互关闭窗体时调用ChimpChat的shutDown方法来通知对应模块測试已经停止,以便它们做对应的处理。比方会给monkey服务发送“quit”命令,通知它測试已经停止
  • 77行: 假设用户在命令行执行monkeyrunner时提供了脚本路径这个參数。那么调用的将会是ScriptRunner的run方法来将该脚本执行起来,事实上里面终于调用的就是jython的解析器来执行脚本。

不管是打开交互console还是直接执行脚本,终于用到的都是jython解析器来做事情,比方我们进去ScriptRunner的run方法:

77   public static int run(String executablePath,
String scriptfilename,
Collection<String> args,
Map<String, Predicate<PythonInterpreter>> plugins)
78 {
...
94 PythonInterpreter python = new PythonInterpreter();
...
114 try
115 {
116 python.execfile(scriptfilename);
117 }
...
}

代码8-3-3 ScriptRunner - run

做的事情就是去实例化一个jython的解析器,PythonInterpreter所在的包是“org.python.util”。获得jython解析器后就直接调用解析器的execfile方法去执行目标測试脚本了。

注:很多其它文章请关注公众号:techgogogo或个人博客http://techgogogo.com

当然,也很欢迎您直接微信(zhubaitian1)勾搭。本文由天地会珠海分舵原创。

转载请自觉,是否投诉维权看心情。

第8章5节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-执行測试脚本的更多相关文章

  1. 第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数

    MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输 ...

  2. 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

    在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...

  3. 第14章1节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    到此为止我们描写叙述的MonkeyRunner相应用的点击拖放等操作都是直接通过指定坐标点来实现的.比方以下触摸一个坐标点为(60,90)的按钮的脚本样例: 1 device.touch(60,900 ...

  4. 第14章4节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-装备ViewServer-port转发

    在初始化HierarchyViewer的实例过程中,HierarchyViewer会调用自己的成员方法setupViewServer来把ViewServer装备好,那么我们这里先看下这种方法: 39 ...

  5. 第8章7节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-小结

    最后我们对MonkeyRunner启动的过程做一个总结,当然,当中也包括启动Monkey,尽管它不属于启动过程的一部分: monkeyrunner这个shell脚本会先设置一些执行环境的系统属性保存到 ...

  6. MonkeyRunner源代码分析之启动

    在工作中由于要追求完毕目标的效率,所以很多其它是强调实战.注重招式.关注怎么去用各种框架来实现目的.可是假设一味仅仅是注重招式.缺少对原理这个内功的了解,相信自己非常难对各种框架有更深入的理解. 从几 ...

  7. Redis源代码分析(十三)--- redis-benchmark性能測试

    今天讲的这个是用来给redis数据库做性能測试的,说到性能測试,感觉这必定是高大上的操作了.redis性能測试.測的究竟是哪方面的性能,怎样測试,通过什么指标反映此次測试的性能好坏呢.以下我通过源代码 ...

  8. 第8章4节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-启动AndroidDebugBridge

    上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个基本的事情: 715行startAdb:开启AndroidDebugBridge 722-723 ...

  9. 第14章8节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树

    在上几节的描写叙述中,我们把HierarchyViewer初始化好.也把ViewServer给装备好了.那如今距离获得一个控件去操作它是万事具备仅仅欠东风了,欠了那一股春风了?欠了的是建立控件树这个东 ...

随机推荐

  1. 前端和后台对接时对sign加密方法

    前端和后台对接时对sign加密方法 /*后台php对接进行sign标签加密 1 获取向后台请求的数据data(key/value方式),可以是个对象(obj),也可以是数组(arr); 2 将数据的k ...

  2. [Tools] Create your own mobile emulator device by using Chrome dev tool

    Using the New Device Emulation Interface The Device Emulation interface changed a bit with the newer ...

  3. [Angular + Unit Testing] Mock HTTP Requests made with Angular’s HttpClient in Unit Tests

    In a proper unit test we want to isolate external dependencies as much as possible to guarantee a re ...

  4. 【POJ 1850】 Code

    [POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az ...

  5. android 联系人中,在超大字体下,加入至联系人界面(ConfirmAddDetailActivity)上有字体显示不全的问题

    联系人(Contacts)中,在超大字体下.加入至联系人界面 (ConfirmAddDetailActivity)上有字母显示不全,如"j"等 这是android布局比較紧凑引起的 ...

  6. BZOJ 2005 [Noi2010]能量採集 (容斥)

    [Noi2010]能量採集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 2324  Solved: 1387 [id=2005"> ...

  7. CSS3可伸缩框属性,可用于等分显示子元素或按比例显示子元素的大小

    使用方法跟Android的android:layout_weight属性类似.可类比Android中的使用方法.这样比較好记,因为眼下全部浏览器都不支持大部分的属性,所以全部的属性都须要加上Firef ...

  8. leetCode 72.Edit Distance (编辑距离) 解题思路和方法

    Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert  ...

  9. Button的Click事件与js函数的两种不同顺序触发方式

    先运行js.或者先运行Click事件,近期就遇到了这个问题,開始弄了两个button分别运行,那才叫一个蛋疼... 1.先运行js,再运行Button的Click函数 <asp:Button I ...

  10. MAVEN创建并打包web项目

    maven项目是由一个maven project和多个maven module组成的,以下简介一下maven webapp的创建和打包,前提是你已经安装配置好maven了. 打开eclipse.依照例 ...