adb shell monkey -p com.ajb.sp -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > E:\MonkeyTest\monkey_log.txt adb shell monkey -p com.ykq.anjubao_yunkaoqin -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 500 > E:\MonkeyTest\monkey_log.txt
adb shell ps: 查詢進程名html
程序編寫完成後進行測試必定是必不可少的,Android Sdk給咱們提供了Monkey和Monkeyrunner這兩個自動化測試工具。時光境遷,隨着版本的不斷更新迭代,Monkey和Monkeyrunner也在不斷的改變,改變的速度甚至已經到了官方文檔有時都跟不上了,這無疑給咱們的學習帶來不少困擾。python
今天我把我近期使用Monkey和Monkeyrunner的一些體會與你們分享,Sdk版本爲Rev22.01,Api17(4.22).android
Monkey是一個命令行工具,能夠運行在模擬器裏或實際設備中。它向系統發送僞隨機的用戶事件流,實現對正在開發的應用程序進行壓力測試。Monkey包括許多選項,它們大體分爲四大類:
· 基本配置選項,如設置嘗試的事件數量。
· 運行約束選項,如設置只對單獨的一個包進行測試。
· 事件類型和頻率。
· 調試選項。shell
基本語法以下:express
$ adb shell monkey [options]<event-count>
若是不指定options,Monkey將以無反饋模式啓動,並把事件任意發送到安裝在目標環境中的所有包。下面是一個更爲典型的命令行示例,它啓動指定的應用程序,並向其發送500個僞隨機事件:apache
$ adb shell monkey -p your.package.name -v 500
一些經常使用的參數信息:編程
-v 命令行的每個-v將增長反饋信息的級別。Level 0(缺省值)除啓動提示、測試完成和最終結果以外,提供較少信息。Level 1提供較爲詳細的測試信息,如逐個發送到Activity的事件。Level 2提供更加詳細的設置信息,如測試中被選中的或未被選中的Activity。 事件 -s <seed> 僞隨機數生成器的seed值。若是用相同的seed值再次運行Monkey,它將生成相同的事件序列。 --throttle <milliseconds> 在事件之間插入固定延遲。經過這個選項能夠減緩Monkey的執行速度。若是不指定該選項,Monkey將不會被延遲,事件將盡量快地被產成。 --pct-touch <percent> 調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)。 --pct-motion <percent> 調整動做事件的百分比(動做事件由屏幕上某處的一個down事件、一系列的僞隨機事件和一個up事件組成)。 --pct-trackball <percent> 調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)。 --pct-nav <percent> 調整「基本」導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)。 --pct-majornav <percent> 調整「主要」導航事件的百分比(這些導航事件一般引起圖形界面中的動做,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵) --pct-syskeys <percent> 調整「系統」按鍵事件的百分比(這些按鍵一般被保留,由系統使用,如Home、Back、Start Call、End Call及音量控制鍵)。 --pct-appswitch <percent> 調整啓動Activity的百分比。在隨機間隔裏,Monkey將執行一個startActivity()調用,做爲最大程度覆蓋包中所有Activity的一種方法。 --pct-anyevent <percent> 調整其它類型事件的百分比。它包羅了全部其它類型的事件,如:按鍵、其它不經常使用的設備按鈕、等等。 約束限制 -p <allowed-package-name> 若是用此參數指定了一個或幾個包,Monkey將只容許系統啓動這些包裏的Activity。若是你的應用程序還須要訪問其它包裏的Activity(如選擇取一個聯繫人),那些包也須要在此同時指定。若是不指定任何包,Monkey將容許系統啓動所有包裏的Activity。要指定多個包,須要使用多個 -p選項,每一個-p選項只能用於一個包。 -c <main-category> 若是用此參數指定了一個或幾個類別,Monkey將只容許系統啓動被這些類別中的某個類別列出的Activity。若是不指定任何類別,Monkey將選 擇下列類別中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多個類別,須要使用多個-c選項,每一個-c選 項只能用於一個類別。 調試 --dbg-no-events 設置此選項,Monkey將執行初始啓動,進入到一個測試Activity,而後不會再進一步生成事件。爲了獲得最佳結果,把它與-v、一個或幾個包約 束、以及一個保持Monkey運行30秒或更長時間的非零值聯合起來,從而提供一個環境,能夠監視應用程序所調用的包之間的轉換。 --hprof 設置此選項,將在Monkey事件序列以前和以後當即生成profiling報告。這將會在data/misc中生成大文件(~5Mb),因此要當心使用它。 --ignore-crashes 一般,當應用程序崩潰或發生任何失控異常時,Monkey將中止運行。若是設置此選項,Monkey將繼續向系統發送事件,直到計數完成。 --ignore-timeouts 一般,當應用程序發生任何超時錯誤(如「Application Not Responding」對話框)時,Monkey將中止運行。若是設置此選項,Monkey將繼續向系統發送事件,直到計數完成。 --ignore-security-exceptions 一般,當應用程序發生許可錯誤(如啓動一個須要某些許可的Activity)時,Monkey將中止運行。若是設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。 --kill-process-after-error 一般,當Monkey因爲一個錯誤而中止時,出錯的應用程序將繼續處於運行狀態。當設置了此選項時,將會通知系統中止發生錯誤的進程。注意,正常的(成功的)結束,並無中止啓動的進程,設備只是在結束事件以後,簡單地保持在最後的狀態。 --monitor-native-crashes 監視並報告Android系統中本地代碼的崩潰事件。若是設置了--kill-process-after-error,系統將中止運行。 --wait-dbg 中止執行中的Monkey,直到有調試器和它相鏈接。-v 命令行的每個-v將增長反饋信息的級別。Level 0(缺省值)除啓動提示、測試完成和最終結果以外,提供較少信息。Level 1提供較爲詳細的測試信息,如逐個發送到Activity的事件。Level 2提供更加詳細的設置信息,如測試中被選中的或未被選中的Activity。 事件 -s <seed> 僞隨機數生成器的seed值。若是用相同的seed值再次運行Monkey,它將生成相同的事件序列。 --throttle <milliseconds> 在事件之間插入固定延遲。經過這個選項能夠減緩Monkey的執行速度。若是不指定該選項,Monkey將不會被延遲,事件將盡量快地被產成。 --pct-touch <percent> 調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)。 --pct-motion <percent> 調整動做事件的百分比(動做事件由屏幕上某處的一個down事件、一系列的僞隨機事件和一個up事件組成)。 --pct-trackball <percent> 調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)。 --pct-nav <percent> 調整「基本」導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)。 --pct-majornav <percent> 調整「主要」導航事件的百分比(這些導航事件一般引起圖形界面中的動做,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵) --pct-syskeys <percent> 調整「系統」按鍵事件的百分比(這些按鍵一般被保留,由系統使用,如Home、Back、Start Call、End Call及音量控制鍵)。 --pct-appswitch <percent> 調整啓動Activity的百分比。在隨機間隔裏,Monkey將執行一個startActivity()調用,做爲最大程度覆蓋包中所有Activity的一種方法。 --pct-anyevent <percent> 調整其它類型事件的百分比。它包羅了全部其它類型的事件,如:按鍵、其它不經常使用的設備按鈕、等等。 約束限制 -p <allowed-package-name> 若是用此參數指定了一個或幾個包,Monkey將只容許系統啓動這些包裏的Activity。若是你的應用程序還須要訪問其它包裏的Activity(如選擇取一個聯繫人),那些包也須要在此同時指定。若是不指定任何包,Monkey將容許系統啓動所有包裏的Activity。要指定多個包,須要使用多個 -p選項,每一個-p選項只能用於一個包。 -c <main-category> 若是用此參數指定了一個或幾個類別,Monkey將只容許系統啓動被這些類別中的某個類別列出的Activity。若是不指定任何類別,Monkey將選 擇下列類別中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多個類別,須要使用多個-c選項,每一個-c選 項只能用於一個類別。 調試 --dbg-no-events 設置此選項,Monkey將執行初始啓動,進入到一個測試Activity,而後不會再進一步生成事件。爲了獲得最佳結果,把它與-v、一個或幾個包約 束、以及一個保持Monkey運行30秒或更長時間的非零值聯合起來,從而提供一個環境,能夠監視應用程序所調用的包之間的轉換。 --hprof 設置此選項,將在Monkey事件序列以前和以後當即生成profiling報告。這將會在data/misc中生成大文件(~5Mb),因此要當心使用它。 --ignore-crashes 一般,當應用程序崩潰或發生任何失控異常時,Monkey將中止運行。若是設置此選項,Monkey將繼續向系統發送事件,直到計數完成。 --ignore-timeouts 一般,當應用程序發生任何超時錯誤(如「Application Not Responding」對話框)時,Monkey將中止運行。若是設置此選項,Monkey將繼續向系統發送事件,直到計數完成。 --ignore-security-exceptions 一般,當應用程序發生許可錯誤(如啓動一個須要某些許可的Activity)時,Monkey將中止運行。若是設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。 --kill-process-after-error 一般,當Monkey因爲一個錯誤而中止時,出錯的應用程序將繼續處於運行狀態。當設置了此選項時,將會通知系統中止發生錯誤的進程。注意,正常的(成功的)結束,並無中止啓動的進程,設備只是在結束事件以後,簡單地保持在最後的狀態。 --monitor-native-crashes 監視並報告Android系統中本地代碼的崩潰事件。若是設置了--kill-process-after-error,系統將中止運行。 --wait-dbg 中止執行中的Monkey,直到有調試器和它相鏈接。
Monkey的詳細參數信息能夠在這裏查看http://developer.android.com/tools/help/monkey.html,這裏就再也不累述了。app
Windows下(注:2—4步是爲了查看咱們能夠測試哪些應用程序包,可省略):框架
一、 經過eclipse啓動一個Android的emulatorless
二、 在命令行中輸入:adb devices查看設備鏈接狀況
C:\Documents and Settings\Administrator>adb devices List of devices attached emulator-5554 device
三、 在有設備鏈接的前提下,在命令行中輸入:adb shell 進入shell界面
C:\Documents and Settings\Administrator>adb shell
四、 查看data/data文件夾下的應用程序包。注:咱們能測試的應用程序包都在這個目錄下面
C:\Documents and Settings\Administrator>adb shell
如:
com.android.htmlviewer
com.android.settings
com.android.netspeed
com.android.providers.userdictionary
com.android.browser
com.android.contacts
com.android.alarmclock
等
5.在其中找到咱們須要測試的包名com.marshalchen.MonkeyTest1
六、 以com.marshalchen.MonkeyTest1 做爲對象進行MonkeyTest
#monkey -p com.marshalchen.MonkeyTest1 -v 500
其中-p表示對象包 –v 表示事件數量
運行過程當中,Emulator中的應用程序在不斷地切換畫面。
按照選定的不一樣級別的反饋信息,在Monkey中還能夠看到其執行過程報告和生成的事件。
如:Sending Pointer ACTION_DOWN x=35.0 y=259.0
:Sending Pointer ACTION_UP x=195.0 y=259.0
:Sending Pointer ACTION_DOWN x=295.0 y=223.0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0
等等信息。
Monkey Test執行過程當中在下列三種狀況下會自動中止:
一、若是限定了Monkey運行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操做,並對其進行阻止。
二、若是應用程序崩潰或接收到任何失控異常,Monkey將中止並報錯。
三、若是應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會中止並報錯。
經過屢次而且不一樣設定下的Monkey測試纔算它是一個穩定性足夠的程序。
Monkey的使用簡潔有效,可是老是給人感受功能不夠強大。因此,接下來向你們介紹很是給力的工具MonkeyRunner。
monkeyrunner工具提供了一個API,使用此API寫出的程序能夠在Android代碼以外控制Android設備和模擬器。經過monkeyrunner,您能夠寫出一個Python程序去安裝一個Android應用程序或測試包,運行它,向它發送模擬擊鍵,截取它的用戶界面圖片,並將截圖存儲於工做站上。monkeyrunner工具的主要設計目的是用於測試功能/框架水平上的應用程序和設備,或用於運行單元測試套件,但您固然也能夠將其用於其它目的。
monkeyrunner工具與monkey工具並沒有關聯。monkey工具直接運行在設備或模擬器的adbshell中,生成用戶或系統的僞隨機事件流。而monkeyrunner工具則是在工做站上經過API定義的特定命令和事件控制設備或模擬器。
monkeyrunner工具爲Android測試提供瞭如下特性:
1.多設備控制:monkeyrunner API能夠跨多個設備或模擬器實施測試套件。您能夠在同一時間接上全部的設備或一次啓動所有模擬器(或通通一塊兒),依據程序依次鏈接到每個,而後運行一個或多個測試。您也能夠用程序啓動一個配置好的模擬器,運行一個或多個測試,而後關閉模擬器。
2.功能測試: monkeyrunner能夠爲一個應用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數值,而後觀察輸出結果的截屏。
3.迴歸測試:monkeyrunner能夠運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。
4.可擴展的自動化:因爲monkeyrunner是一個API工具包,您能夠基於Python模塊和程序開發一整套系統,以此來控制Android設備。除了使用monkeyrunner API以外,您還可使用標準的Python os和subpress模塊來調用如adb這樣的Android工具。
您還能夠向monkeyrunner API中添加您本身的類。
monkeyrunner工具使用Jython(使用Java編程語言的一種Python實現)。Jython容許monkeyrunnerAPI與Android框架輕鬆的進行交互。使用Jython,您可使用Python語法來獲取API中的常量、類以及方法。
MonkeyRunner的參考文獻在這裏:http://developer.android.com/tools/help/monkeyrunner_concepts.html
您能夠直接使用一個代碼文件運行monkeyrunner,抑或在交互式對話中輸入monkeyrunner語句。不論使用哪一種方式,您都須要調用SDK目錄的tools子目錄下的monkeyrunner命令。若是您提供一個文件名做爲運行參數,則monkeyrunner將視文件內容爲Python程序,並加以運行;不然,它將提供一個交互對話環境。
monkeyrunner的命令語法爲:
monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>
monkeyrunnerbasic.py:
# 導入此程序所需的monkeyrunner模塊 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice # 鏈接當前設備,返回一個MonkeyDevice對象 device = MonkeyRunner.waitForConnection() # 安裝Android包,注意,此方法返回的返回值爲boolean,由此您能夠判斷安裝過程是否正常 device.installPackage('myproject/bin/MyApplication.apk') # 運行此應用中的一個活動device.startActivity(component='com.marshalchen.Monkeyrunner.MainActivity') # 按下菜單按鍵 device.press('KEYCODE_MENU','DOWN_AND_UP') # 截取屏幕截圖 result = device.takeSnapShot # 將截圖保存至文件 result.writeToFile('myproject/shot1.png','png')
而後轉到$SDK\TOOLS下執行 monkeyrunner monkeyrunnerbasic.py 就可執行測試了。
PS:上述內容,部分參考了 子楊 的博客,在此表示感謝。
import sys from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner import MonkeyDevice as md from com.android.monkeyrunner import MonkeyImage as mi #connect device 鏈接設備 #第一個參數爲等待鏈接設備時間 #第二個參數爲具體鏈接的設備 device = mr.waitForConnection(1.0,'emulator-5554') if not device: print >> sys.stderr,"fail" sys.exit(1) #定義要啓動的Activity componentName='kg.monkey/.MonkeyActivity' #啓動特定的Activity device.startActivity(component=componentName) mr.sleep(3.0) #do someting 進行咱們的操做 #輸入 a s d device.type('asd') #輸入回車 device.press('KEYCODE_ENTER') #return keyboard 點擊返回用於取消等下看到截圖的下方的白條 #device.press('KEYCODE_BACK') #------ #takeSnapshot截圖 mr.sleep(3.0) result = device.takeSnapshot() #save to file 保存到文件 result.writeToFile('takeSnapshot\\result1.png','png');
利用
1. <span style="font-family:SimSun;">monkeyrunner monkey_recorder.py</span>
腳本,能夠打開如圖所示可視化模擬器,各類操做能夠顯示在屏幕右側,而且經過「Export Actions」導出。
導出以後能夠運行monkeyrunner monkey_playback.py monkey_test1.mr,(monkey_test1.mr爲剛纔保存的腳本),這時能夠看到模擬器,進行剛纔同樣的操做。
補充多設備操做:能夠在monkey_playback.py中的main()方法的device設備獲取時指定多設備。
下面是這兩個有用的腳本:
monkey_recorder.py:
1. #!/usr/bin/env monkeyrunner 2. # Copyright 2010, The Android Open Source Project 3. # 4. # Licensed under the Apache License, Version 2.0 (the "License"); 5. # you may not use this file except in compliance with the License. 6. # You may obtain a copy of the License at 7. # 8. # http://www.apache.org/licenses/LICENSE-2.0 9. # 10. # Unless required by applicable law or agreed to in writing, software 11. # distributed under the License is distributed on an "AS IS" BASIS, 12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13. # See the License for the specific language governing permissions and 14. # limitations under the License. 15. 16. from com.android.monkeyrunner import MonkeyRunner as mr 17. from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder 18. 19. device = mr.waitForConnection() 20. recorder.start(device) monkey_playback.py: 1. #!/usr/bin/env monkeyrunner 2. # Copyright 2010, The Android Open Source Project 3. # 4. # Licensed under the Apache License, Version 2.0 (the "License"); 5. # you may not use this file except in compliance with the License. 6. # You may obtain a copy of the License at 7. # 8. # http://www.apache.org/licenses/LICENSE-2.0 9. # 10. # Unless required by applicable law or agreed to in writing, software 11. # distributed under the License is distributed on an "AS IS" BASIS, 12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13. # See the License for the specific language governing permissions and 14. # limitations under the License. 15. 16. import sys 17. from com.android.monkeyrunner import MonkeyRunner 18. 19. # The format of the file we are parsing is very carfeully constructed. 20. # Each line corresponds to a single command. The line is split into 2 21. # parts with a | character. Text to the left of the pipe denotes 22. # which command to run. The text to the right of the pipe is a python 23. # dictionary (it can be evaled into existence) that specifies the 24. # arguments for the command. In most cases, this directly maps to the 25. # keyword argument dictionary that could be passed to the underlying 26. # command. 27. 28. # Lookup table to map command strings to functions that implement that 29. # command. 30. CMD_MAP = { 31. 'TOUCH': lambda dev, arg: dev.touch(**arg), 32. 'DRAG': lambda dev, arg: dev.drag(**arg), 33. 'PRESS': lambda dev, arg: dev.press(**arg), 34. 'TYPE': lambda dev, arg: dev.type(**arg), 35. 'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg) 36. } 37. 38. # Process a single file for the specified device. 39. def process_file(fp, device): 40. for line in fp: 41. (cmd, rest) = line.split('|') 42. try: 43. # Parse the pydict 44. rest = eval(rest) 45. except: 46. print 'unable to parse options' 47. continue 48. 49. if cmd not in CMD_MAP: 50. print 'unknown command: ' + cmd 51. continue 52. 53. CMD_MAP[cmd](device, rest) 54. 55. 56. def main(): 57. file = sys.argv[1] 58. fp = open(file, 'r') 59. 60. device = MonkeyRunner.waitForConnection() 61. 62. process_file(fp, device) 63. fp.close(); 64. 65. 66. if __name__ == '__main__': 67. main()
PS:腳本內容 部分參考了 youxilua ,很是感謝。
您能夠用Java語言建立新的類,並打包成一個或多個.jar
文件,以此來擴展monkeyrunnerAPI。您可使用您本身寫的類或者繼承現有的類來擴展monkeyrunnerAPI。您還可使用此功能來初始化monkeyrunner環境。
爲了使monkeyrunner加載一個插件,您應當如使用如表1中所述的-plugin
參數來調用monkeyrunner
命令。
在您編寫的插件中,您能夠導入或繼承位於com.android.monkeyrunner
包中的幾個主要的monkeyrunner類:MonkeyDevice
, MonkeyImage
和MonkeyRunner.
請注意,插件沒法讓你訪問
Android
的
SDK
。您不能導入
com.android.app
等包。這是由於
monkeyrunner
是在框架
API
層次之下與設備或模擬器進行交互的。
用於插件的.jar
文件能夠指定一個類,使其在腳本執行以前就實例化。如欲指定這個類,您須要在.jar
文件的manifest中添加鍵MonkeyRunnerStartupRunner
。其值爲啓動時運行的類的名稱。如下代碼段顯示瞭如何在一個ant
構建腳本達到這樣的目的:
如欲訪問
monkeyrunner
的運行時環境,啓動類能夠實現
com.google.common.base.Predicate
。例如,用這個類在默認的命名空間中設置一些變量:
1.
package com.android.example; 2. 3. import com.google.common.base.Predicate; 4. import org.python.util.PythonInterpreter; 5. 6. public class Main implements Predicate { 7. @Override 8. public boolean apply(PythonInterpreter anInterpreter) { 9. 10. /* 11. * Examples of creating and initializing variables in the monkeyrunner environment's 12. * namespace. During execution, the monkeyrunner program can refer to the variables "newtest" 13. * and "use_emulator" 14. * 15. */ 16. anInterpreter.set("newtest", "enabled"); 17. anInterpreter.set("use_emulator", 1); 18. 19. return true; 20. } 21. }
1.「device.touch(10,100, 'DOWN_AND_UP')」 爲何報錯?
ANS:能夠把 'DOWN_AND_UP' 替換爲 'MonkeyDevice.DOWN_AND_UP' ,這個問題的主要緣由跟Monkeyrunner有關。
2.我輸入了不少指令,可是不少沒有執行
Ans:能夠嘗試 MonkeyRunner.sleep(time_in_seconds) 方法,讓不一樣的動做之間有間隔。