最近在复习之前的笔记,在回顾MonkeyRunner时看了看google官网的内容,写得不错,就翻译出来分享下。其实google官网真是一个学习的好地方。

基础知识

MonkeyRunner工具提供了一个API用于在Android代码之外控制Android设备和模拟器。通过MonkeyRunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。
MonkeyRunner工具与monkey工具并无关联。monkey工具直接运行在设备或模拟器的adbshell中,生成用户或系统的伪随机事件流。而MonkeyRunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。
MonkeyRunner工具为Android测试提供了以下特性:

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

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

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

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

您还可以向MonkeyRunnerAPI中添加您自己的类。我们将在后面会对此进行详细讨论。
MonkeyRunner工具使用Jython(使用Java编程语言的一种Python实现)。Jython允许MonkeyRunner API与Android框架轻松的进行交互。使用Jython,您可以使用Python语法来获取API中的常量、类以及方法。

一个简单的MonkeyRunner程序实例

以下为一个简单的MonkeyRunner程序,它将会连接到一个设备,创建一个MonkeyDevice对象。使用MonkeyDevice对象,程序将安装一个Android应用包,运行其中一个活动,并向其发送按键事件。程序接下来会将结果截图,创建一个MonkeyImage对象,并使用这个对象截图将保存至.png文件。

# 导入此程序所需的MonkeyRunner模块 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice # 连接当前设备,返回一个MonkeyDevice对象 device = MonkeyRunner.waitForConnection() # 安装Android包,注意,此方法返回的返回值为boolean,由此您可以判断安装过程是否正常 device.installPackage('myproject/bin/MyApplication.apk') # 运行此应用中的一个活动 device.startActivity(component='com.example.android.myapplication.MainActivity') # 按下菜单按键 device.press('KEYCODE_MENU','DOWN_AND_UP') # 截取屏幕截图 result = device.takeSnapShot# 将截图保存至文件 result.writeToFile('myproject/shot1.png','png')

MonkeyRunner 的API

MonkeyRunner 在com.android.monkeyrunner包中总共包含三个模块:

  • MonkeyRunner:一个为monkeyrunner程序提供工具方法的类。这个类提供了用于连接monkeyrunner至设备或模拟器的方法。它还提供了用于创建一个monkeyrunner程序的用户界面以及显示内置帮助的方法。

  • MonkeyDevice :表示一个设备或模拟器。这个类提供了安装和卸载程序包、启动一个活动以及发送键盘或触摸事件到应用程序的方法。您也可以用这个类来运行测试包。

  • MonkeyImage :表示一个截图对象。这个类提供了截图、将位图转换成各种格式、比较两个MonkeyImage对象以及写图像到文件的方法。

在python程序中,您将以Python模块的形式使用这些类。monkeyrunner工具不会自动导入这些模块。您必须使用类似如下的from语句:

  fromcom.android.monkeyrunner import

其中,为您想要导入的类名。您可以在一个from语句中导入超过一个模块,其间以逗号分隔。

运行MonkeyRunner

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

monkeyrunner -plugin  <程序文件名> <程序选项>
  • -plugin : (可选)指定一个内含MonkeyRunner插件的.jar文件。欲了解更多关于monkeyrunner插件的内容,参考下文。要指定多个文件,可以多次使用此参数。

  • <程序文件名>: 如果您指定此参数,MonkeyRunner将视文件内容为Python程序并予以执行。如果此参数未予指定,则开启一个交互式会话。

  • <程序选项>:(可选)<程序文件名>中所指定的程序所需的参数。

MonkeyRunner提供帮助

您可以用以下命令来生成monkeyrunner的API参考:

monkeyrunner  help.py 

参数说明:
可以为text或html,分别代表纯文本和HTML输出。
指定了输出文件的全路径名称。

使用插件扩展MonkeyRunner

您可以用Java语言创建新的类,并打包成一个或多个.jar文件,以此来扩展 MonkeyRunner API。您可以使用您自己写的类或者继承现有的类来扩展MonkeyRunner API。您还可以使用此功能来初始化MonkeyRunner环境。
为了使MonkeyRunner加载一个插件,您应当如使用如前面所述的-plugin参数来调用MonkeyRunner命令。

在您编写的插件中,您可以导入或继承位于com.android.monkeyrunner包中的几个主要的monkeyrunner类:MonkeyDevice, MonkeyImage和MonkeyRunner。

请注意,插件无法让你访问Android的SDK。您不能导入com.android.app等包。这是因为monkeyrunner是在框架API层次之下与设备或模拟器进行交互的。

插件启动类

用于插件的.jar文件可以指定一个类,使其在脚本执行之前就实例化。如欲指定这个类,您需要在.jar文件的manifest中添加键 MonkeyRunnerStartupRunner。其值为启动时运行的类的名称。以下代码段显示了如何在一个ant构建脚本达到这样的目的:

<jar jarfile="myplugin" basedir="${build.dir}"><manifest><attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/></manifest></jar>

如欲访问MonkeyRunner的运行时环境,启动类可以实现com.google.common.base.Predicate。例如,用这个类在默认的命名空间中设置一些变量:

package com.android.example; import com.google.common.base.Predicate; import org.python.util.PythonInterpreter; public class Main implements Predicate {     @Override     public boolean apply(PythonInterpreter anInterpreter) {         /* * Examples of creating and initializing variables in the monkeyrunner environment's * namespace. During execution, the monkeyrunner program can refer to the variables "newtest" * and "use_emulator" * */         anInterpreter.set("newtest", "enabled");         anInterpreter.set("use_emulator", 1);         return true;     } }

MonkeyRunner到此翻译完,用好自动化测试框架对android开发有很大帮助。

更多相关文章

  1. android应用程序签名
  2. VisionMobile:2015年Android使用的全球趋势(五)Android演进导致更少
  3. 使用android工程作为类库Unable to resolve superclass of L问题
  4. [转][Android研究手记1]基本概念和模型
  5. Android学习-----如何使用sqlite进行后台数据交互,sqlite入门使用
  6. j2me程序移植入android总结
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. Android:Android.bat批处理命令
  2. android Listview相关内容
  3. 认识 android-job
  4. Android利用tcpdump抓包
  5. Android app自动更新总结(已适配9.0)
  6. androidannotations 在android studio中
  7. How to Use OpenCV in Android Studio
  8. Android SDK 25.2.3 移除了 android 命令
  9. Tip of the Day(Android Studio)
  10. Android笔记(28)MVVM架构过程