编程技术类Android Testing程序员

[译]Android monkeyrunner 官方文档

2015-11-29  本文已影响1772人  lovexiaov

-> 说明:本系列文章翻译自Android官方文档

分为四篇:
android monkeyrunner 官方文档
android MonkeyRunner 类接口文档
android MonkeyDevice 类接口文档(待翻译)
android MonkeyImage 类接口文档(待翻译)

monkeyrunner 工具提供了在 Android 代码外编写控制 Android 设备或虚拟机程序的 API。你可以使用 monkeyrunner 编写 Python 程序来安装 Android 应用程序或测试包,运行应用,向应用发送按键,截图并把图片存放到工作目录。monkeyrunner 工具主要用来在功能/框架层测试应用和设备,执行单元测试组,但你也可以用作其他目的。

monkeyrunner 工具不像 UI/Application Exerciser Monkey(也就是monkey工具)。monkey工具直接通过 adb shell 运行,生成随机的用户或系统事件流作用于设备。相比而言, monkeyrunner 工具 通过发送 API 中明确的指令或事件,在工作目录控制设备或模拟器。

monkeyrunner 工具为 Android 测试提供了以下独特功能:

monkeyrunner 工具使用 Jython,一个使用Java语言实现的 Python。Jython 允许 monkeyrunner API 方便的与 Android 框架层交互。在 Jythong 中,你可以使用 Python 语法访问 API 中的常量,类,和方法等。

一个简单的 monkeyrunner 程序

这时一个简单的 monkeyrunner 程序,该程序会连接设备,创建一个MonkeyDevice对象。使用MonkeyDevice对象执行安装 Android 应用,启动应用的一个 activity,给 activity 发送按键事件。然后截图作为结果,创建MonkeyImage对象。程序使用此对象将包含截图的.png文件保存到本地。

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# to see if the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# sets a variable with the package's internal name
package = 'com.example.android.myapplication'

# sets a variable with the name of an Activity in the package
activity = 'com.example.android.myapplication.MainActivity'

# sets the name of the component to start
runComponent = package + '/' + activity

# Runs the component
device.startActivity(component=runComponent)

# Presses the Menu button
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# Takes a screenshot
result = device.takeSnapshot()

# Writes the screenshot to a file
result.writeToFile('myproject/shot1.png','png')

monkeyrunner API

com.android.monkeyrunner包中有 三个 monkeyrunner API :

在一个 Python 程序中,你可以将每个类都当作一个 Python 模块访问。monkeyrunner 工具不会自动导入这些模块,你可以使用 Python 的import语句导入模块:

from com.android.monkeyrunner import <module>

<module> 代表了一个你想要导入的类名。 你可以在一个from语句中导入多个模块,模块之间用逗号分割。

执行 monkeyrunner

你既可以通过一个文件执行 monkeyrunner,也可以在 monkeyrunner 的交互式进程中输入语句。在 Android SDK 目录下的tools/子目录下通过调用monkeyrunner命令即可执行上述操作。如果你提供了一个文件名作为参数,monkeyrunner会将该文件中的内容作为 Python 程序执行;否则将会启动交互式进程。

monkeyrunner命令语法如下:

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

表1解释了标记和参数代表的意思。

表1. monkeyrunner标记和参数。

参数 描述
-plugin <plugin_jar> (可选)指定一个包含 monkeyrunner 插件的.jar文件。查看扩展 monkeyrunner 插件了解更多。如果要指定多个文件,多次调用此参数就可以了。
<program_filename> 如果提供了此参数,monkeyrunner 命令会将该文件内容作为程序执行。如果没有提供此参数,则开启交互式进程。
<program_options> (可选)<program_file>中的标记和参数

monkeyrunner 内建帮助

你可以通过执行以下命令为monkeyrunner生成一个 API 参考:

monkeyrunner help.py <format> <outfile>

参数分别是:

扩展 monkeyrunner 插件

你可以使用 Java 语言扩展 monkeyrunner API 并把它们集成到一个或多个的.jar文件中。你可以使用此特性写自己的类继承 monkeyrunner API 或者继承已存在的类。你也可以使用此特性初始化 monkeyrunner 环境。

在调用 monkeyrunner 命令时加入-plugin <plugin_jar>参数可以使用插件,参考表1

在你的插件代码中,可以导入并继承包com.android.monkeyrunner中 monkeyrunner 主要的类:MonkeyDeviceMonkeyImage,和MonkeyRunner(参考monkeyrunner API)。

需要注意的是,插件并没有赋予你访问 Android SDK 的权限。你不能导入类似com.android.app这样的包。因为 monkeyrunner 是基于框架层以下的 API 与设备和模拟器交互的。

插件启动类

一个插件的.jar文件可以指定一个类在脚本执行之前实例化。只需要将MonkeyRunnerStartupRunner键加入.jar文件的清单中即可。值则应该是启动类的类名。下面的片段将向你展示你需要在ant构建文件中需要怎么做:

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

为了可以接入 monkeyrunner 的运行时环境,启动类可以实现com.google.common.base.Predicate<PythonInterpreter>。例如,下面的类在默认命名空间中设置了一些变量:

package com.android.example;

import com.google.common.base.Predicate;
import org.python.util.PythonInterpreter;

public class Main implements Predicate<PythonInterpreter> {
    @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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读