Android的Monkey和MonkeyRunner

本文部分解釋性語段摘自網絡百科或其它BLOG,語句內容網絡隨處可見,也不知道誰是初始原創,便再也不署名出處,若有雷同,還請見諒。html

 

Monkey

 

 

 什麼是Monkey


Monkey是Android中的一個命令行工具,能夠運行在模擬器裏或實際設備中。它向系統發送僞隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。Monkey測試是一種爲了測試軟件的穩定性、健壯性的快速有效的方法。java

 

 

 Monkey的特徵

一、 測試的對象僅爲應用程序包,有必定的侷限性。python

二、 Monky測試使用的事件流數據流是隨機的,不能進行自定義。android

三、 可對Test的對象,事件數量,類型,頻率等進行設置。

shell

Monkey的基本用法

基本語法以下:express

 

[java]  view plain  copy
 
  1. adb shell monkey [options] <event-count>  

 

 

 

options event-count
這個是配置monkey的設置,例如,指定啓動那個包,不指定將會隨機啓動全部程序 這個是讓monkey發送多少次事件

詳細的monkey介紹,和options的參數請查看 (http://developer.android.com/guide/developing/tools/monkey.html)

若是不指定options,Monkey將以無反饋模式啓動,並把事件任意發送到安裝在目標環境中的所有包。apache

 

 

Monkey測試的中止條件

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

 

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

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

 

實例

 

下面是一個更爲典型的命令行示例,它啓動指定的應用程序,並向其發送500個僞隨機事件:

 

[java]  view plain  copy
 
  1. adb shell monkey -p your.package.name -vvv 500 > monkeytest.txt  


-p表示對象包  -v 爲 verbose的縮寫(信息級別就是日誌的詳細程度),就是詳細輸出事件等級,這個3個v就是輸出等級1至3的全部事件.(使用管道命令將輸出結果放到一個文本里面方便查看)

 

 

舉例:

eclipse鏈接真機設備,Window打開CMD,命令行輸入:adb shell,進入shell界面後:

我運行的是手機上的 計算器 程序,具體你能夠指定本身的APP包名就能夠了~

真機效果:

如圖所示,它真的就是隨機輸入數值,隨機按鈕,隨機.....的...................缺點是咱們不能控制觸摸或按鈕事件,接下來MonkeyRunner就要登場了~

 

 

 

MonkeyRunner

 

什麼是monkeyrunner

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

 

monkeyrunner同monkey的區別

Monkey工具直接運行在設備或模擬器的adb shell中,生成用戶或系統的僞隨機事件流。monkeyrunner工具則是在工做站上經過API定義的特定命令和事件控制設備或模擬器,它支持,本身編寫插件,控制事件,隨時截圖,簡而言之,任何你在模擬器/設備中能幹的事情,MonkeyRunner都能幹,並且還能夠記錄和回放。

 

monkeyrunner的測試類型

 

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

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

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

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

 

運行monkeyrunner

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

 

monkeyrunner基本語法

 

[java]  view plain  copy
 
  1. monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>  

 

 

具體介紹…看官方文檔(http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html)

 

實例

鏈接真機(模擬器),打開CMD,進入:E:\android-sdk-windows\tools文件夾內(裏面有monkeyrunner.bat)

建立一個Python腳本文件:testrunner.py,內容以下:

注意!若是monkeyrunner腳本文件要使用中文,記得格式保存爲utf8,否則會ASCNII沒法支持錯誤

 

[java]  view plain  copy
 
  1. #導入咱們須要用到的包和類而且起別名  
  2. import sys  
  3. from com.android.monkeyrunner import MonkeyRunner as mr  
  4. from com.android.monkeyrunner import MonkeyDevice as md  
  5. from com.android.monkeyrunner import MonkeyImage as mi  
  6.    
  7. #connect device 鏈接設備  
  8. #第一個參數爲等待鏈接設備時間  
  9. #第二個參數爲具體鏈接的設備  
  10. device = mr.waitForConnection(1.0,'e0d98451')  
  11. if not device:  
  12.     print >> sys.stderr,"fail"  
  13.     sys.exit(1)  
  14. #定義要啓動的Activity  
  15. componentName='com.example.simulate/.ShellActivity'  
  16. #啓動特定的Activity  
  17. device.startActivity(component=componentName)  
  18. mr.sleep(3.0)  
  19. #do someting 進行咱們的操做  
  20. #輸入 helloworld  
  21. device.type('helloworld')  
  22. #輸入回車  
  23. device.press('KEYCODE_ENTER')  
  24. #return keyboard  
  25. #device.press('KEYCODE_BACK')  
  26. #------  
  27. #takeSnapshot截圖  
  28. mr.sleep(3.0)  
  29. result = device.takeSnapshot()  
  30.    
  31. #save to file 保存到文件  
  32. result.writeToFile('./shot1.png','png');  



 

接下來命令行輸入:

 

[java]  view plain  copy
 
  1. monkeyrunner testrunner.py  

 

 

這是一個小的腳本文件,主要是啓動com.example.simulate包名下的ShellActivity界面,接下來按下Enter按鈕,最後截屏,並保存在當前目錄下爲shot1.png,能夠在toosl文件夾下查看。

這個腳本的實質就是一個python腳本,懂python的朋友,能夠利用這個實現很是強悍的功能~~~~~~~~~~~~~~~~~~~~~~~~

 

 

monkeyRunner 的記錄和回放

這纔是真正實用的功能,直接看代碼,建立一個recoder.py:

 

[java]  view plain  copy
 
  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)  


