-> 說明:本系列文章翻譯自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 API 可以在多個設備或模擬器間執行一或多個測試組。你可以一次性手動鏈接所有設備或啟動所有模擬器(或兩者同時進行),也可以通過編程方式操作,然后執行一或多組測試。你還可以通過編程啟動一臺模擬器,執行疑惑多組測試,最后終止模擬器。
功能測試:monkeyrunner 可以在 Android 應用上執行完整的自動化測試。你可以提供一些按鍵和觸摸事件輸入,然后通過截圖查看測試結果。
回歸測試:monkeyrunner 可以通過運行應用并將截圖與已知正確的截圖集合相比較來測試應用穩定性。
可擴展的自動化:由于 monkeyrunner 是一組 API 工具集,你可以開發一個完整的基于 Python 的控制 Android 設備的模塊或程序。另外,使用 monkeyrunner API,你可以使用 Python 標準的
os
和subprocess
模塊調用 Android 工具,比如Android Debug Bridge。
你也可以向 monkeyrunner API 中添加你自己的類。在用插件擴展monkeyrunner章節中有詳細的介紹。
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 :
MonkeyRunner
:為 monkeyrunner 程序提供工具的類。此類提供了 monkeyrunner 連接設備或模擬器的方法。還為創建 monkeyrunner 程序 UI 和呈現內建幫助提供了方法。MonkeyDevice
:代表一個設備或模擬器。此類提供了安裝/卸載程序、啟動Activity和向應用發送按鍵或觸摸事件的方法。也可以使用此類執行測試程序。MonkeyImage
:代表一個截屏圖像。此類提供了截屏、轉換bitmap到其他格式、比較兩個MonkeyImage
對象和將圖像寫入文件的方法。
在一個 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>
參數分別是:
<format>
如果是text
則輸出普通文本,如果是html
則輸出HTML文件。<outfile>
輸出文件的合法路徑名
擴展 monkeyrunner 插件
你可以使用 Java 語言擴展 monkeyrunner API 并把它們集成到一個或多個的.jar
文件中。你可以使用此特性寫自己的類繼承 monkeyrunner API 或者繼承已存在的類。你也可以使用此特性初始化 monkeyrunner 環境。
在調用 monkeyrunner
命令時加入-plugin <plugin_jar>
參數可以使用插件,參考表1。
在你的插件代碼中,可以導入并繼承包com.android.monkeyrunner
中 monkeyrunner 主要的類:MonkeyDevice
,MonkeyImage
,和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;
}
}