Monkey測試結果分析
一、什么是monkey
Monkey 測試是 Android 自動化測試的手段之一,它通過模擬用戶的按鍵輸入、觸摸屏輸入等,測試設備多長時間出現異常。Monkey 是一個命令行工具,可以運行在模擬器或實際設備中,通過向系統發送偽隨機的用戶事件流,實現對全系統或某個應用程序進行壓力測試。
二、操作
真機連接電腦,啟動cmd執行命令:
(如果是復制下面的命令,容易出錯,命令是不能換行的。可以先復制到QQ對話框,修改后復制到adb中運行)
adb devices //查看是否連接正常
adb shell monkey -p com.komect.community -s 3156 --hprof
--pct-touch 18
--pct-anyevent 0
--pct-motion 18
--pct-trackball 18
--pct-majornav 10
--pct-nav 0
--pct-syskeys 18
--pct-flip 0
--pct-pinchzoom 0
--pct-appswitch 18
-v -v -v --throttle 800 250000 > D:/monkey_test.log
三、指定測試的約束選項
1、指定測試的包
對某一個具體的應用進行測試,可指定具體的包名。可以在系統目錄/data/data下查找對應的包名:
//在cmd中執行
adb shell
su
cd /data/data
ls //找到自己的那個包名
//或者
adb shell
pm list package –f
查找到對應的包名后,使用 monkey 時可用“-p”參數進行指定,此外還可以使用“-v”參數指定測試中反饋的信息。常用格式如下:
monkey –p (指定的包名) –v 50
注意:每個“-p”只能指定一個包,若需指定對多個包進行測試,則要用多個“-p”參數進行指定。
2、指定測試的類
若需對某個具體類進行測試,可以使用“-c”參數指定,若需指定多個類別,則要用多個“-c”參數選項分別指定,每個“-c”只能指定一個類別。其使用的命令格式為:
monkey –c (類名) -v 50
注意:想要查看手機中所有包名及類名,需要有root權限。
3、指定測試的時間類型和頻率
Monkey 命令提供了眾多選項用於指定事件的類型和發生頻率, 例如觸摸事件、 導航事件、軌跡事件(由一個或多個隨機的移動組成,有時還伴隨有點擊)。有時為了測試某個具體應用,需要通過“事件”的反復發生來進行專項的功能測試,此時即可通過 monkey 的“--pct”選項來進行指定具體事件及其發生的頻率。
1)命令使用格式如下示例:
monkey --pct-syskeys 18 –v 1000
以上命令表示系統按鍵事件的發生率為 18%,共測試 1000 次。
注意:“pct”前面是英文輸入狀態下兩個杠“-”。
2)還可以分別指定兩個事件的發生頻率,命令使用方式如下所示:
monkey --pct-touch 18 --pct-trackball 18 –v 1000
以上命令表示觸摸事件和軌跡事件發生概率分別為 18%和 18%,共測試 1000 次。
3)通過“--throttle”指定事件間的間隔,可以延緩事件的發生,如:
monkey --pct-nav 80 --throttle 1000 1000
指定導航事件發生概率為 80%,每次事件相隔 1 秒中發生,共測試 1000 次。
Monkey運行結果中對應的事件為:
0:--pct-touch
//touch events percentage觸摸事件百分比(觸摸事件是一個在屏幕單一位置的按下-抬起事件)
1:--pct-motion
//motion events percentage手勢事件百分比
(手勢事件是由一個在屏幕某處的按下事件、一系列的偽隨機移動、一個抬起事件組成)即一個滑動操作,但是是直線的,不能拐彎
2:--pct-pinchzoom
//pinch zoom events percentage二指縮放百分比,即智能機上的放大縮小手勢操作
3:--pct-trackball
//trackball events percentage軌跡球事件百分比
(軌跡球事件包括一個或多個隨機移動,有時還伴有點擊。軌跡球現在智能手機上已經沒有了,就是類似手柄的方向鍵一樣)
4:--pct-rotation
//screen rotation events percentage屏幕旋轉百分比,橫屏豎屏
5:--pct-nav
//nav events percentage”基本”導航事件百分比
(導航事件包括上下左右,如方向輸入設備的輸入)老手機的上下左右鍵,智能機上沒有
6:--pct-majornav
//major nav events percentage”主要”導航事件百分比
(這些導航事件通常會引發UI的事件,例如5-way pad的中間鍵、回退鍵、菜單鍵)
7:--pct-syskeys
//system(key) operations percentage”系統”按鈕事件百分比
(這些按鈕一般專供系統使用,如Home, Back, Start Call, End Call,音量控制)
8:--pct-appswitch
//app switch events percentage啟動activity事件百分比。在隨機的間隔里,Monkey會執行一個startActivity()調用,作為最大程度覆蓋包中全部Activity的一種方法
9:--pct-flip
//keyboard flip percentage鍵盤輕彈百分比,如點擊輸入框,鍵盤彈起,點擊輸入框以外區域,鍵盤收回
10:--pct-anyevent
//anyevents percentage其他類型事件百分比。包括了其他所有的類型事件,如按鍵、其他不常用的設備上的按鈕等等。
4、指定測試的調試選項
Monkey 命令提供了若干用於控制測試過程的調試選項。例如參數“--ignore-crashes” ,將忽略應用程序崩潰或發生的任何異常,繼續向系統發送事件,直到計數完成。使用命令格式如下:
monkey --ignore-crashes -v 5000
常用的調試選項及說明如下:
--dbg-no-events
設置此選項,Monkey將執行初始啟動,進入到一個測試Activity,然后不會再進一步生成事件。為了得到最佳結果,把它與-v、一個或幾個包約束、以及一個保持Monkey運行30秒或更長時間的非零值聯合起來,從而提供一個環境,可以監視應用程序所調用的包之間的轉換。
--ignore-crashes
通常,當應用程序崩潰或發生任何失控異常時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。
--ignore-timeouts
通常,當應用程序發生任何超時錯誤(如“Application Not Responding”對話框)時,Monkey將停止運行。如果設置此選項,Monkey將繼 續向系統發送事件,直到計數完成。
--ignore-security-exceptions
通常,當應用程序發生許可錯誤(如啟動一個需要某些許可的Activity)時,Monkey將停止運行。如果設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。
--kill-process-after-error
通常,當Monkey由於一個錯誤而停止時,出錯的應用程序將繼續處於運行狀態。當設置了此選項時,將會通知系統停止發生錯誤的進程。注意,正常的(成功的)結束,並沒有停止啟動的進程,設備只是在結束事件之后,簡單地保持在最后的狀態。
--monitor-native-crashes
監視並報告Android系統中本地代碼的崩潰事件。如果設置了--kill-process-after-error,系統將停止運行。
--wait-dbg
停止執行中的Monkey,直到有調試器和它相連接。
5、monkey測試的停止條件
Monkey Test執行過程中在下列三種情況下會自動停止:
1)如果限定了Monkey運行在一個或幾個特定的包上,那么它會監測試圖轉到其它包的操作,並對其進行阻止。
2)如果應用程序崩潰或接收到任何失控異常,Monkey將停止並報錯。
3)如果應用程序產生了應用程序不響應(applicationnot responding)的錯誤,Monkey將會停止並報錯。
通過多次並且不同設定下的Monkey測試才算它是一個穩定性足夠的程序。
強制停止monkey測試的方法:
- adb shell
- ps | grep monkey(找到monkey對應的進程ID)
- kill pid (返回的第一個數字就是pid)
6、執行monkey測試的關注點
1)monkey只支持activity。App項目工程的manifest.xml中可以看到所有的activity,service。
2)在跑的過程中,絕對不要使用兩個不同版本的sdk、adb。絕對不要去使用阿德巴deivces,killserver。如果使用,會將服務終止。手機的monkey不會停止,但是log就沒有了
3)monkey本身雖然是一個random壓力,性能測試工具,但是我們在做測試之前也需要做一些准備。
4)monkey test和logcat是同步的。一般來講,跑monkey的時間,RC版本之后,relaease之前,每天都需要去跑,一般一個應用上線前25w次。0 null point exception。
四、Monkey測試結果分析
1、日志保存操作
日志保存的操作方法:
//cmd命令中
Adb shell
cd sdcard
mkdir monkey
cd monkey
(monkey主要內容) > monkey_test.txt
//一般將日志導入電腦:
D:/monkey_test.txt
2、Monkey測試出現錯誤后,一般的差錯步驟為以下幾步:
(1) 找到是monkey里面的哪個地方出錯
(2) 查看Monkey里面出錯前的一些事件動作,並手動執行該動作
(3) 若以上步驟還不能找出,可以使用之前執行的monkey命令再執行一遍,注意seed值要一樣
3、一般的測試結果分析:
搜索關鍵詞:ANR、 Exception、 Null、 Error、 crash(Fatal)
(1) ANR問題:在日志中搜索“ANR”
ANR=Application Not Responding
在Android上,如果你的應用程序有一段時間響應不夠靈敏(5秒內沒有輸入響應事件),系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應(ANR:Application Not Responding)對話框。
(2) 崩潰問題:在日志中搜索“Exception”
Null 指針異常:空指針異常主要是有 NullPointerException 異常提示
debug 異常:出現的是 IllegalStateException 異常
低內存異常:出現的是 OutOfMemoryError 異常
操作無響應異常:TimerOut(KeyDispatchingTimedOut 提示)
RuntimeException 異常(操作無響應或應用的服務無法啟動或連接)
StaleDataException/readException 異常(android 數據庫出現異常)
IllegalArgumentException 異常(向函數傳遞了一個不正確或不合法的參數)
4、詳細分析monkey日志
將執行Monkey生成的log,從手機中導出並打開查看該log;在log的最開始都會顯示Monkey執行的seed值、執行次數和測試的包名。
首先我們需要查看Monkey測試中是否出現了ANR或者異常,具體方法如上述。
然后我們要分析log中的具體信息,方法如下:
查看log中第一個Switch,主要是查看Monkey執行的是那一個Activity,譬如下面的log中,執行的是com.tencent.smtt.SplashActivity,在下一個swtich之間的,如果出現了崩潰或其他異常,可以在該Activity中查找問題的所在。
:Switch:#Intent; action=android.intent.action.MAIN; category=android.intent.category.LAUNCHER; launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity;end // Allowing start of Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.smtt/.SplashActivity } in package com.tencent.smtt
在下面的log中,Sending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表當前執行了一個單擊的操作;
Sleeping for 500 milliseconds //這句log是執行Monkey測試時,throttle設定的間隔時間,每出現一次,就代表一個事件。 SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 代表當前執行了一個點擊下導航鍵的操作; Sending Pointer ACTION_MOVE //代表當前執行了一個滑動界面的操作。 :Sending Pointer ACTION_DOWN x=47.0 y=438.0 :Sending Pointer ACTION_UP x=47.0 y=438.0 Sleeping for 500 milliseconds :SendKey (ACTION_DOWN): 20 //KEYCODE_DPAD_DOWN :SendKey (ACTION_UP): 20 //KEYCODE_DPAD_DOWN Sleeping for 500 milliseconds :Sending Pointer ACTION_MOVE x=-2.0 y=3.0 :Sending Pointer ACTION_MOVE x=4.0 y=-3.0 :Sending Pointer ACTION_MOVE x=-5.0 y=-3.0 :Sending Pointer ACTION_MOVE x=3.0 y=4.0 :Sending Pointer ACTION_MOVE x=-4.0 y=1.0 :Sending Pointer ACTION_MOVE x=-1.0 y=-1.0 :Sending Pointer ACTION_MOVE x=-2.0 y=-4.0
如果Monkey測試順利執行完成,在log的最后,會打印出當前執行事件的次數和所花費的時間;// Monkey finished代表執行完成。Monkey執行中斷,在log的最后也能查看到當前已執行的次數。
1)Monkey執行完成的log具體如下:
Events injected: 5000 :Sending rotation degree=0, persist=false // Generated profiling reports in /data/misc :Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0 ## Network stats: elapsed time=805050ms (0ms mobile, 0ms wifi, 805050ms not connected) // Monkey finished
2)Monkey執行典型崩潰日志情況如下:
// Injection Failed ** Monkey aborted due to error. Events injected: 101 :Sending rotation degree=0, persist=false // Generated profiling reports in /data/misc :Dropped: keys=0 pointers=1 trackballs=0 flips=0 rotations=0 ## Network stats: elapsed time=14710ms (0ms mobile, 0ms wifi, 14710ms not connected) ** System appears to have crashed at event 101 of 3000 using seed 3156
注:如果出現monkey崩潰,可以抓取手機系統日志分析:adb logcat -v time >D:/test_log.txt
謝謝查看,繼續努力。