1. 程式人生 > 其它 >monkey使用及其常用命令

monkey使用及其常用命令

概念:
monkey test,也有人叫做搞怪測試,一般指用毫無規律的指令或操作去測試被測系統,觀察被測系統的穩定性和容錯性。這種測試方式在產品週期中的早期階段會找到很多很好的bug,為使用者節省不少的時間。

介紹:
Monkey是Android系統自帶一個命令列工具,可以執行在模擬器裡或者真實裝置中執行。monkey向系統傳送偽隨機的使用者事件流,實現對正在開發的應用程式進行壓力測試。
monkey包括很多選項,大致四大類:
1.基本配置選項,如設定嘗試的事件數量。
2.執行約束選項,如設定只對單獨的一個包進行測試。
3.事件型別和頻率。
4.除錯選項

Monkey 命令啟動方式:
a. 可以通過PC機CMD視窗中執行: adb shell monkey {+命令引數}來進行Monkey測試
b. 在PC上adb shell 進入Android系統,通過執行monkey {+命令引數} 來進行Monkey 測試
c. 在Android機或者模擬器上直接執行monkey 命令,可以在Android機上安裝Android終端模擬器

monkey命令特性:
不可能使用monkey來指定做一樣測試,重複做很多次。因為monkey產生的是偽隨機的事件流。但是我們可以通過新增命令選項將操作限制在一定的範圍內。

一、首先你要先搭建環境
1.先下載jdk具體安裝流程請參考:JDK教程
2.再下載sdk 具體安裝流程請參考:SDK教程
二、在開發者選項裡開啟手機的usb除錯,用usb資料線連線手機,允許電腦連線手機。
三、monkey前的準備命令
1.windows+R 輸入cmd進入dos命令列;
2.輸入adb devices 下面出現類似下圖的組合你就成功了;
3.輸入 adb shell pm list packages檢視手機所有的包名,輸入 adb shell pm list packages -3 檢視手機上所有的第三方包名。
四、引數介紹
1.引數-p
用於約束限制,用此引數指定一個或多個package,指定包之後,monkey將只允許系統啟動指定的APP,如果不指定包,monkey將允許啟動裝置中所有APP。
不指定包:adb shell monkey 100
指定一個包:adb shell monkey -p com.tencent.news 100
指定多個包:adb shell monkey -p com.tencent.news 100 -p com.tencent.news 100*
-p空格後面是軟體包名;100表示測試事件次數。
2. 引數-v
用於指定反饋日誌的詳細程度,總共範圍內3個級別
日誌級別 level 0
adb shell monkey -p com.tencent.news -v 100
說明:僅提供啟動提示,測試完成和最終結果等少量資訊
日誌級別 level 1
adb shell monkey -p com.tencent.news -v -v 100
說明:提供較為詳細的日誌,包括每個傳送到Activity的事件資訊
日誌級別 level 2
adb shell monkey -p com.tencent.news -v -v -v 100
說明:提供最詳細的日誌,包括測試中選中(未選中的)Activity的事件資訊
3. 引數-s
用於指定偽隨機數生成器的send值,如果send相同則兩次monkey測試所產生的事件序列也相同。
Monkey測試 1
adb shell monkey -p com.tencent.news -s 10 100
Monkey 測試 2
adb shell monkey -p com.tencent.news -s 10 100
說明:兩次測試的效果是相同的,因為模擬的使用者操作序列(每次操作按照一定的先後順序所組成的一系列操作,即一個序列)是一樣的。操作序列雖然是隨機生成的,但是隻要指定了相同的send值,就可以保證兩次測試產生的隨機操作序列是完全相同的,所以這個操作序列是偽隨機的。
4. 引數–throttle<單位:毫秒>
說明:用於指定兩個事件之間一個固定延遲,可以減緩monkey的執行速度。如果不指定,monkey將不會被延遲,事件將盡可能快地生成和傳送訊息。
adb shell monkey --throttle 3000 -p com.tencent.news 100
向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。
5. 引數–pct -{+事件型別}{+事件型別的百分比}
引數列表檢視如下,引數後面緊接著是百分比 0-100,百分比的總量不能大於100
(1)–pct-touch 觸控事件
adb shell monkey --throttle 3000 --pct-touch 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定觸控的事件佔比為50%
說明:觸控事件是指在螢幕某處按下並抬起的操作,就模擬日常手機使用中的點選操作。

(2)–pct-motion 滑動事件
adb shell monkey --throttle 3000 --pct-motion 50 -p com.tencent.news 100
解釋: 向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定滑動的事件佔比為50%
說明:滑動事件是指在螢幕某處按下、隨機移動、抬起的操作。類似於我們日常的滑動螢幕翻頁的操作。日誌顯示與觸控事件相似。

