Monkey 是Android SDK提供的一個命令行工具, 可以簡單,方便地運行在任何版本的Android模擬器和實體設備上。 Monkey會發送僞隨機的用戶事件流,如:模擬用戶觸摸屏幕、滑動Trackball、按鍵等操作,適合對app做壓力測試,檢測程序多久的時間會發生異常,所有的事件都是隨機產生的,不帶任何人的主觀性。
目錄
一、環境搭建
1. 安裝 Android SDK 並配置環境變量
2. 手機通過usb連接電腦,自動安裝usb驅動,連接成功
3. 驗證adb命令能否運行
pc端進入cmd命令行---進入C:\tmg目錄下--運行adb shell,出現$符號證明adb命令運行成功,進入shell模式
4. 手機設置
手機屏幕超時設置爲從不關閉,防止手機進入鎖屏狀態。
如:進入設置-顯示--屏幕待機--設置爲從不關閉
二、Monkey簡介
(1) Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑 是: /system/framework/monkey.jar;
(2) Monkey.jar程序是由一個名爲“monkey”的Shell腳本來啓動執行,shell腳本在Android文件系統中 的存放路徑 是:/system/bin/monkey;
(3)Monkey 命令啓動方式:
a)可以通過PC機CMD窗口中執行: adb shell monkey {+命令參數}來進行Monkey測試 (常用的一種方法)
b)在PC上adb shell 進入Android系統,通過執行 monkey {+命令參數} 來進行Monkey 測試
c ) 在Android機或者模擬器上直接執行monkey 命令,可以在Android機上安裝Android終端模擬器
三、Monkey 架構
Monkey 運行在設備或模擬器上面,可以脫離PC運行(普遍做法是將monkey作爲一個像待測應用發送 隨機按鍵消息的測試工具。驗證待測應用在這些隨機性的輸入面前是否會閃退或者崩潰)
四、Monkey 參數大全
基本參數:
-p <允許的包名列表>
用此參數指定一個或多個包。指定包之後,monkey將只允許系統啓動指定的app。如果丌指定包, monkey將允許系統啓動設備中的所有app。
指定一個包:adb shell monkey -p com.shjt.map 100
指定多個包:adb shell monkey -p fishjoy.control.menu –p com.shjt.map 100
-v
用亍指定反饋信息級別(信息級別就是日誌的詳細程度),總共分3個級別,分別對應的參數如下 表所示:
Level 0 : adb shell monkey -p com.shjt.map -v 100 // 缺省值,僅提供啓動提示、測試完成和最終結果等少量信息
Level 1 : adb shell monkey -p com.shjt.map -v -v 100 // 提供較爲詳細的日誌,包括每個發送到Activity的事件信息
Level 2 : adb shell monkey -p com.shjt.map -v -v -v 100 // 最詳細的日誌,包括了測試中選中/未選中的Activity信息
-s(隨機數種子)
用亍指定僞隨機數生成器的seed值,如果seed相同,則兩次Monkey測試所產生的事件序列也相同的。 示例:
monkey測試1:adb shell monkey -p com.shjt.map –s 10 100
monkey測試2:adb shell monkey -p com.shjt.map –s 10 100
--throttle <毫秒>
用亍指定用戶操作(即事件)間的時延,單位是毫秒;如果丌指定這個參數,monkey會盡可能快的 生成和發送消息。 示
例:adb shell monkey -p com.shjt.map --throttle 3000 100
--ignore-crashes --ignore-timeouts
--ignore-crashes --ignore-timeouts 這裏是在monkey測試的過程中遇到carash或者timeout的情況時忽略掉,一般不設置時,出現carash或者timeout時,Monkey測試會終止。這裏是防止Monkey測試終止。
五、Monkey 實例
adb shell monkey -p 包名 -v 運行次數
例一:adb shell monkey –p com.huanxi.video –-throttle 100 –-pct-touch 50 –-pct-motion 50 –v –v 1000 >c:\monkey.txt
例二: monkey -s 23 --ignore-crashes --ignore-timeouts -v-v -v 100000> /data/local/tmp/log.txt 2>&1 &
2>&1 固定的寫法,這個也很重要,代表的意思是中間忽略的東東的日誌一併輸入到指定的文件中。
最後單獨的一個"&" 是一旦Monkey測試開始了,之後可以拔掉數據線,不會影響Monkey測試。
六、Monkey 日誌分析
1.正常情況, 如果Monkey測試順利執行完成, 在log的最後, 會打印出當前執行事件的次數和所花費的時間; // Monkey finished 代表執行完成
2.異常情況
Monkey 測試出現錯誤後,一般的分析步驟
看Monkey的日誌 (注意第一個swith以及異常信息等)
1. 程序無響應的問題: 在日誌中搜索 “ANR”
2. 崩潰問題:在日誌中搜索 “Exception” (如果出現空指針, NullPointerException) 肯定是有bug
Monkey 執行中斷, 在log最後也能看到當前執行次數
3. 重現bug:monkey日誌搜索關鍵詞ANR exception,將之前的事件重新操作,尤其是seed值要一模一樣,如monkey -p 包名 -v seed 0 500
在log的最開始都會顯示Monkey執行的seed值、執行次數和測試的包名。
首先我們需要查看Monkey測試中是否出現了ANR或者異常,無響應問題(ANR問題):在日誌中搜索“ANR ”(此處有空格), 崩潰問題:在日誌中搜索“Exception”,快速定位到關鍵事件信息 。然後查看Monkey裏面出錯前的一些事件動作,並手動執行該動作,找出重現步驟,給開發。
4.分析
無響應問題搜索”ANR”
奔潰問題搜索”CRASH”
內存泄漏問題搜索”GC”,並進一步分析
異常問題搜索”Exception”,如出現NullpointerException,則出現空指針,需要重視
有這類的情況再進行具體分析
七、殺monkey進程
如果想中斷運行中的monkey CTRL+C
adb shell ps | grep monkey 返回進程號
adb shell kill [剛纔查到的進程號]
八、必須重視Crash
雖然Monkey測試有部分缺陷,我們無法準確地得知重現步驟, Monkey測試所出現的NullPointException, 都是可以在用戶使用時出現的, 何時出現只是時間問題理論上來說, Monkey所有的Crash 都需要在發佈前修復掉
九、獲取包名
adb shell pm list package -f #顯示所有apk包名包括系統
adb shell dumpsys window w | findstr \/ | findstr name= #會顯示正打開的程序