App穩定性測試Monkey
1.$ adb shell monkey <event-count> <event-count>是隨機發送事件數
例:adb shell monkeyn 1000 傳送1000個隨機事件
2.$ adb shell monkey [options] <event-count> [options]是monkey可傳入的引數
Monkey的option主要分為:常規類、事件類、約束類和除錯類4種
2.1 常規類命令:
adb shell monkey -v <event-count>
-v:打印出日誌資訊,每個-v將增加反饋資訊的級別。-v越多日誌資訊越詳情,最多支援3個-v
2.2 事件類命令:
$ adb shell monkey -f <scriptfile> <event-count>
-f:後接測試指令碼名,表示要使用monkey執行指定的monkey指令碼,
如:$ adb shell monkey -f /mnt/sdcard/test01 3
注:這裡的3是指迴圈次數,不是事件數
如果希望重複執行之前的隨機操作,需要加-s命令,可指定隨機數生成器seed值
$ adb shell monkey -s <seed> <event-count>
-s:後接隨機數生成器的seed值,如果使用相同的seed值再次執行monkey,將生成相同的事件序列(也就是說,重複執行剛才的隨機操作)
如: $ adb shell monkey -s 100 1000
$ adb shell monkey --throttle <milliseconds>
--throttle:後面接時間,單位為ms,表示事件之間的固定延遲(即執行每一個指令間隔的時間),如果不接該項,monkey將不會延遲
$ adb shell monkey --pct-touch <percent>
--pct-touch:後面接觸控事件百分比,觸控事件泛指發生在某一位置的一個down-up事件,點選
$ adb shell monkey --pct-montion <percent>
--pct-motion:後面接動作事件百分比,動作事件泛指從某一位置接下(即down事件)後經過一系列偽隨機事件後彈出(即up事件)
$ adb shell monkey --pct-trackball <percent>
--pct-trackball:後面接軌跡事件百分比,軌跡事件包括一系列的隨機移動,以及偶爾跟隨在移動後面的點選事件
$ adb shell monkey --pct-nav <percent>
--pct-nav:後面接基本導航事件百分比,基本導航事件主要來自方向輸入裝置的上、下、左、右事件
$ adb shell monkey --pct-majornav <percent>
--pct-marjornav:後面接主要導航事件百分比,主要導航事件通常指引發圖形介面的一些動作,如鍵盤中間按鍵、返回按鍵、選單按鍵等
$ adb shell monkey --pct-syskeys <percent>
--pct-syskeys:後面接系統按鍵事件百分比,系統按鍵事件通常指僅供系統使用的保留按鍵,如HOME鍵、BACK鍵、撥號鍵、結束通話鍵、音量鍵等
$ adb shell monkey --pct-appswtich <percent>
--pct-appswitch:後面接應用啟動事件百分比,應用啟動事件(activity launches)即開啟應用,通過呼叫startActivity()方法最大限度地開啟該package下的所有應用
$ adb shell monkey --pct-anyevent <percent>
--pct-anyevent:後面接其他型別事件百分比,其他型別事件指上文中未涉及的所有其他事件,如keypress、不常用的button等
2.3約束類命令
約束類命令可以讓隨機事件執行的範圍限制在某幾個包或類中。
$ adb shell monkey -p <allowed-package-name> <event-count>
-p:後面接一個或多個包名,如果不指定任何包,monkey將允許系統啟動全部包裡的Activity。每個-p對應一個包,指定多個包時每個包名前都需要加上-p
如:$ adb shell monkey -p com.agent.tao 1000 執行com.agent.tao 包裡的Activity併發送1000個隨機事件
$ adb shell monkey -c <main-category> <event-count>
-c:後面接一個或多個類別名,monkey將只允許系統啟動這些類別中某個類別列出的Activity,如果不指定任何類別,monkey將選擇Intent.CATEGORY_LAUNCHER和Intent.CATEGORY_monkey裡的Activity
每個-c對應一個類別,指定多個類別時每個類別名前面都需要加上-c
如:$ adb shell monkey -c Intent.CATEGORY_LAUNCHER 1000
執行Inter.CATEGORY_LAUNCHER類別的Activity併發送1000個隨機事件
2.4除錯類命令
通過除錯類命令可以對monkey進行簡單的除錯,這樣可以快速定位monkey執行中的問題
$ adb shell monkey --dbg-no-events <event-count>
--dbg-no-events:設定此項後,monkey將進行初始啟動,進入到某個測試Activity中不會進一步生成事件,可以監視應用程式所呼叫的包之間的轉換,為了更好的跟蹤,一般該項
會與-v(日誌)、-p<allowed-package-name> (包約束) 和 --throttle<milliseconds> (延遲)等聯合使用
$ adb shell monkey --hprof <event-count>
--hprof:設定此項後,將在monkey事件序列前後立即生成profilfing report,將在data/misc中生成5MB左右大小的檔案
$ adb shell monkey --ignore-crashes <event-count>
--ignore-crashes:設定此項後,當應用程式崩潰或發生失控異常時,monkey將繼續執行直到計數完成。如果不設定此項,monkey遇到上述崩潰或異常將停止執行。
$ adb shell monkey --ignore-timeouts <event-count>
--ignore-timeouts:設定此項後,當應用程式發生任何超時錯誤(如ANR,即Application Not Responding)時,monkey將繼續執行直到計數完成。如果不設定此項,monkey
遇到此類超時將停止執行
$ adb shell monkey --kill-process-after-error <event-count>
--kill-process-after-error:設定此項後,當monkey因為應用程式發生錯誤而停止時,將會通知系統停止發生錯誤的程序。如果不設定此項,monkey停止時發生錯誤的應用程度將
繼續處於執行狀態。
$ adb shell monkey --ignore-security-exceptions <event-count>
--ignore-security-exceptions:設定此項後,當應用程式發生任何許可權錯誤(如啟動一個需要某些許可權的Activity)時,monkey將繼續執行直到計數完成。如果不設定此項,
monkey遇到此類許可權錯誤將停止執行。
$ adb shell monkey --monitor-native-crashes <event-count>
--monitor-native-crashes:設定此項後,monkey執行時native code的崩潰事件將被監視並報告。如果不設定此選項,將不會監視此類事件。
$ adb shell monkey --wait-dbg <event-count>
--wait-dbg:在設定此項後,將暫停執行中的monkey,直到有偵錯程式與它連線。
結果檢查與分析
測試結束後,需要將手機連線PC,拷貝以下檔案:
- info.txt:此檔案在手機上的SDCARD中,主要記錄了MONKEY測試時傳送的各種事件,如觸控事件的位置等等。
- error.txt:此檔案在手機上的SDCARD中,主要記錄了MONKEY測試時產生的一些ANR、強制關閉等異常。
- LOG檔案:此檔案在手機上的LOG資料夾中中,主要主要記錄程式對MONKEY測試時的響應情況。
我們需要對這3個檔案進行分析整理,以便提交開發人員處理。
檢查測試是否完成
通過info.txt檔案,可以檢視Monkey是否執行成功。如下圖
結果分析整理
我們目前執行Monkey測試的目的是為了檢查是否有記憶體洩露,而這類問題主要是通過Log檔案來體現的。
Error檔案也記錄了部分異常,考慮到這部分檔案格式已經很規範,因此不需要再次整理。
Log檔案記錄了所有資訊,因此我們需要進行初步分析整理後再提交研發,以減少研發工作量。
Monkey測試後在Mobilelog檔案中會產生多個main_log檔案,裡面含有詳細的log執行記錄。通過main_log檔案,我們可以檢視可能存在記憶體洩露程式碼所在具體位置。是否該行程式碼存在洩露需要開發人員進一步驗證。我們只提供可能存在程式碼洩露的資訊。
含有mian_log的檔案都需要進行檢視。搜尋關鍵字“leak”,在搜尋結果中,檢視與Ideafreiend相關的程式碼。如下圖:
注:com.lenovo.ideafriend:Ideafriend包名;CursorLeakDetecter: 遊標洩露檢查器
1. 程式無響應的問題: 在日誌中搜索 “ANR”
2. 崩潰問題:在日誌中搜索 “Exception” (如果出現空指標, NullPointerException) 肯定是有bug