命令行下運行:

 

 

[java]  view plain  copy
 
  1. monkeyrunner monkey_recorder.py  


這時會彈出這樣的界面:

 

按鈕以及一些功能說明:

 

Button Description
Wait 等待時間
Press a Button 發送,MENU,HOME,or SEARCH 按鈕.Press,Down,or Up事件
Type Something 發送一些字符串
Fling 用來操做虛擬鍵盤 
image
Export Action 將咱們的腳本導出來
Refresh Display 刷新當前界面


本身隨心因此建立一些事件腳本,想作什麼就能夠作什麼,經過MonkeyRecorder這個工具來操做設備界面,事件編輯完後選擇Export Actions,導出到咱們tools目錄下命名爲:action.mr

咱們看一下工具生成的action.mr腳本,以下:

 

[java]  view plain  copy
 
  1. TOUCH|{'x':297,'y':533,'type':'downAndUp',}  
  2. WAIT|{'seconds':2.0,}  
  3. TOUCH|{'x':136,'y':278,'type':'downAndUp',}  
  4. WAIT|{'seconds':2.0,}  
  5. TOUCH|{'x':123,'y':356,'type':'downAndUp',}  
  6. WAIT|{'seconds':10.0,}  
  7. PRESS|{'name':'HOME','type':'downAndUp',}  
  8. WAIT|{'seconds':2.0,}  
  9. TOUCH|{'x':235,'y':720,'type':'downAndUp',}  
  10. WAIT|{'seconds':2.0,}  
  11. TOUCH|{'x':303,'y':630,'type':'downAndUp',}  
  12. WAIT|{'seconds':2.0,}  
  13. TOUCH|{'x':16,'y':71,'type':'downAndUp',}  
  14. WAIT|{'seconds':2.0,}  
  15. TOUCH|{'x':244,'y':735,'type':'downAndUp',}  

 

 

 

而後須要製做一個運行這一系列動做的腳本:monkey_playback.py,保存到tools目錄下:

 

[java]  view plain  copy
 
  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()  

 

 

接下來運行咱們的保存的腳本,而後,你就看到真機(模擬器),進行你剛纔同樣的操做~

 

[java]  view plain  copy
 
  1. E:\android-sdk-windows\tools>monkeyrunner monkey_playback.py action.mr  

 

 

個人腳本是執行一些press down 和press up動做,同時會有延遲,以後按下home按鈕,最後打開桌面的短信程序,並打開某一條信息~是否是有點像按鍵精靈的感受?可是得依靠命令行執行腳本~~~

 

至此,monkey和monkeyrunner介紹完畢。

 

附件傳送門地址,網上一位朋友寫好的經常使用的recorder、playback腳本,包括我以上所列py,你能夠本身看着修改,別人的資源,免費共享:

http://download.csdn.net/detail/mad1989/7674089

相關文章
相關標籤/搜索