サイトのトップへ戻る

Android Studio ドキュメント 日本語訳

サイト内検索

monkeyrunner

monkeyrunnerツールでは、Android 端末やエミューレーターをAndroid コード外から制御するプログラムを記述する為のAPIが用意されています。 monkeyrunnerを使用すると、Android アプリケーションやテストパッケージをインストールしたり、そのアプリケーションを実行したり、そのアプリケーションにキー操作を送信したり、 そのアプリケーションのユーザーインタフェースのスクリーンショットを取得したり、取得したスクリーンショットを開発機に保存したり、そういった様々なことを行えるPython プログラムを記述することができます。 monkeyrunner ツールは機能/フレームワークレベルでアプリケーションと端末のテストを行い、ユニットテストを実行することをメインに設計されていますが、 それ以外の目的でも自由に使用できます。

monkeyrunner ツールはUI/アプリケーション エクササイザー、 Monkeyとは何も関係ありません(そちらも monkey ツールとして知られていますが)。 monkey ツールは端末やエミュレーター上ではadbシェル内で直接実行され、 ユーザーイベントとシステムイベントの擬似ランダムストリームを生成します。 これと比較して、monkeyrunner ツールはAPIから特定のコマンドとイベントを送信することで、ワークステーションから端末とエミュレータを制御します。

monkeyrunner ツールでは、テストのためのこうしたユニークな機能が用意されています。:

  • 複数端末の制御: monkeyrunner API は、一つ以上のテストを複数の端末やエミュレーターにまたがって適用できます。 全ての端末を物理的に接続したり、複数のエミュレーター(と端末)を一度に全て起動したり、それらをプログラム上から順番に接続したり、複数のテストを実行したりできます。 エミュレーター構成をプラグラム上から起動したり、一つ以上のテストを実行したり、エミュレーターをシャットダウンしたりもできます。
  • 機能テスト: monkeyrunner は、Androidアプリケーションの起動から終了までを自動化したテストを実行できます。キー操作やタッチイベントの入力値を渡し、結果がスクリーンショットとして表示されます。
  • 回帰テスト - monkeyrunner では、アプリケーションを実行してその出力されスクリーンショットと正常な状態のスクリーンショットを比較するすることで、アプリケーションの安定性をテストできます。
  • 拡張可能な自動化 - monkeyrunner は API ツールキットなので、Android端末を制御するための Pythonベースモジュールとプログラムのシステム全体を開発することができます。 monkeyrunner API 自体を使用する以外にも、標準のPython os モジュールと subprocess モジュールを使ってAndroid Debug BridgeのようなAndroid ツールを呼び出すことができます。

    monkeyrunner APIに独自のクラスを追加することもできます。これの詳細については、 プラグインを使ってmonkeyrunner を拡張するの項目で説明しています。

monkeyrunner ツールは、Java プログラミング言語を使ったPython の実装である、Jythonを使用しています。 Jython のおかげで、monkeyrunner APIはAndroid フレームワークと簡単にやり取りすることができます。 Jython を使用する場合は、Python の構文を使ってAPIの定数やクラスやメソッドにアクセスすることができます。



簡単な monkeyrunner のプログラム

以下は、端末に接続して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

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 プログラムを実行するか、もしくは対話型セッションの形式で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 の内蔵ヘルプ

以下を実行することで、monkeyrunner のAPIリファレンスを生成できます:

monkeyrunner help.py <format> <outfile>

引数は以下の通りです:

  • <format> には、平文を出力する場合は text 、HTML を出力する場合は html を指定します。
  • <outfile> には、出力ファイルの修飾パス名を指定します。


プラグインを使ってmonkeyrunner を拡張する

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;
    }
}