一、Monkey
1.什么是monkey
Monkey是android自帶的命令行工具,可以運行在模擬器里或?qū)嶋H設(shè)備中。它向系統(tǒng)發(fā)送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現(xiàn)對正在開發(fā)的應(yīng)用程序進(jìn)行壓力測試。Monkey測試是一種為了測試軟件的穩(wěn)定性、健壯性的快速有效的方法。
2.Monkey用法
基本語法:adb shellmonkey [option]
例如:adb shell monkey –v –v –v –p com.android.test 500 (發(fā)送500個隨機指令對com.android.test這個包進(jìn)行測試)
option有如下:
[-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]
[--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]
其中紅色字體標(biāo)出來的有一種用法為–f scriptfile這里就可以使用寫的monkey腳本來實現(xiàn)
二、Monkey Script
1.什么是monkey script
Monkey script是按照一定的語法規(guī)則編寫有序的用戶事件流并適用于monkey命令工具的腳本。
2.Monkey script編寫及運行
在development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java源碼下有一段注釋規(guī)定了monkey script的基本規(guī)則,如下
/**
* monkey event queue. It takes a script. to produce events
*
* sample script. format:
* type= raw events
* count= 10
* speed= 1.0
* start data >>
* captureDispatchPointer(5109520,5109520,0,230.75429,458.1814,0.20784314,
* 0.06666667,0,0.0,0.0,65539,0)
* captureDispatchKey(5113146,5113146,0,20,0,0,0,0)
* captureDispatchFlip(true)
* ...
*/
紅色部分規(guī)定的就是monkey script的編寫方法
type指明類型
count說明執(zhí)行次數(shù),但是這里改成任何值都執(zhí)行一次,monkey命令可以指定執(zhí)行次數(shù),這里也就無所謂了
speed命令執(zhí)行速率。改動無影響,可以通過monkey命令行指定。
以上三個參數(shù)改動都沒什么影響,一般不做改動。
start data >>相當(dāng)于一個入口,說明腳本從下面開始執(zhí)行
例:
#Start Script
type = user
count = 49
speed = 1.0
start data >>
LaunchActivity(com.android.browser,com.android.browser.BrowserActivity)
UserWait(5000)
#open renren
captureDispatchPointer(5109520,5109520,0,1150,330,0,0,0,0,0,0,0);
captureDispatchPointer(5109521,5109521,1,1150,330,0,0,0,0,0,0,0);
UserWait(3000)
#close browser
captureDispatchPointer(5109520,5109520,0,205,31,0,0,0,0,0,0,0);
captureDispatchPointer(5109521,5109521,1,205,31,0,0,0,0,0,0,0);
UserWait(2000)
以上是在k91上瀏覽器操作的一個腳本。執(zhí)行步驟為
1.打開瀏覽器
2.打開人人網(wǎng)
3.關(guān)閉瀏覽器
具體的操作步驟為:
1.將上述腳本復(fù)制到browser.txt中
2.將browser.txt放到sd卡根目錄
3.adb shell monkey –v –v –v –f /sdcard/browser.txt –throttle 1500 100 > monkey.txt
腳本會按照browser.txt發(fā)送的指令序列每隔1.5s執(zhí)行一個指令,執(zhí)行100遍,并將log存在monkey.txt文件中。
在源碼development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java中規(guī)定了如下api可以供用戶使用
privatestaticfinalString EVENT_KEYWORD_POINTER ="DispatchPointer";
DispatchPointer(long downTime,long eventTime, int action,
float x, float y, float pressure, float size, int metaState,
float xPrecision, float yPrecision, int device, int edgeFlags)
privatestaticfinalString EVENT_KEYWORD_TRACKBALL ="DispatchTrackball";
DispatchTrackball(long downTime,long eventTime, int action,
float x, float y, float pressure, float size, int metaState,
float xPrecision, float yPrecision, int device, int edgeFlags)
privatestaticfinalString EVENT_KEYWORD_KEY ="DispatchKey";
DispatchKey(long downTime, long eventTime, int action, int code,
int repeat, int metaState, int device, int scancode)
privatestaticfinalString EVENT_KEYWORD_FLIP ="DispatchFlip";
DispatchFlip(boolean keyboardOpen)
privatestaticfinalString EVENT_KEYWORD_KEYPRESS ="DispatchPress";
DispatchPress(int keyCode)
privatestaticfinalString EVENT_KEYWORD_ACTIVITY ="LaunchActivity";
LaunchActivity(String pkg_name, String cl_name)
privatestaticfinalString EVENT_KEYWORD_INSTRUMENTATION ="LaunchInstrumentation";
LaunchInstrumentation(String test_name, String runner_name)
privatestaticfinalString EVENT_KEYWORD_WAIT ="UserWait";
UserWait(long sleeptime)
privatestaticfinalString EVENT_KEYWORD_LONGPRESS ="LongPress";
LongPress(int keyCode)
privatestaticfinalString EVENT_KEYWORD_POWERLOG ="PowerLog";
PowerLog(String power_log_type)
PowerLog(String power_log_type, String test_case_status)
privatestaticfinalString EVENT_KEYWORD_WRITEPOWERLOG ="WriteLog";
WriteLog: write power log to sdcard
privatestaticfinalString EVENT_KEYWORD_RUNCMD ="RunCmd";
RunCmd(String cmd):執(zhí)行cmd命令
private