描述

Monkey主要是用來做穩定性或是壓力測試,它可以執行在實體裝置或是模擬器上,藉由產生一系列的隨機事件(e.g., touch, click, gestures)來測試應用程序。


基本語法

adb shell monkey [options] <event-count>

[options] 為參數,<event-count>為事件數。


常用範例介紹

1.啟動monkey
直接執行 monkey, 發送event count 數量的事件:

adb shell monkey <event count>

 
2.停止monkey
2-1.搜尋 monkey pid

adb shell ps | grep 'monkey'

2-2.kill monkey by pid

adb shell kill <Step 1.找到的 pid>

Notectrl + c無法停止 monkey
 
3.執行在 com.package.name 上, 發送 event count 數量的事件

adb shell monkey -p com.package.name <event count>

 
4.執行在 com.package.name , 發送 event count 數量的事件,顯示最詳細的訊息

adb shell monkey -v-v-v -p com.package.name <event count>

 
5.執行在 com.package.name , 發送 event count 數量的事件,每個事件等待1秒, 顯示最詳細的訊息,事件隨機分配。

adb shell monkey -v-v-v -p com.package.name --throttle 1000 <event count>

 
6.執行在 com.package.name , 發送 event count 數量的事件,每個事件等待1秒,調整 touch 事件為50%,剩餘百分比隨機分配,顯示最詳細的訊息

adb shell monkey -v-v-v -p com.package.name --pct-touch 50 --throttle 1000 <event count>

 
7.執行在 com.package.name 上, 發送 event count 數量的事件,每個事件等待1秒,調整 touch 事件 50%,motion事件 25%,剩餘百分比隨機分配,顯示最詳細的訊息

adb shell monkey -v-v-v -p com.package.name --pct-touch 50 --pct-motion 25 --throttle 1000 <event count>

 



monkey
參數[options]介紹:

參數總共分4大類,為一般(General)類,事件(Events)類,限制(Constraints)類,除錯(Debugging)類。

一般類

-h : 幫助訊息

adb shell monkey -h
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
              [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
              [--ignore-crashes] [--ignore-timeouts]
              [--ignore-security-exceptions]
              [--monitor-native-crashes] [--ignore-native-crashes]
              [--kill-process-after-error] [--hprof]
              [--pct-touch PERCENT] [--pct-motion PERCENT]
              [--pct-trackball PERCENT] [--pct-syskeys PERCENT]
              [--pct-nav PERCENT] [--pct-majornav PERCENT]
              [--pct-appswitch PERCENT] [--pct-flip PERCENT]
              [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
              [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
              [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
              [--wait-dbg] [--dbg-no-events]
              [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
              [--port port]
              [-s SEED] [-v [-v] ...]
              [--throttle MILLISEC] [--randomize-throttle]
              [--profile-wait MILLISEC]
              [--device-sleep-time MILLISEC]
              [--randomize-script]
              [--script-log]
              [--bugreport]
              [--periodic-bugreport]
              COUNT

 
-v:顯示log訊息
越多 -v,顯示的訊息越多,最多可以有3-v 

adb shell monkey -v-v-v 10
:Monkey: seed=0 count=10
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%
//   5: 25.0%
//   6: 15.0%
//   7: 2.0%
//   8: 2.0%
//   9: 1.0%
//   10: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.google.android.street/.Street;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.google.android.street/.Street } in package com.google.android.street
:Sending Flip keyboardOpen=false
:Sending Touch (ACTION_DOWN): 0:(313.0,367.0)
:Sending Touch (ACTION_UP): 0:(313.19876,367.49512)
Events injected: 10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=247ms (0ms mobile, 247ms wifi, 0ms not connected)
// Monkey finished

2seed=0代表事件使用的隨機數,如果指定相同的隨機數,將會產生相同的事件。
count=10代表事件數量
第3~4行 :IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
代表 monkey 會去執行指定category的類別,預設是LAUNCHER or MONKEY
當在指令中使用 -c 參數時會顯示在這裡,若找不到指定的category會顯示以下訊息。

// Warning: no activities found for category android.intent.category.test
** No activities found to run, monkey aborted.

516行:事件比例,對照如下

// Event percentages:
// 0: 15.0% (--pct-touch )
// 1: 10.0% (--pct-motion)
// 2: 2.0% (--pct-pinchzoom)
// 3: 15.0% (--pct-trackball)
// 4: -0.0% (--pct-rotation)
// 5: 25.0% (--pct-nav)
// 6: 15.0% (--pct-majornav)
// 7: 2.0% (--pct-syskeys)
// 8: 2.0% (--pct-appswitch)
// 9: 1.0% (--pct-flip)
// 10: 13.0%(--pct-anyevent)

1722行:monkey 切換訊息。其中包括 actioncategorycomponent的訊息。action category 請參考 android developer 參考。而 component 即為啟動的 package全名和 activity名稱。
23行之後包含相關的測試訊息觸碰座標,旋轉螢幕等等。


事件類

-s:隨機數,指定相同的隨機數會有相同的事件產生。
–throttle:每個事件之間延遲的時間,以mill second 來計算,預設沒有延遲。
–pct-touch:觸碰事件,觸碰事件為按下放開事件。
–pct-motion:運動事件,運動事件為按下事件加上一連串的隨機事件最後加上放開事件。
–pct-trackball:軌跡球事件,軌跡球事件為一個或多個亂數動作。
–pct-nav:基本導航事件,基本導航事件為裝置的上,下,左,右輸入。
–pct-majornav:主要導航事件,主要導航事件為引發圖形介面的動作(e.g.,返回鍵,或選單鍵)
–pct-syskeys:系統事件,系統按鍵事件為home鍵,返回鍵,撥號鍵,音量鍵等等。
–pct-appswitchactivity啟動事件, activity啟動事件為影響monkey 最大化的平均切換同一個package內的所有activity 的機率。
–pct-anyevent:其他事件,包含以上沒有提到事件。

//執行在 com.example.mypackage 上, 發送 100 數量的事件,調整 touch 事件為10%,motion事件20%,軌跡球事件為 15%,剩餘百分比隨機分配,顯示最詳細的訊息
adb shell monkey -v-v-v -p com.example.mypackage -s 999 --pct-touch 10 --pct-motion 20 --pct-trackball 15 100
限制類

-p:指定 monkey 運作的 package,可以有一個到多個 packagemonkey會啟動在該package內的activity,如果 app 需要存取其他的 packagee.g., 聯絡人)。也必須在此指定。預設是隨機啟動該裝置中任何一個package

//執行在 com.example.mypackage 上, 發送 100 數量的事件,事件隨機分配,顯示最詳細的訊息
adb shell monkey -v-v-v -p com.example.mypackage 100

 
-c: 指定 monkey 運作的 category,通常可用來指定 monkey 啟動的 activitycategory AndroidManifest.xml 中設定(e.g.,預設為啟動Intent.CATEGORY_LAUNCHER or Intent.CATEGORY_MONKEY

//執行在 com.example.mypackage 上, 限制 category 為 LAUNCHER 以及 MONKEY,發送 100 數量的事件,事件隨機分配,顯示最詳細的訊息
adb shell monkey -v-v-v -p com.example.mypackage -c android.intent.category.LAUNCHER -c android.intent.category.MONKEY 100

AndroidManifest.xml example

...
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.mypackage.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
...

第14行即為 category 指定的方式,因此 monkey 將會執行在com.example.mypakcage.MainActivity 。

除錯類

-hprof:在 monkey 執行事件的前後產生報告,報告大約有 5mb,路徑為data/misc
–ignore-crashesmonkey 預設當測試發生 exception crash 會立即停止,當設定該參數 monkey將不會停止。
–ignore-timeoutsmonkey 預設當測試發生 ANR會立即停止,當設定該參數 monkey將不會停止。
–ignore-security-exceptionsmonkey 預設當測試發生 permission error會立即停止,當設定該參數 monkey將不會停止。
–kill-process-after-errormonkey 預設當測試發生錯誤時不會停止啟動的程序,當設定該參數 monkey將會停止該程序。Note: monkey 成功完成測試後,也不會停止該程序,只會保留在測試結束的最後一個階段。
–montion-native-crashes:監看並報告當測試發生native code 的錯誤。
–wait-dbg:停止執行中的 monkey直到有除錯器連接為止。
–dbg-no-events:設定後,monkey 進入activity 前不會產生事件,一般會和 -v , -p-throttle 一起使用來監視 packages 之間的切換。