monkeyrunner

一、什麼是monkeyrunner

monkeyrunner工具提供了一個API,使用此API寫出的程序可以在Android代碼之外控制Android設備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應用程序或測試包,運行它,向它發送模擬擊鍵,截取它的用戶界面圖片,並將截圖存儲於工作站上。monkeyrunner工具的主要設計目的是用於測試功能/框架水平上的應用程序和設備,或用於運行單元測試套件,但您當然也可以將其用於其它目的。

二、monkeyrunner工具同Monkey工具的差別

Monkey:

Monkey工具直接運行在設備或模擬器的adbshell中,生成用戶或系統的僞隨機事件流。

monkeyrunner:

monkeyrunner工具則是在工作站上通過API定義的特定命令和事件控制設備或模擬器。

三、monkeyrunner的測試類型

1、多設備控制:monkeyrunnerAPI可以跨多個設備或模擬器實施測試套件。您可以在同一時間接上所有的設備或一次啓動全部模擬器(或統統一起),依據程序依次連接到每一個,然後運行一個或多個測試。您也可以用程序啓動一個配置好的模擬器,運行一個或多個測試,然後關閉模擬器。

2、功能測試:monkeyrunner可以爲一個應用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數值,然後觀察輸出結果的截屏。

3、迴歸測試:monkeyrunner可以運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。

4、可擴展的自動化:由於monkeyrunner是一個API工具包,您可以基於Python模塊和程序開發一整套系統,以此來控制Android設備。除了使用monkeyrunnerAPI之外,您還可以使用標準的Pythonos和subprocess模塊來調用AndroidDebugBridge這樣的Android工具。

四、運行monkeyrunner

您可以直接使用一個代碼文件運行monkeyrunner,抑或在交互式對話中輸入monkeyrunner語句。不論使用哪種方式,您都需要調用SDK目錄的tools子目錄下的monkeyrunner命令。如果您提供一個文件名作爲運行參數,則monkeyrunner將視文件內容爲Python程序,並加以運行;否則,它將提供一個交互對話環境。

monkeyrunner的命令語法爲:

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

五、實例

以sample中的ApiDemos爲例,先將其生成ApiDemos.apk。

前提:已有device連接

1、將ApiDemos.apk放在$Android_Root\tools下。

2、在$Android_Root\tools下新建一個monkeyrunnerprogram.py文件,裏面內容爲:

複製代碼
1#Importsthemonkeyrunnermodulesusedbythisprogram
2
3fromcom.android.monkeyrunnerimportMonkeyRunner,MonkeyDevice,MonkeyImage
4
5#Connectstothecurrentdevice,returningaMonkeyDeviceobject
6
7device=MonkeyRunner.waitForConnection()
8
9#InstallstheAndroidpackage.Noticethatthismethodreturnsaboolean,soyoucantest
10
11#toseeiftheinstallationworked.
12
13device.installPackage('./ApiDemos.apk')
14
15
16#Runsthecomponent
17
18device.startActivity(component='com.example.android.apis/.ApiDemos')
19
20
21#PressestheMenubutton
22
23device.press('KEYCODE_MENU','DOWN_AND_UP')
24
25
26#Takesascreenshot
27
28result=device.takeSnapshot()
29
30
31#Writesthescreenshottoafile
32
33result.writeToFile('./shot1.png','png')
複製代碼

注意:SDK上的例子有些錯誤,不可直接複製,否則執行命令時會發生錯誤。具體可與我的上面這段代碼對照。

3、打開命令行轉到Android_Root\tools目錄下運行一下命令:

monkeyrunnermonkeyrunnerprogram.py

11030715:33:19.625:I[main][com.android.monkeyrunner.MonkeyManager]MonkeyCommand:wake.

11030715:33:20.625:I[main][com.android.monkeyrunner.MonkeyManager]MonkeyCommand:wake.

11030715:33:21.625:I[main][com.android.monkeyrunner.MonkeyManager]MonkeyCommand:wake.

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]Errorstartingcommand:monkey--port12345

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]com.android.ddmlib.ShellCommandUnresponsiveException

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atcom.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atcom.android.ddmlib.Device.executeShellCommand(Device.java:276)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atcom.android.monkeyrunner.adb.AdbMonkeyDevice$1.run(AdbMonkeyDevice.java:89)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atjava.util.concurrent.Executors$RunnableAdapter.call(UnknownSource)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atjava.util.concurrent.FutureTask$Sync.innerRun(UnknownSource)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atjava.util.concurrent.FutureTask.run(UnknownSource)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atjava.util.concurrent.ThreadPoolExecutor$Worker.runTask(UnknownSource)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atjava.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)

11030715:33:22.718:S[pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]atjava.lang.Thread.run(UnknownSource)

11030715:33:57.437:I[main][com.android.monkeyrunner.MonkeyManager]MonkeyCommand:pressKEYCODE_MENU.

11030715:33:59.171:I[main][com.android.monkeyrunner.MonkeyManager]MonkeyCommand:quit.

注:裏面exception的提示我們可以忽略,因爲我們可以看見MonkeyCommand:pressKEYCODE_MENU已經執行成功。

4、可以Android_Root\tools下查看生成的shot1.png的截圖。

六、實例擴展

因爲ApiDemos首頁上按下MENU鍵沒有菜單出現,爲了更加形象化,在實例五的基礎上繼續試驗:

1、在$Android_Root\tools下新建一個monkeyrunnerprogram1.py文件,裏面內容爲:

複製代碼
1#Importsthemonkeyrunnermodulesusedbythisprogram
2
3fromcom.android.monkeyrunnerimportMonkeyRunner,MonkeyDevice,MonkeyImage
4
5#Connectstothecurrentdevice,returningaMonkeyDeviceobject
6
7device=MonkeyRunner.waitForConnection()
8
9#Takesascreenshot
10
11result=device.takeSnapshot()
12
13#Writesthescreenshottoafile
14
15result.writeToFile('./shotbegin.png','png')
16
17#PressestheDownbutton
18
19device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')
20
21device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')
22
23device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')
24
25device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')
26
27device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')
28
29#Takesascreenshot
30
31result=device.takeSnapshot()
32
33#Writesthescreenshottoafile
34
35result.writeToFile('./shotend.png','png')
複製代碼

2、將畫面定位在Apidemos的首頁,並將光標定位在第一項上。

3、在$Android_Root\tools目錄下運行一下命令:

monkeyrunnermonkeyrunnerprogram1.py

4、在運行過程中我們可以看見光標不斷向下移動,並且可以在當前目錄下我們自定義的截圖:

運行前:shotbegin.png

2011031018192770.png

運行後(做了五次下移操作):shotend.png

2011031018194173.png

轉自:http://www.cnblogs.com/yyangblog/archive/2011/03/10/1980086.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章