monkeyrunnerツールでは、Android 端末やエミューレーターをAndroid コード外から制御するプログラムを記述する為のAPIが用意されています。 monkeyrunnerを使用すると、Android アプリケーションやテストパッケージをインストールしたり、そのアプリケーションを実行したり、そのアプリケーションにキー操作を送信したり、 そのアプリケーションのユーザーインタフェースのスクリーンショットを取得したり、取得したスクリーンショットを開発機に保存したり、そういった様々なことを行えるPython プログラムを記述することができます。 monkeyrunner ツールは機能/フレームワークレベルでアプリケーションと端末のテストを行い、ユニットテストを実行することをメインに設計されていますが、 それ以外の目的でも自由に使用できます。
monkeyrunner ツールはUI/アプリケーション エクササイザー、 Monkeyとは何も関係ありません(そちらも monkey
ツールとして知られていますが)。
monkey
ツールは端末やエミュレーター上ではadb
シェル内で直接実行され、
ユーザーイベントとシステムイベントの擬似ランダムストリームを生成します。
これと比較して、monkeyrunner ツールはAPIから特定のコマンドとイベントを送信することで、ワークステーションから端末とエミュレータを制御します。
monkeyrunner ツールでは、テストのためのこうしたユニークな機能が用意されています。:
os
モジュールと subprocess
モジュールを使ってAndroid Debug BridgeのようなAndroid ツールを呼び出すことができます。
monkeyrunner APIに独自のクラスを追加することもできます。これの詳細については、 プラグインを使ってmonkeyrunner を拡張するの項目で説明しています。
monkeyrunner ツールは、Java プログラミング言語を使ったPython の実装である、Jythonを使用しています。 Jython のおかげで、monkeyrunner APIはAndroid フレームワークと簡単にやり取りすることができます。 Jython を使用する場合は、Python の構文を使ってAPIの定数やクラスやメソッドにアクセスすることができます。
以下は、端末に接続してMonkeyDevice
オブジェクトを作成する簡単なmonkeyrunner プログラムです。 MonkeyDevice
オブジェクトを使うことで、このプログラムではAndroid アプリケーションパッケージをインストールし、そのアクティビティのうちの一つを実行し、
アクティビティにキーイベントを送信しています。それからプログラムは MonkeyImage
オブジェクトを作成して、テスト結果のスクリーンショットを取得します。
この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
:
monkeyrunner プログラム用のユーティリティメソッドのクラスです。このクラスには、monkeyrunner を端末もしくはエミュレーターをつなぐためのメソッドが用意されています。
また、monkeyrunner プログラム用のUIを作成したり、内蔵のヘルプを表示したりするメソッドも用意されています。
MonkeyDevice
:
端末やエミュレーターを表します。このクラスでは、パッケージのインストールとアンインストール、アクティビティの起動、キーボードイベントやタッチイベントをアプリケーションへ送信、といった処理を行うメソッドが用意されています。このクラスを使ってテストパッケージを実行することもできます。
MonkeyImage
:
スクリーンキャプチャの画像を表します。このクラスでは、画面の取得、ビットマップ画像を様々な形式へ変換、二つのMonkeyImage オブジェクトの比較、画像をファイルへ書き出す、
といった処理を行うメソッドが用意されています。
Python プログラムでは、各クラスにPython モジュールとしてアクセスします。 monkeyrunner ツールはこれらモジュールを自動的にはインポートしません。
モジュールをインポートするには、Python のfrom
文を使用します:
from com.android.monkeyrunner import <module>
<module>
の部分には、インポートしたいクラス名が入ります。モジュール名をコンマで区切ることで、同じfrom
文で複数のモジュールをインポートできます。
ファイルからmonkeyrunner プログラムを実行するか、もしくは対話型セッションの形式でmonkeyrunner 文を入力していくことができます。
SDK ディレクトリのサブディレクトリtools/
内にあるmonkeyrunner
コマンドを呼び出すことで、この両方を行うことができます。
引数にファイル名を指定した場合、 monkeyrunner
コマンドはこのファイルの中身をPython プログラムとして実行します。; 指定しなかった場合は対話型セッションが開始されます。
monkeyrunner
コマンドの構文は以下の通りです
monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>
表1 ではフラグと引数について説明しています。
表 1. monkeyrunner
のフラグと引数。
引数 | 説明 |
---|---|
-plugin <plugin_jar>
|
(任意) monkeyrunnerのプラグインを含む.jar ファイルを指定します。
monkeyrunner プラグインについてより深く学ぶには、プラグインを使ってmonkeyrunner を拡張するを参照してください。
複数のファイルを指定するには、引数を複数回指定します。
|
<program_filename>
|
この引数を設定した場合、 monkeyrunner コマンドはこのファイルの中身をPython プログラムとして実行します。
引数が設定されなかった場合、コマンドは対話型セッションを開始します。
|
<program_options>
|
(任意) <program_file>内のプログラムのフラグと引数。 |
以下を実行することで、monkeyrunner のAPIリファレンスを生成できます:
monkeyrunner help.py <format> <outfile>
引数は以下の通りです:
<format>
には、平文を出力する場合は text
、HTML を出力する場合は html
を指定します。
<outfile>
には、出力ファイルの修飾パス名を指定します。
Javaプログラミング言語で書かれたクラスで monkeyrunner APIを拡張し、複数の .jar
ファイルを組み込むことができます。
この機能を使って、独自のクラスでmonkeyrunner APIを拡張したり、既存のクラスを拡張したりできます。
また、この機能を使ってmonkeyrunner 環境を初期化することもできます。
monkeyrunnerへプラグインを組み込むには、表 1で説明した-plugin <plugin_jar>
引数を付けて、 monkeyrunner
コマンドを呼び出します。
プラグインのコードでは、com.android.monkeyrunner
内にあるmonkeyrunner のメインクラスの MonkeyDevice
, MonkeyImage
, and MonkeyRunner
をインポートしたり拡張したりできます (詳細は monkeyrunner APIを参照してください)。
プラグインではAndroid SDKへのアクセス権を与えられないので注意してください。
com.android.app
などのパッケージをインポートすることはできません。
これはmonkeyrunner は、フレームワークAPI以下のレベルで端末やエミュレーターとやり取りするためです。
プラグインの .jar
ファイルでは、スクリプト処理が開始される前にインスタンスが作成されるクラスを設定することができます。
このファイルを設定するには、 .jar
ファイルのマニフェストにMonkeyRunnerStartupRunner
キーを追加します。
このキーのvalue値には、起動時に実行するクラスの名前を設定してください。
以下のコードでは、 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; } }