(3)–pct-pinchzoom 縮放事件
adb shell monkey --throttle 3000 --pct-pinchzoom 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定縮放的事件佔比為50%
說明:縮放事件是指在螢幕上的兩處同時按下,並同時移動,最後同時抬起。就是平時我們使用時的放大縮小操作。
(4)–pct-trackball 軌跡事件
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定軌跡的事件佔比為50%
說明:軌跡事件是由一個或多個隨機的移動組成的,有時會伴隨點選。早期的智慧機帶有軌跡球,這個時間就是軌跡球的操作。現在幾乎沒有軌跡球了,但這個軌跡事件包含了曲線滑動事件,如果被測應用程式需要曲線滑動才需要設定該事件百分比。
(5)–pct-rotation 螢幕旋轉事件
adb shell monkey --throttle 3000 --pct-rotation 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定螢幕旋轉的事件佔比為50%
說明:這是一個隱藏事件,用於模擬手機的橫豎屏切換。該事件由 rotation 事件組成, 其中 degree 表示選裝方向, 順時針旋轉,
0 表示旋轉 90 度
1 表示 180 度
2 表示旋轉 270 度
3 表示旋轉 360 度
(6)–pct-nav 基本導航事件
adb shell monkey --throttle 3000 --pct-nav 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定基本導航的事件佔比為50%
說明:基本導航事件是指點選方向輸入裝置的上、下、左、右按鍵的操作,現在手機上很少有這樣的方向鍵了。因此該事件用得相對很少。
(7)–pct-majornav 主要導航事件
adb shell monkey --throttle 3000 --pct-majornav 50 -p com.tencent.news 100
解釋: 向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定主要導航的事件佔比為50%
說明:主要導航事件是指點選“主要導航”按鈕的操作。這些按鍵通常會導致 UI 介面的動作。如回退按鍵、選單按鍵等。
(8)–pct-flip 鍵盤事件
adb shell monkey --throttle 3000 --pct-flip 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定鍵盤的事件佔比為50%
說明: 調整鍵盤事件主要是指一些與鍵盤相關的操作。如點選輸入框、鍵盤彈起、點選輸入框以外區域、鍵盤收回等
(9)–pct-appswitch 切換 Activity 事件
adb shell monkey --throttle 3000 --pct-flip 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定切換Activity事件佔比為50%
說明:切換 Activity 事件是指在手機上啟動一個 Activity 的操作。 在隨機的時間間隔中, Monkey 將執行一個 StartActivity 方法, 作為最大限度上覆蓋被測包中全部 Activity 的一種方法。(Activity 這個概念簡單但不準確的理解可以認為就是頁面的意思)如果該事件比例偏低,你將會看到大部分時間的測試都停留在同一個頁面上,因此適當設定該事件的比例是很有必要的。
(10)–pct-syskeys 系統按鍵事件
adb shell monkey --throttle 3000 --pct-ssyskeys 50 -p com.tencent.news 100
解釋: 向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定系統按鍵的事件佔比為50%
說明:系統按鍵事件是指點選系統保留使用的按鍵操作,如點選 HOME鍵、返回鍵、音量調節鍵等。
(11)–pct-anyevent 其它型別事件
adb shell monkey --throttle 3000 --pct-anyevent 50 -p com.tencent.news 100
解釋:向騰訊新聞傳送1000次隨機事件,每次事件間隔為3秒。其中設定其他型別的事件佔比為50%
說明:其它型別事件除了上面的事件以外的其他事件。它包羅了所有其它型別的事件,如:按鍵、其它不常用的裝置按鈕、等等。

