Android自動測試之monkeyrunner工具(一)

前言:

  最近開始研究Android自動化測試方法,對其中的一些工具的使用還不太瞭解都在學習中,整理資料也爲了自己的學習可以有個總結。因接觸時間很短,很多地方有不足之處,希望能和大家多多交流。

 

一、什麼是monkeyrunner

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

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

  Monkey:

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

  monkeyrunner:

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

  三、monkeyrunner的測試類型

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

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

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

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

  四、運行monkeyrunner


Monkeyrunner API

主要包括三個模塊

1、MonkeyRunner:這個類提供了用於連接monkeyrunner和設備或模擬器的方法,它還提供了用於創建用戶界面顯示提供了方法。

2、MonkeyDevice:代表一個設備或模擬器。這個類爲安裝和卸載包、開啓Activity、發送按鍵和觸摸事件、運行測試包等提供了方法。

3、MonkeyImage:這個類提供了捕捉屏幕的方法。這個類爲截圖、將位圖轉換成各種格式、對比兩個MonkeyImage對象、將image保存到文件等提供了方法。


#引用導入API

from com.android.monkeyrunner import <module> 

 

運行monkeyrunner


命令語法爲:


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

 


方式一:在CMD命令窗口直接運行monkeyrunner


方式二:使用Python編寫測試代碼文件,在CMD中執行monkeyrunner Findyou.py運行


不論使用哪種方式,您都需要調用SDK目錄的tools子目錄下的monkeyrunner命令。


注意:在運行monkeyrunner之前必須先運行相應的模擬器或連接真機,否則monkeyrunner無法連接到設備

運行模擬器有兩種方法:1、通過eclipse中執行模擬器 2、在CMD中通過命令調用模擬器

 

附:

問題:CMD運行提示monkeyrunner不是內部或外部命令,也不是可運行的程序或批處理文件。

解決:電腦環境變量未配置,將monkeyrunner所在目錄配在環境變量裏。

變量名:Path

變量值:D:\android\android-sdk-windows\tools;D:\android\android-sdk-windows\platform-tools



五、實例

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

  前提:已有device連接

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

  2、 在$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上的例子有些錯誤,不可直接複製,否則執行命令時會發生錯誤。具體可與我的上面這段代碼對照。

  3、 打開命令行轉到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已經執行成功。

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


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