========================================================= Android monkeyrunner チュートリアル ========================================================= Contents: .. toctree:: :maxdepth: 2 execsample makeplugin .. contents:: About This Document =================== 本記事は、以下のHPを参考に記載しています。 正確性を期すものでは無いため、記載内容が掲載元と異なる場合があります。 ■monkeyrunner http://developer.android.com/intl/ja/guide/developing/tools/monkeyrunner_concepts.html また本ドキュメントは、epubでも参照可能です。 `DL `_ \============================================ * ターゲット:PF開発者/アプリケーション開発者 * 用途:フレームワークやデバイス機能レベルでのテスト/その他、アプリケーションのテスト * 言語:Python,Jython * 注意: `Monkey `_ とは関係有りません。 \============================================ 和訳 ======= monkeyrunnerツールは、コード外からAndroidのデバイス/エミュレータを制御するためのAPIを提供しています。 monkeyrunnerを使用すると、キーストロークの送信や、スクリーンショットを取りPCに保存するPython スクリプトを書くことが出来ます。 さらには、”デバイスの機能やフレームワークのテスト”、もちろんアプリケーションの機能のテストを実行することが出来ます。 ”単体テスト用”に設計されていますが、もちろんそれ以外の用途での利用も可能です。 `Monkey `_ (monkeyrunnerとは関係有りません。←しつこい)は、adb上でシェルまたはイベントを擬似生成する物ですが、 それとは異なり、APIや特定のコマンド、イベントを送ることによってデバイス/APIを制御します。 monkeyrunnerが提供する機能 -------------------------- * 複数デバイスの制御: * 複数のデバイス、またはエミュレータに対してテスト/テストスイートを適用することが出来ます。また、エミュレータの起動から終了まで制御が可能です。 * 機能テスト * アプリケーションの起動から終了までテストが可能。キーストロークやタッチイベント等の入力値を設定でき、テスト結果のスクリーンショットを表示します。 * 回帰テスト * テスト結果のスクリーンショットと正しい結果のスクリーンショット(事前に設定)を比較し、アプリケーションの安定性を検証できます。 * 拡張オートメーション * monkeyrunnerは、APIツールキットなので、PythonベースのモジュールとAndroidデバイスを制御するためのプログラムを開発することができます。 * monkeyrunner自身のAPIに加えて、Pythonの標準的なosとsubprocessモジュールを利用すると、adbの様なADTを呼び出すことも出来ます。 また、monkeyrunner APIに独自のクラスを追加し、フレームワークのAPIを利用することができます。 :ref:`plugin` を参照のこと。 簡単なmonkeyrunnerプログラム -------------------------------------------- このプログラムは、MonkeyDeviceオブジェクトを返すプログラムを示します。 MonkeyDeviceオブジェクトを使用すると、パッケージに含まれているActionに対してキーストロークイベントを送信します。 そして、その結果のスクリーンショットをMonkeyImageオブジェクトとして返します。 MonkeyImageオブジェクトからは、png形式のスクリーンショットを取得できます。 .. code-block:: python :linenos: # monkeyrunnerモジュールのインポート from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice # デバイスに接続し、MonkeyDeviceオブジェクトを返します。 device = MonkeyRunner.waitForConnection() # パッケージのインストール # このメソッドがtrueを返したなら、インストールは成功です。 device.installPackage('myproject/bin/MyApplication.apk') # Activityの起動 device.startActivity(component='com.example.android.myapplication.MainActivity') # メニューキーの押下 device.press('KEYCODE_MENU','DOWN_AND_UP') # スクリーンショットの取得 result = device.takeSnapShot # スクリーンショットの書き出し result.writeToFile('myproject/shot1.png','png') .. _api:: monkeyrunner API --------------------- monkeyrunnerのAPIは以下の3つのモジュールから構成されています。 * MonkeyRunner * ユーティリティモジュール。このクラスは、デバイスやエミュレータとの接続を提供し、またUIの生成やヘルプの表示などに利用します。 * MonkeyDevice * デバイスやエミュレータを表すクラスです。このクラスは、パッケージのインストールやアンインストール、Activityの起動、キーイベントの送信などを制御します。またテストパッケージを走らせるために利用します。 * MonkeyImage * スクリーンショットのイメージを表すクラスです。このクラスは、スクリーンキャプチャやビットマップイメージから様々な形式への変換、MonkeyImageオブジェクトの比較、またファイルへの書き出しに利用します。 上記サンプルで見たように、以下のコードのに使用するクラスを記載します。 ひとつのfrom文で複数のクラスをインポートすることも可能です。   monkeyrunnerの起動 --------------------- monkeyrunnerは、ファイルから簡単に起動できます。 もしくは、ユーザインタラクティブなセッションに記載することもできます。 monkeyrunnerを起動する場合、SDKのサブディレクトリの中のtoolsから起動できます。 ファイル名と引数を与えると、スクリプトが起動します。 なにも引数を与えなければ、インタラクティブなモードで起動します。 コマンド構文 ~~~~~~~~~~~~~ monkeyrunner -plugin 引数の表は以下 ==================== ====================================================================== オプション 説明 ==================== ====================================================================== -plugin (Optional) monkeyrunner のプラグインの指定 プラグインの作り方は、参照 複数指定する場合は、-pluginを複数指定すること この引数を指定すると、monkeyrunnerスクリプトが起動する 指定しない場合、インタラクティブモードになる。 (Optional) で指定したスクリプトのフラグオプション ==================== ====================================================================== monkeyrunner 組み込みのヘルプ --------------------------------------- monkeyrunnerは簡単にリファレンスを生成可能です。(Sphinxのように(勝手に書きました。ごめんなさい。)) :: monkeyrunner help.py ========= =========================================================== 引数 説明 ========= =========================================================== text / html を指定する。それぞれの形式で出力される。 パスを含めた出力ファイル名 ========= =========================================================== .. _plugin: プラグインの作り方 ------------------------------------------ monkeyrunner のAPIの拡張には、Javaで書いたプログラム(.jar)を組み込む必要があります。 APIの拡張には、既存のクラスの拡張や自身で書いたコードを利用できます。 また、monkeyrunner環境の初期化にも利用できます。 monkeyrunnerにプラグインを適用するためには、前述のコマンドのオプションで指定してやる必要があります。(-plugin ) プラグインのコードでは、monkeyrunnerのクラスのインポート及び継承が可能です。 ( :ref:`api` 参照) 注意:プラグインは、AndroidSDKにアクセスできない。com.android.appなどのパッケージはインポートできない。 これは、monkeyrunnerが、frameworkのAPIより下位の層でエミュレータやデバイスにアクセスするためである。 プラグインの起動クラスでは、スクリプトが処理をする前にインスタンス化してやる必要がある。 このクラスを書くためには、MonkeyRunnerStartupRunnerキーをManifestに記載する必要がある。 キー値には起動クラスを与えてやる。 以下のスニペットを利用し、antでビルドすること :: To get access to monkeyrunner's runtime environment, the startup class can implement com.google.common.base.Predicate. For example, this class sets up some variables in the default namespace: .. code-block:: java :linenos: package com.android.example; import com.google.common.base.Predicate; import org.python.util.PythonInterpreter; public class Main implements Predicate { @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; } }