轉載:monkeyrunner工具

                                     

前言:html

最近開始研究Android自動化測試方法,對其中的一些工具、方法和框架作了一些簡單的整理,其中包括 android測試框架、CTS、Monkey、Monkeyrunner、benchmark、其它test tool等等。因接觸時間很短,不少地方有不足之處,但願能和你們多多交流。java

 

1、什麼是monkeyrunnerandroid

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

2、monkeyrunner工具同Monkey工具的差異api

Monkey:框架

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

monkeyrunner:工具

monkeyrunner工具則是在工做站上經過API定義的特定命令和事件控制設備或模擬器。單元測試

3、monkeyrunner的測試類型測試

一、多設備控制:monkeyrunner API能夠跨多個設備或模擬器實施測試套件。您能夠在同一時間接上全部的設備或一次啓動所有模擬器(或通通一塊兒),依據程序依次鏈接到每個,而後運行一個或多個測試。您也能夠用程序啓動一個配置好的模擬器,運行一個或多個測試,而後關閉模擬器。

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

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

四、 可擴展的自動化:因爲monkeyrunner是一個API工具包,您能夠基於Python模塊和程序開發一整套系統,以此來控制Android設備。除了使用monkeyrunner API以外,您還可使用標準的Python os和subprocess模塊來調用Android Debug Bridge這樣的Android工具。

4、運行monkeyrunner

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

monkeyrunner的命令語法爲:

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

5、實例

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

前提:已有device鏈接

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

二、 在$Android_Root\tools下新建一個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上的例子有些錯誤,不可直接複製,不然執行命令時會發生錯誤。具體可與個人上面這段代碼對照。
 

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

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已經執行成功。

四、 能夠Android_Root\tools下查看生成的shot1.png的截圖。

6、實例擴展

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

一、 在$Android_Root\tools下新建一個monkeyrunnerprogram1.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 ' )
複製代碼

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

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

monkeyrunner monkeyrunnerprogram1.py

四、在運行過程當中咱們能夠看見光標不斷向下移動,而且能夠在當前目錄下咱們自定義的截圖:

運行前:shotbegin.png

 

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

參考資料:

http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html

相關文章
相關標籤/搜索