6. 引數–hprof 需root許可權
adb shell monkey -p com.tencent.news --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkey.txt
指定了該引數,monkey會在傳送事件的前後生成效能分析報告,通常會在data/misc目錄下生成一個5MB左右大小的檔案。
7. 引數–ignore-crashes(忽略應用程式崩潰)
用於指定當應用程式崩潰時(Force&Close錯誤)monkey是否停止執行。若使用此引數,即使應用程式崩潰,monkey依然會發送事件,直到事件計數完成。
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --ignore-crashes 100
8. 引數–ignore-timeouts(忽略應用程式無響應)
通常情況下,當應用程式發生任何ANR(application not responding)錯誤時,monkey將停止執行。若指定了該引數,則monkey將會在產生錯誤資訊後,繼續向系統傳送事件,直到指定事件全部執行完畢
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --ignore-timeouts 100
9. 引數–ignore-security-exceptions(忽略許可權問題異常)
通常情況下,指定應用程式發生許可錯誤時(如證書許可,網路許可等),monkey將停止執行。若指定了該引數,即使應用程式發生許可錯誤,monkey會繼續向系統傳送事件,直到指定事件全部執行完畢。
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --ignore-security-exceptions 100
10. 引數–kill-process-after-error(發生錯誤後停止執行)
用於指定當應用程式發生錯誤時,是否停止其執行。如果指定此引數,當應用程式發生錯誤時,應用程式停止執行並保持在當前狀態
(*注意:應用程式僅是靜止在發生錯誤時的狀態,系統並不會結束該應用程式的程序)。
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --kill-process-after-error 100
11. 引數–monitor-native-crashes
用於指定是否監視並報告應用程式發生崩潰的原生代碼。
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --monitor-native-crashes 100
五、Monkey報告組成
第一部分:包含 seed值,執行次數、包名
第二部分:被測裝置上的所有應用包名,本次測試使用到哪些包,未使用哪些包(建議測試某app時,殺掉其他應用程序)
第三部分:各個事件所佔百分比,只顯示了事件的代號,沒有顯示具體什麼時間,可以查詢monkey原始碼中各代號對應的事件,所有事件包含: 第四部分:具體事件
第五部分:log 完成
如果Monkey測試順利執行完成,在log的最後,會打印出當前執行事件的次數和所花費的時間;
// Monkey finished代表執行完成。
如果Monkey執行中斷,在log的最後也能檢視到當前已執行的次數。Monkey執行完成的log具體如下:
六、Monkey分析報告
1.在日誌中搜索關鍵字:
1)搜尋報告中的關鍵字“ANR”,看有無應用無響應的事件(Application Not Responding)
2)搜尋報告中的關鍵字“crash”,看有無崩潰的事件
3)搜尋報告中的關鍵字“exception”,看有無其他異常事件。(如果出現空指標NullPointerException,需格外重視)下面的屬於monkey自己的問題。不用管。
4)記憶體洩露問題搜尋"GC"(需進一步分析)
2. 初步分析法: monkey出現錯誤後,一般的分析步驟
1)先找到出現錯誤的位置
2)查看出現錯誤之前2個switch之間的activity
3)手動執行事件,復現問題
4)若以上步驟還不能找出,產生錯誤時,有會seed值,輸入相同的seed值,重新按照之前命令跑monkey
3.詳細分析法:
1) ANR問題:在日誌中搜索“ANR”(“Application Not Responding"),說明有bug,出現ANR,一般是主執行緒的響應超過5秒,或者BroadcastReceiver沒有在10秒內作出響應。這個就是一個比較嚴重的缺陷。把耗時的操作另起執行緒來處理就可以了。
2)分析log中的具體資訊:檢視log中第一個Switch,主要是檢視Monkey執行的是哪一個Activity,譬如下面的log中,執行的是com.tencent.smtt.SplashActivity,在下一個swtich之間的,如果出現了崩潰或其他異常,可以在該Activity中查詢問題的所在。
3)記憶體洩漏
1) 記憶體洩漏彈出out of memory對話方塊
2)對於有記憶體洩漏但是沒有單出out of memory對話方塊的情況,可以通過logcat檔案GC出資訊,(GC:java的垃圾回收機制)
GC_FOR_ALLOC: 因為在分配記憶體時候記憶體不夠引起的
GC_EXPLICIT 表明GC被顯式請求觸發的,如System.gc呼叫,
GC_CONCCURRENT: 表明GC在記憶體使用率達到一定的警戒值時候,自動觸發
GC_BEFORE_OOM 表明在虛擬機器丟擲記憶體不夠異常oom之前,執行最後一次回收記憶體垃圾
3)發現記憶體洩露–記憶體報告分析(利用hprof引數的記憶體快照生成記憶體報告)在發現記憶體洩露後,可以執行相同的monkey,只需多加一個引數–hprof
adb shell monkey -p 包名 --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkey.txt
說明:如果指定了這個選項,monkey會在傳送時間的前後生成APP記憶體快照檔案,一般會在手機裝置的/data/misc目錄下生成hprof的檔案。(注:/data/misc需要root許可權,可以在手機上安裝個RE檢視或通過手機助手檢視)
ps:檔案轉換:配置monkey測試時的sdk-tools下檢視是否hprof-conv命令,在命令列輸入hprof-conv -help得知檔案轉化用法,直接轉化就行,由.hprof轉化成.conv格式。
轉化後的檔案用eclipse的Memory Analyzer tool(MAT)檢視(此外掛可以下載),可以點選 Reports->Leak Suspects連結來生成報告。