Android monkeyrunner チュートリアル

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を利用することができます。 プラグインの作り方 を参照のこと。

簡単なmonkeyrunnerプログラム

このプログラムは、MonkeyDeviceオブジェクトを返すプログラムを示します。 MonkeyDeviceオブジェクトを使用すると、パッケージに含まれているActionに対してキーストロークイベントを送信します。 そして、その結果のスクリーンショットをMonkeyImageオブジェクトとして返します。 MonkeyImageオブジェクトからは、png形式のスクリーンショットを取得できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 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')

monkeyrunner API

monkeyrunnerのAPIは以下の3つのモジュールから構成されています。

  • MonkeyRunner
    • ユーティリティモジュール。このクラスは、デバイスやエミュレータとの接続を提供し、またUIの生成やヘルプの表示などに利用します。
  • MonkeyDevice
    • デバイスやエミュレータを表すクラスです。このクラスは、パッケージのインストールやアンインストール、Activityの起動、キーイベントの送信などを制御します。またテストパッケージを走らせるために利用します。
  • MonkeyImage
    • スクリーンショットのイメージを表すクラスです。このクラスは、スクリーンキャプチャやビットマップイメージから様々な形式への変換、MonkeyImageオブジェクトの比較、またファイルへの書き出しに利用します。

上記サンプルで見たように、以下のコードの<module>に使用するクラスを記載します。 ひとつのfrom文で複数のクラスをインポートすることも可能です。

monkeyrunnerの起動

monkeyrunnerは、ファイルから簡単に起動できます。 もしくは、ユーザインタラクティブなセッションに記載することもできます。

monkeyrunnerを起動する場合、SDKのサブディレクトリの中のtoolsから起動できます。 ファイル名と引数を与えると、スクリプトが起動します。 なにも引数を与えなければ、インタラクティブなモードで起動します。

コマンド構文

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

引数の表は以下

オプション 説明
-plugin <plugin_jar> (Optional) monkeyrunner のプラグインの指定 プラグインの作り方は、<Extending monkeyrunner with plugins.>参照 複数指定する場合は、-pluginを複数指定すること
<program_filename> この引数を指定すると、monkeyrunnerスクリプトが起動する 指定しない場合、インタラクティブモードになる。
<program_options> (Optional) <program_file>で指定したスクリプトのフラグオプション

monkeyrunner 組み込みのヘルプ

monkeyrunnerは簡単にリファレンスを生成可能です。(Sphinxのように(勝手に書きました。ごめんなさい。))

monkeyrunner <format> help.py <outfile>
引数 説明
<format> text / html を指定する。それぞれの形式で出力される。
<outfile> パスを含めた出力ファイル名

プラグインの作り方

monkeyrunner のAPIの拡張には、Javaで書いたプログラム(.jar)を組み込む必要があります。 APIの拡張には、既存のクラスの拡張や自身で書いたコードを利用できます。 また、monkeyrunner環境の初期化にも利用できます。

monkeyrunnerにプラグインを適用するためには、前述のコマンドのオプションで指定してやる必要があります。(-plugin <plugin_jar>)

プラグインのコードでは、monkeyrunnerのクラスのインポート及び継承が可能です。 ( api 参照)

注意:プラグインは、AndroidSDKにアクセスできない。com.android.appなどのパッケージはインポートできない。 これは、monkeyrunnerが、frameworkのAPIより下位の層でエミュレータやデバイスにアクセスするためである。

プラグインの起動クラスでは、スクリプトが処理をする前にインスタンス化してやる必要がある。 このクラスを書くためには、MonkeyRunnerStartupRunnerキーをManifestに記載する必要がある。 キー値には起動クラスを与えてやる。 以下のスニペットを利用し、antでビルドすること

<jar jarfile="myplugin" basedir="${build.dir}">
  <manifest>
    <attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/>
  </manifest>
</jar>

To get access to monkeyrunner’s runtime environment, the startup class can implement com.google.common.base.Predicate<PythonInterpreter>. For example, this class sets up some variables in the default namespace:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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;
    }
}
inserted by FC2 system