[譯]Android monkeyrunner 官方文檔

-> 說明:本系列文章翻譯自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 標準的ossubprocess模塊調用 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 主要的類: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;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,665評論 25 708
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,467評論 2 45
  • 上午混沌大課 下午線下pm小課 與親戚吃飯 晚上演唱會 非公醫療項目整體完成度10%一督促甲方給反饋>20% 移動...
    伽藍214閱讀 150評論 0 0
  • 2016年馬上就翻篇了,這一年我在理財路上開始主動學習,注冊長投會員,上網絡課程,看理財投資類書籍,通過風險測評后...
    永遠微笑的泥鰍閱讀 235評論 0 0
  • 類似于這樣寫法,在用戶輸入不符合要求時(如一次性粘貼大量文本),該方法返回NO,UI不會出問題。若是在- (voi...
    WhiteWhite_iOS閱讀 496評論 0 0