Androidテストツール------monkeyrunnerツール


に感謝http://www.cnblogs.com/yyangblog/archive/2011/03/10/1980086.html 
monkeyrunnerツール
前言:
最近Android自動化テスト方法の研究が始まり、androidテストフレームワーク、CTS、Monkey、Monkeyrunner、benchmark、その他のtest toolなど、ツール、方法、フレームワークのいくつかを簡単に整理しました.接触時間が短いので、足りないところが多いので、皆さんと交流してほしいです.
一、monkeyrunnerとは何か
monkeyrunnerツールはAPIを提供し、このAPIを使用して書かれたプログラムはAndroidコードの外でAndroidデバイスとシミュレータを制御することができます.monkeyrunnerでは、Pythonプログラムを書き出してAndroidアプリケーションやテストパッケージをインストールし、それを実行し、アナログキーを送信し、ユーザーインタフェースの画像を切り取り、スクリーンショットをワークステーションに保存することができます.monkeyrunnerツールの主な設計目的は、機能/フレームワークレベルのアプリケーションおよびデバイスをテストしたり、ユニットテストキットを実行したりすることですが、もちろん他の目的にも使用できます.
二、monkeyrunnerツールとMonkeyツールの違い
Monkey:
Monkeyツールは、デバイスまたはシミュレータのadb shellで直接実行され、ユーザーまたはシステムの擬似ランダムイベントストリームを生成します.
monkeyrunner:
monkeyrunnerツールは、ワークステーション上でAPIによって定義された特定のコマンドおよびイベント制御デバイスまたはシミュレータです.
三、monkeyrunnerのテストタイプ
1、マルチデバイス制御:monkeyrunner APIは複数のデバイスまたはシミュレータにまたがってテストキットを実施することができる.すべてのデバイスを同じ時間に接続したり、すべてのシミュレータを一度に起動したり(またはすべて一緒に)、プログラムに従って順番に各デバイスに接続して、1つ以上のテストを実行したりすることができます.プログラムで構成されたシミュレータを起動し、1つ以上のテストを実行してシミュレータを閉じることもできます.
2、機能テスト:monkeyrunnerは1つのアプリケーションのために自動的に機能テストを貫徹することができる.キーまたはタッチイベントの入力値を指定し、出力結果のスクリーンショットを観察します.
3、回帰テスト:monkeyrunnerはアプリケーションを実行し、その結果のスクリーンショットを既知の正しい結果のスクリーンショットと比較して、アプリケーションの安定性をテストすることができます.
4、拡張可能な自動化:monkeyrunnerはAPIツールパッケージであるため、Pythonモジュールとプログラムに基づいてシステムを開発し、Androidデバイスを制御することができます.monkeyrunner APIのほか、標準のPython osおよびsubprocessモジュールを使用してAndroid Debug BridgeのようなAndroidツールを呼び出すこともできます.
四、monkeyrunnerの実行
コードファイルを直接使用してmonkeyrunnerを実行するか、インタラクティブなダイアログでmonkeyrunner文を入力できます.いずれにしても、SDKディレクトリのtoolsサブディレクトリのmonkeyrunnerコマンドを呼び出す必要があります.実行パラメータとしてファイル名を指定すると、monkeyrunnerはファイルの内容をPythonプログラムとして実行します.そうでなければ、インタラクティブな会話環境が提供されます.
monkeyrunnerのコマンド構文は、次のとおりです.
monkeyrunner -plugin
五、実例
サンプル中のApiDemosを例にとると、まずApiDemosを生成する.apk.
前提:既存のデバイス接続
1、ApiDemos.アプリは$Android_Roottoolsの下.
2、$Android_Roottoolsの下にmonkeyrunnerprogramを新規作成pyファイル、内容は:

   
   
   
   
