Monkey測試結果分析


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

  

  謝謝查看,繼續努力。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM