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鏈接來生成報告。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章