Monkey&Monkey Runner使用

 

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 測試工具Monkey & Monkeyrunner 使用方法

程序編寫完成後進行測試必定是必不可少的,Android Sdk給咱們提供了MonkeyMonkeyrunner這兩個自動化測試工具。時光境遷,隨着版本的不斷更新迭代,MonkeyMonkeyrunner也在不斷的改變,改變的速度甚至已經到了官方文檔有時都跟不上了,這無疑給咱們的學習帶來不少困擾。python

今天我把我近期使用MonkeyMonkeyrunner的一些體會與你們分享,Sdk版本爲Rev22.01Api17(4.22).android

1、什麼是Monkey

   Monkey是一個命令行工具,能夠運行在模擬器裏或實際設備中。它向系統發送僞隨機的用戶事件流,實現對正在開發的應用程序進行壓力測試。Monkey包括許多選項,它們大體分爲四大類:
· 基本配置選項,如設置嘗試的事件數量。
· 運行約束選項,如設置只對單獨的一個包進行測試。
· 事件類型和頻率。
· 調試選項。shell

2、Monkey的基本用法

基本語法以下: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

3、Monkey實例測試

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

等等信息。

4、Monkey中止的條件

Monkey Test執行過程當中在下列三種狀況下會自動中止:

一、若是限定了Monkey運行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操做,並對其進行阻止。

二、若是應用程序崩潰或接收到任何失控異常,Monkey將中止並報錯。

三、若是應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會中止並報錯。

經過屢次而且不一樣設定下的Monkey測試纔算它是一個穩定性足夠的程序。

MonkeyRunner 使用

Monkey的使用簡潔有效,可是老是給人感受功能不夠強大。因此,接下來向你們介紹很是給力的工具MonkeyRunner。

1、什麼是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

2、一個簡單的MonkeyRunner實例

您能夠直接使用一個代碼文件運行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:上述內容,部分參考了 子楊 的博客,在此表示感謝。

3、經常使用功能的Monkeyrunner python腳本介紹:

1.輸入等基本操做測試
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'); 
2.圖形化記錄與回放

利用

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 ,很是感謝。

4、使用插件擴展Monkeyrunner

您能夠用Java語言建立新的類,並打包成一個或多個.jar文件,以此來擴展monkeyrunnerAPI。您可使用您本身寫的類或者繼承現有的類來擴展monkeyrunnerAPI。您還可使用此功能來初始化monkeyrunner環境。

爲了使monkeyrunner加載一個插件,您應當如使用如1中所述的-plugin參數來調用monkeyrunner命令。

在您編寫的插件中,您能夠導入或繼承位於com.android.monkeyrunner包中的幾個主要的monkeyrunner類:MonkeyDeviceMonkeyImageMonkeyRunner.

請注意,插件沒法讓你訪問AndroidSDK。您不能導入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.  } 

 

5、常見問題(評論中的問題會不斷補充)

1.「device.touch(10,100, 'DOWN_AND_UP')」 爲何報錯?
ANS:能夠把 'DOWN_AND_UP' 替換爲 'MonkeyDevice.DOWN_AND_UP' ,這個問題的主要緣由跟Monkeyrunner有關。
 
2.我輸入了不少指令,可是不少沒有執行
Ans:能夠嘗試  MonkeyRunner.sleep(time_in_seconds) 方法,讓不一樣的動做之間有間隔。
相關文章
相關標籤/搜索