temporaryなめも帳

だらだらと備忘録とか。誰かの為になることをねがって。

python覚えたのでmonkeyrunner試してみる

monkeyrunnerは端末に対して無作為なイベントを送付するmonkeyツールとは異なり、デバイスのキーイベントの送付やスクリーンショットの取得などを実行することができるテスト用のツールです。

うまく使えばframeworkのテストツールとして利用できそうなので、目をつけてたもののPython知らんぜとか思って放置してた。 覚えたついでに調べなおしを。

monkeyrunnerはjthonとして実装されており、用意されているモジュールは3つのみみたい。

  • MonkeyDevice 主にメインに使うことになるクラス。アプリケーションのインストールから、タッチイベントの送付、アクティビティの立ち上げなど、いろいろできる。

  • MonkeyImage 主に画像を扱うときにつかう。2つのイメージの比較などにも利用できるので、実行結果のスクリーンショットと期待値のスクリーンショットの比較とかできる。

  • MonkeyRunner デバイスとの接続などに使う。ここのメソッドを通じてMonkeyDeviceクラスを取得する

アプリケーションを起動する

Settingsアプリを起動してみる。

# -- coding=utf-8 --
author = 'kobashin'

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

device = MonkeyRunner.waitForConnection()

def startApp(target): device.startActivity(component=target)

def main(): startApp('com.android.settings/.Settings')

if name == "main": main()

MonkeyDevice.startActivity()を使って、Activityの起動ができる。同様に、以下でHomeのIntentが投げれる。

def actionHome():
    device.startActivity(action="android.intent.action.MAIN", categories=["android.intent.category.HOME"])

アプリケーションをインストールする

単なる1アプリのインストールであれば、以下でOK。 pathにはHOST PC側のapkパスを指定する。

def installApp(path):
    device.installPackage(path)

複数のアプリケーションを一気にインストールするのであれば、以下でいけそう。指定したディレクトリ以下のapkファイルをインストールして回る。

import glob

def installAppInDir(dirpath): files = glob.glob(dirpath + '/*.apk') for apk in files: installApp(apk)

デバイスのキーを押下する

電源ボタンを押下してみる。suspend/resumeの試験とかこれでいんじゃないの?あ、adb走ってたらwakelock握りっぱなしだっけか。

import time

def keyDownAndUp(code): device.press(code, 'DOWN_AND_UP')

def main(): keyDownAndUp('KEYCODE_POWER') time.sleep(2) keyDownAndUp('KEYCODE_POWER')

スクリーンショットを取得する

取るだけなら、以下で。 pathには絶対PATHを指定すること。

def takeScreenShot(path):
    result = device.takeSnapshot()
    result.writeToFile(path, 'png')
    return result

とった結果と比較するときには、以下で行う。 loadImageFromFileを利用すれば、pngファイルからMonkeyImageが取得できるのでsameAsを使って比較すればよい

def compareImages(src, dest):
    if src.sameAs(dest, 0.9):
        print "2 is same"
    else:
        print "2 is different"

def main(): dest = device.takeSnapshot() src = MonkeyRunner.loadImageFromFile('/Users/skobayashi1/workspace/temp/apps/test1.png') compareImages(src, dest)

一旦ここまで。 CTS実施前の端末設定とか、顧客ごとのキッティングとか、これで作ればいいんじゃないかな。