(一)Monkey簡介
Monkey意指猴子,頑皮淘氣。所以Monkey測試,顧名思義也就像猴子一樣在軟體上亂敲按鍵,猴子什麼都不懂,就愛搗亂。Monkey原理也是類似,通過向系統發送偽隨機的用戶事件流(如按鍵輸入、觸控螢幕輸入、滑動Trackball、手勢輸入等操作),來對設備上的程序進行壓力測試,檢測程序多久的時間會發生異常,在功能測試完成後進行monkey測試。
Monkey包括許多選項,它們大致分為四大類:
(1)基本配置選項,如設置嘗試的事件數量;
(2)運行約束選項,如設置只對單獨的一個包進行測試;
(3)事件類型和頻率;
(4)調試選項;
總結:Monkey測試用於發現App測試中的問題(如ANR(Application Not Responding),響應延時以及CRASH,非正常退出)
(二)Money原理
在Monkey運行的時候,它生成事件,並把它們發給系統。同時,Monkey還對測試中的系統進行監測,對下列三種情況進行特殊處理(自動停止):
(1)如果限定了Monkey運行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操作,並對其進行阻止;
(2)如果應用程式崩潰或接收到任何失控異常,Monkey將停止並報錯;
(3)如果應用程式產生了應用程式不響應(application notresponding)的錯誤,Monkey將會停止並報錯;
按照選定的不同級別的反饋信息,在Monkey中還可以看到其執行過程報告和生成的事件。
(1)Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑是:
/system/framework/monkey.jar;
(2)Monkey.jar程序是由一個名為「monkey」的Shell腳本來啟動執行,shell腳本在Android文件系統中的存放路徑是:/system/bin/monkey;
(3)通過在cmd窗口中執行:adb shell monkey {+命令參數}來進行Monkey測試;
(三)Money架構
Monkey 運行在設備或模擬器上面,可以脫離PC運行(普遍做法是將monkey作為一個像待測應用發送 隨機按鍵消息的測試工具。驗證待測應用在這些隨機性的輸入面前是否會閃退或者崩潰)
(四)Money參數大全
Event percentages(事件百分比):
0:點擊事件百分比,即參數--pct-touch
1:滑動事件百分比,即參數--pct-motion
2:縮放事件百分比,即參數--pct-pinchzoom
3:軌跡球事件百分比,即參數--pct-trackball
4:屏幕旋轉事件百分比,即參數--pct-rotation
5:基本導航事件百分比,即參數--pct-nav
6:主要導航事件百分比,即參數--pct-majornav
7:系統按鍵事件百分比,即參數--pct-syskeys
8:Activity啟動事件百分比,即參數--pct-appswitch
9:鍵盤喚出隱藏事件百分比,即參數--pct-flip
10:其他事件百分比,即參數--pct-anyevent
(五)Money命令詳解
關於環境,我們已經在之前搭建好了,在cmd中輸入:adb devices
出現下面信息,表示環境是ok的。(首先確保環境沒問題才能執行其他命令)
要測試App的穩定性,首先要獲取到要測試的App的包名。在工作中可以直接問開發索取包名,或者根據經驗自己輸入命令查找包名也行。
方法1:
獲取所有包名:
adb shell pm list package
獲取第三方包名:
adb shell pm list package -3
方法2:獲取包名和activity
adb logcat | findstr START
輸入該命令,然後點擊要啟動的app,即可獲取到包名和activity
之後輸入一些Monkey命令,就可以開始測試。
//獲取Monkey命令自帶的幫助,在cmd中執行命令:
adbshell monkey -help
//指定一個包讓Monkey程序模擬100次隨機用戶事件
adb shell monkey -pcom.sf.DarkCalculator100
說明:參數-p用於約束限制,用此參數指定一個或多個包(即App)。指定包之後,Monkey將只允許系統啟動指定的APP;如果不指定包,Monkey將允許系統啟動設備中的所有APP,com.sf.DarkCalculator為包名,100是事件計數。
//指定日誌級別Level 0
adb shell monkey -p com.sf.DarkCalculator –v 100
說明:日誌級別用於指定反饋信息級別(信息級別就是日誌的詳細程度),日誌級別 Level 0 ,僅提供啟動提示、測試完成和最終結果等少量信息。
/指定日誌級別Level 1
adb shell monkey -p com.sf.DarkCalculator –v -v100
說明:日誌級別 Level 1,提供較為詳細的日誌,包括每個發送到Activity的事件信息。
//指定日誌級別Level 2
adb shell monkey -p com.sf.DarkCalculator –v -v-v 100
說明:日誌級別 Level 2,提供最詳細的日誌,包括了測試中選中/未選中的Activity信息。
--throttle <毫秒>
用於指定用戶操作(即事件)間的時延,單位是毫秒;如果不指定這個參數,monkey會儘可能快的生成和發送消息。
//指定用戶操作(即事件)間的時延
adb shell monkey -p com.sf.DarkCalculator –-throttle 1000-v 100
說明:throttle單位是毫秒。
//調整觸摸事件的百分比
adb shell monkey -p com.sf.DarkCalculator --pct-touch10 -v1000
說明:--pct-{+事件類別}{+事件類別百分比}用於指定每種類別事件的百分比(在Monkey事件序列中,該類事件數目佔總事件數目的百分比),--pct-touch {+百分比}用於調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)。
/調整動作事件的百分比
adb shell monkey -p com.sf.DarkCalculator --pct-motion20 -v1000
說明:調整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的偽隨機事件和一個up事件組成)。
//調整軌跡事件的百分比
adb shell monkey -p com.sf.DarkCalculator --pct-trackball30-v 1000
說明:調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)。
//調整「基本」導航事件的百分比
adb shell monkey -p com.sf.DarkCalculator --pct-nav40-v 1000
說明:調整「基本」導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)。
//調整主要導航事件的百分比
adb shell monkey -p com.sf.DarkCalculator --pct-majornav50-v 1000
說明:調整主要導航事件的百分比(這些導航事件通常引發圖形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)。
//調整系統按鍵事件的百分比
adb shell monkey -p com.sf.DarkCalculator --pct-syskeys60 -v1000
說明:調整系統按鍵事件的百分比(這些按鍵通常被保留,由系統使用,如Home、Back、Start Call、EndCall及音量控制鍵)
//指定多個類型事件的百分比
adb shell monkey -p com.sf.DarkCalculator --pct-touch50 --pct-motion 50 1000
注意:各事件類型的百分比總數不能超過100%
//即使app崩潰,Monkey依然繼續發送事件,直到事件數目達到目標值為止
adb shell monkey -p com.sf.DarkCalculator --ignore-crashes-v 1000
說明:用於指定當應用程式崩潰時(Force& Close錯誤),Monkey是否停止運行。如果使用--ignore-crashes參數,即使應用程式崩潰,Monkey依然會發送事件,直到事件計數達到1000為止。
//即使APP發生ANR,Monkey依然繼續發送事件,直到事件數目達到目標值為止
adb shell monkey -p com.sf.DarkCalculator --ignore-timeouts-v 1000
說明:用於指定當應用程式發生ANR(ApplicationNo Responding)錯誤時,Monkey是否停止運行如果使用--ignore-timeouts參數,即使應用程式發生ANR錯誤,Monkey依然會發送事件,直到事件計數完成。
----
通過以上描述,我們了解了Monkey是什麼,Monkey是如何實現對APP進行壓力測試,也熟悉了Monkey基本的命令,今天將在之前的基礎上進行補充和拓展,一起深入接觸並掌握Monkey,這之後,我們還將總結APP測試常見問題!
Monkey參數的約束限制規範:
1. 一個 -p 選項只能用於一個包,指定多個包,需要使用多個 -p 選項;
2.-s <seed> 偽隨機數生成器的seed值,如果用相同的seed值再次運行monkey,它將生成相同的事件序列,對9個事件分配相同的百分比;
3.-v 命令行的每一個-v將增加反饋信息的級別:
Level 0為一個-v的命令,除了啟動的提示、測試完成和最終結果之外,提供較少的信息 ;Level 1為兩個-v的命令,提供較為詳細的測試信息,如逐個發送到Activity的事件 ;Level 2為三個-v的命令,提供更加詳細的測試信息,如測試中被選中或未被選中的Activity;
常見命令組合:
1.monkey -pcom.package -v 500 :簡單的輸出測試的信息;
2.monkey -pcom.package -v -v -v 500 :以深度為三級輸出測試信息;
3.monkey -pcom.package --port 埠號 -v :為測試分配一個專用的埠號,不過這個命令只能輸出跳轉的信息及有錯誤時輸出信息;
4.monkey -pcom.package -s 數字 -v 500 :為隨機數的事件序列定一個值,若出現問題下次可以重複同樣的系列進行排錯;
5.monkey -p com.package-v --throttle 3000 500
:為每一次執行一次有效的事件後休眠3000毫秒;
Monkey測試參數建議
間隔時間:500毫秒;
種子數:隨機;
遇到錯誤:不停止;
執行時長:每機型不小於12小時或點擊次數:100萬次;
機型覆蓋建議:覆蓋高中低端機型
不同晶片平臺(高通、海思、MTK等)
不同解析度(480*800以上主流解析度)
不同安卓版本(安卓4.0以上主流安卓版本);
Monkey參考命令
adb shell monkey-p com.tencent.XXX(替換包名) --throttle 500 --ignore-crashes--ignore-timeouts --ignore-security-exceptions --ignore-native-crashes -v -v -v 1000000>d:\monkeyScreenLog.log
測試可以發現的問題
Android平臺應用程式可能產生以下兩種問題:
1、Crash
2、ANR (響應延時)
Monkey日誌定位問題
1 .典型Monkey測試日誌文件輸出,如下://主要Log文件說明
anr目錄:從手機/data/anr導出的日誌,保存發生anr crash 時的相關信息;
2 .通過日誌定位問題步驟
(1)在MonkeyScreen.Log日誌文件搜索關鍵詞「Fatal」、「Crash」、「ANR」定位到發生Crash的詳細堆棧信息,或分析發生Crash前後的日誌事件;
如圖:
然後把相應的日誌發給開發即可。