qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Android自動測試之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可以跨多個設備或模擬器實施測試套件。您可以在同一時間接上所有的設備或一次啟動全部模擬器(或統統一起),依據程序依次連接到每一個,然后運行一個或多個測試。您也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉模擬器。
            2、 功能測試: monkeyrunner可以為一個應用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數值,然后觀察輸出結果的截屏。
            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 <plugin_jar> <program_filename> <program_options>
            五、實例
            以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的截圖。
            六、實例擴展
            因為ApiDemos首頁上按下MENU鍵沒有菜單出現,為了更加形象化,在實例五的基礎上繼續試驗:
            1、 在$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')
            2、  將畫面定位在Apidemos的首頁,并將光標定位在第一項上。
            3、  在$Android_Root\tools目錄下運行一下命令:
            monkeyrunner monkeyrunnerprogram1.py
            4、在運行過程中我們可以看見光標不斷向下移動,并且可以在當前目錄下我們自定義的截圖:
            運行前:
            運行后(做了五次下移操作):

          posted on 2014-06-09 10:28 順其自然EVO 閱讀(164) 評論(0)  編輯  收藏 所屬分類: android

          <2014年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 邯郸县| 布拖县| 淄博市| 子长县| 垫江县| 丹东市| 海盐县| 剑阁县| 墨江| 喀喇沁旗| 安化县| 盈江县| 镶黄旗| 肥东县| 射阳县| 景德镇市| 万年县| 彭泽县| 泰和县| 治县。| 江陵县| 黄梅县| 德化县| 左权县| 黎平县| 东莞市| 黑山县| 黑水县| 建湖县| 栾川县| 武强县| 简阳市| 宣武区| 连州市| 元谋县| 仁怀市| 定西市| 无极县| 石狮市| 鄱阳县| 嘉祥县|