1 # Imports the monkeyrunner modules used by this program
2  
3   from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
4
5   # Connects to the current device, returning a MonkeyDevice object
6  
7 device = MonkeyRunner.waitForConnection()
8
9   # Installs the Android package. Notice that this method returns a boolean, so you can test
10  
11   # to see if the installation worked.
12  
13 device.installPackage( ' ./ApiDemos.apk ' )
14
15
16   # Runs the component
17  
18 device.startActivity(component = ' com.example.android.apis/.ApiDemos ' )
19
20
21   # Presses the Menu button
22  
23 device.press( ' KEYCODE_MENU ' , ' DOWN_AND_UP ' )
24
25
26   # Takes a screenshot
27  
28 result = device.takeSnapshot()
29
30
31   # Writes the screenshot to a file
32  
33 result.writeToFile( ' ./shot1.png ' , ' png ' )


注意:SDKの例にはエラーがあり、直接コピーすることはできません.そうしないと、コマンドを実行するときにエラーが発生します.具体的には、私の上記のコードと照合することができます. 
3、コマンドラインを開いてAndroid_Roottoolsディレクトリの下でコマンドを実行します.
monkeyrunner monkeyrunnerprogram.py
110307 15:33:19.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.
110307 15:33:20.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.
110307 15:33:21.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice] Error starting command: monkey --port 12345
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]com.android.ddmlib.ShellCommandUnresponsiveException
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.ddmlib.Device.executeShellCommand(Device.java:276)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.monkeyrunner.adb.AdbMonkeyDevice$1.run(AdbMonkeyDevice.java:89)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.Executors$RunnableAdapter.call(UnknownSource)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.FutureTask.run(Unknown Source)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)
110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.lang.Thread.run(UnknownSource)
110307 15:33:57.437:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: press KEYCODE_MENU.
110307 15:33:59.171:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: quit.
注意:exceptionのヒントは無視できます.Monkey Command:press KEYCODEが見えるからです.MENUは正常に実行されました.
4、Android_Roottoolsの下に生成されたshot 1を表示します.pngのスクリーンショット.
六、実例拡張
ApiDemosトップページでMENUキーを押すとメニューが表示されないため,よりイメージ化するために実例5に基づいて試験を継続する.
1、$Android_Roottoolsの下にmonkeyrunnerprogram 1を新規作成します.pyファイル、内容は:

   
   
   
   
1 # Imports the monkeyrunner modules used by this program
2  
3   from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
4
5 # Connects to the current device, returning a MonkeyDevice object
6
7 device = MonkeyRunner.waitForConnection()
8
9 # Takes a screenshot
10
11 result = device.takeSnapshot()
12
13 # Writes the screenshot to a file
14
15 result.writeToFile( ' ./shotbegin.png ' , ' png ' )
16
17 # Presses the Down button
18
19 device.press( ' KEYCODE_DPAD_DOWN ' , ' DOWN_AND_UP ' )
20
21 device.press( ' KEYCODE_DPAD_DOWN ' , ' DOWN_AND_UP ' )
22
23 device.press( ' KEYCODE_DPAD_DOWN ' , ' DOWN_AND_UP ' )
24
25 device.press( ' KEYCODE_DPAD_DOWN ' , ' DOWN_AND_UP ' )
26
27 device.press( ' KEYCODE_DPAD_DOWN ' , ' DOWN_AND_UP ' )
28
29 # Takes a screenshot
30
31 result = device.takeSnapshot()
32
33 # Writes the screenshot to a file
34
35 result.writeToFile( ' ./shotend.png ' , ' png ' )


2、画面をApidemosのトップページに位置決めし、カーソルを第1項に位置決めする.
3、$Android_Roottoolsディレクトリの下でコマンドを実行します.
monkeyrunner monkeyrunnerprogram1.py
4、実行中にカーソルが下に移動し、現在のディレクトリの下でカスタマイズできるスクリーンショットを見ることができます.
実行前:shotbegin.png
  Android 测试工具------ monkeyrunner工具_第1张图片
実行後(5回下へ移動):shotend.png
Android 测试工具------ monkeyrunner工具_第2张图片
参考資料:
http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html