在Android Virtual Machine上進行Monkey Test

基本環境安裝/設定

Step 1:下載 JDK 6 以上的版本,並安裝

Step 2:接著請到下列官網下載 Android SDK Tools,並安裝

Step 3:開啟 Android SDK Tools, Android 6.0 ~ 4.0.3 版本都打勾安裝

Step 4:

開啟 Android SDK Tools 的 AVD Manager 來增加一台 Android 虛擬機


從 Device Definitions 選擇所要的 Device Template 之後按 Create AVD


選好 CPU 和 Skin 之後按 OK


Step 5:選取 Device 之後按 Start

Monkey Test使用方法

Step 1:

開啟 CMD 執行指令到 C:\Users\使用者帳號\AppData\Local\Android\android-sdk\platform-tools 路徑下

Step 2:

執行指令 adb devices 找到 Device 名稱是 emulator-5554

Step 3:

開始執行 Monkey Test 測試指令
adb -s emulator-5554 shell monkey -v 500

補充:分析adb -s emulator-5554 shell monkey -v 500指令

adb ——>用程式 adb.exe 呼叫 Monkey Test 做測試
-s emulator-5554 ——> 指定測試模擬器名稱
shell monkey ——> 呼叫 Monkey Test 程式
-v 500 ——> 指定測試 500 個活動



測試過程中,模擬器的畫面會跟著測試而改變


測試完成後CMD的視窗顯示如下圖

由上圖的測試結果,可以看到總共注入 500 個活動測試,測試時間是 20664 ms,測試結果是 // Monkey finished 完成的

Step 4:

如果需要指定測試某個 Package,需加的參數如下: -p Package Name ,例如 -p com.android.browser

Step 5:

Package 列表的指令:
adb shell pm list package -f

Step 6:

如果 Monkey Test 測試錯誤,測試報告結果會如下圖:


類別 參數選項 說明
一般 --help 顯示Monkey的相關用法。
-v 每一個 -v 的參數在adb shell monkey之後,會增加執行中的資訊。
只有一個-v的Monkey執行會提供少量的資訊。若有兩個-v (E.g. adb shell monkey -v -v),執行中會堤供較多的訊息,諸如獨自被傳送到你的App (Activity)的事件. 若有三個 -v ,執行中會提供更多像是設定的資訊等的訊息。
事件 -s 亂數種子。用來產生亂數事件使用。
若使用相同的亂數來執行monkey測試,他會產生相同的程序的事件。
--throttle 在每個事件執行後與下個事件產生的間隔時間。若不設定,每個事件無間隔時間。
這個設定可用來緩和測試以避免系統硬體的效能不佳時,排除硬體效能因素所產生的問題。
--pct-touch 調整觸碰事件產生的發生率百分比。(觸碰事件是一個按壓下去與放開於螢幕同一個點的事件)
--pct-motion 調整移動的事件觸發發生率百分比。(這個事件是由一個點按壓下螢幕中的一個點並隨意滑動到另外一個座標位置再放開的事件)
--pct-trackball 調整軌跡球觸發事件。
--pct-nav 調整基本方向按鍵事件的發生率百分比。(方向事件包含上下左右)
--pct-majornav 調整主要的方向按鍵事件的發生百分比。(這些方向的事件一般都是在你的使用者介面有影響,例如五個方向按鍵、返回按鍵(Back)、或是選單按鍵等(Menu))
--pct-syskeys 調整系統按鍵觸發事件的發生率百分比。(例如家按鍵(Home、返回按鍵(Back)、發話按鍵(Start Call),斷話鍵(End Call), 或是聲音鍵(Volumn up/down))
--pct-appswitch 調整App (Activity)啟動的發生率百分比。(Monkey會透過startActivity()這個API呼叫Activity做為最大化測試涵蓋率到你要測試的包裝(package)的方法)
--pct-anyevent 調整其他型態的類別事件發生率的百分比。這是一個可以抓住所有其他型態的如按鍵壓下的事件,其他比較少使用在裝置上的事件等。
限制 -p 限制monkey只測試指定的Packages. 若你要測試的Package會與其他的Package有關連,你必須一起指定這些Package來執行這項參數.若你無使用這個參數,Monkey會測試系統內所有的Package。要指定多個Package必須下達多個 -p,每個 -p 後面只能放一個Package。
-c 若你指定一個或多個分類(categories),Monkey將會只允許系統去探訪你所指定的分類的活動 ( Activity )。若你沒有指定分類,monkey會選取所有列在分類為 Intent.CATEGORY_LAUNCHER 或 Intent.CATEGORY_MONKEY 的活動( activities )。指定多個分類要多次使用 -c 參數,每一個參數只能指定一個分類。
除錯 --dbg-no-events 當指定這個參數,Monkey將操作測試活動 ( activity ) 初始化執行,但將不會產生任何進一步的事件。最佳的結果是與 -v 參數結合使用一個或多個包裝( Package )的限制與一個非零值的 throttle 參數以保持Monkey持續執行超過30秒。這提供一個可以觀察被應用程式呼叫的包裝 ( Package ) 的資訊交換 ( Package ) 的環境
--hprof 若設定了這個參數,將會於Monkey事件程序的前與後立即產生問題發生特徵的報告,這將會產生近5Mb的檔案於Android裝置內的data/misc資料夾。必須小心使用。可查詢Traceview取得更多的資訊。
--ignore-crashes 一般來說,當應用程式遭遇到任何類型的應用程式崩潰( Crash )或無法掌控的例外( unhandled exception )問題,monkey會停下來。這些錯誤像是應用程式無回應( Application Not Responding)的對話框。若你使用了這個參數,Monkey會持續的傳送事件直到你所設定的參數數量完成。
--ignore-timeouts 一般來說,當應用程式遭遇到任何類型的到期(timeout)問題,monkey會停下來。這些錯誤像是應用程式無回應( Application Not Responding)的對話框。若你使用了這個參數,Monkey會持續的傳送事件直到你所設定的參數數量完成。
--ignore-security-exceptions 一般來說,當應用程式遭遇到任何類型的權限問題monkey會停下來。舉例來說,如果你嘗試去喚起一個需要某些權限的活動( Activity )就會遇到這樣的情形。若你使用了這個參數,Monkey會持續的傳送事件直到你所設定的參數數量完成。
--kill-process-after-error 一般來說,當Monkey因為錯誤(Error)停止,應用程式的錯誤會留在畫面上。若這個參數被設定於monkey中,牠會發出信號去停止有問題的程序( Process )。注意,一個正常的或成功的完成,被執行的程序不會被停止,裝置只是簡單的留在最後一個事件發生後的狀態。
--monitor-native-crashes 等待並且報告Android系統的native源碼損毀發生。若有設定 --kill-process-after-error 參數,系統將會停止monkey測試。
--wait-dbg 重執行中停止monkey直到除錯器(debugger)連接到裝置。

範例:

adb shell "monkey -s 1 --throttle 100 -v -v -v --ignore-crashes --ignore-timeouts --ignore-security-exceptions 99999999"

在這個例子中,主要是希望能夠發現有甚麼方法會造成手機當機或重新開機的現象。設定為亂數種子為1,每個事件發生的間隔時間為100毫秒,忽略App的損毀 ( Crash )問題,忽略ANR的問題,忽略因為應用程式權限不足導致跳出Monkey的問題,執行99999999個事件。

在Android官網上還有兩個參數我們看不到說明,以下我對這兩個參數做說明:

類別 參數選項 說明
限制 --pkg-blacklist-file 限制monkey不測試紀錄於文字檔案內的Packages,若你無使用這個參數,Monkey會測試系統內所有的Package。要指定多個Package不被執行必須在文字檔案內紀錄所有不要測試的Packages名稱,文字檔案內每一行只能放一個Package。
--pkg-whitelist-file 限制monkey只測試於指向的文字檔案的指定的Packages. 若你要測試的Package會與其他的Package有關連,你必須一起指定這些Package來執行這項參數.若你無使用這個參數,Monkey會測試系統內所有的Package。要指定多個Package必須在文字檔案內紀錄所有要測試的Packages名稱,文字檔案內每一行只能放一個Package。

範例:

adb shell "monkey -v --pkg-blacklist-file /data/local/tmp/blacklist.txt 500"

其中blacklist.txt的內容為

com.google.android.apps.maps
com.android.launcher

在這個範例中,monkey的執行不會執行Google Map與Launcher。
特別的是,因為我們設定Launcher在黑名單中 ( blacklist.txt ) ,
畫面有可能會持續停留在上鎖的畫面且持續的進行monkey測試。直到500個事件發生完畢,monkey才會停止。