一、Monkey簡(jiǎn)介
Monkey 是Android SDK提供的一個(gè)命令行工具匠抗, 可以簡(jiǎn)單,方便地運(yùn)行在任何版本的Android模擬器和實(shí)體設(shè)備上。 Monkey會(huì)發(fā)送偽隨機(jī)的用戶事件流(如按鍵輸入铃肯、觸摸屏輸入为朋、手勢(shì)輸入等)臂拓,適合對(duì)app做壓力測(cè)試,主要目的就是為了測(cè)試app 是否會(huì)Crash习寸。
- Monkey程序由Android系統(tǒng)自帶胶惰,使用Java詫言寫成,在Android文件系統(tǒng)中的存放路徑是: /system/framework/monkey.jar霞溪;
- Monkey.jar程序是由一個(gè)名為“monkey”的Shell腳本來啟動(dòng)執(zhí)行孵滞,shell腳本在Android文件系統(tǒng)中 的存放路徑是:/system/bin/monkey;
如果你是一個(gè)android開發(fā)人員鸯匹,當(dāng)你把自己的環(huán)境搭建好之后坊饶,這個(gè)東西已經(jīng)存在了,直接可以使用殴蓬。
(一)匿级、Monkey 命令啟動(dòng)方式
1)可以通過PC機(jī)CMD窗口中執(zhí)行: adb shell monkey {+命令參數(shù)}來進(jìn)行Monkey測(cè)試
2)在PC上adb shell 進(jìn)入Android系統(tǒng),通過執(zhí)行 monkey {+命令參數(shù)} 來進(jìn)行Monkey 測(cè)試
3)在Android機(jī)或者模擬器上直接執(zhí)行monkey 命令科雳,可以在Android機(jī)上安裝Android終端模擬器
(二)根蟹、Monkey 參數(shù)
測(cè)試?yán)樱╟om.haijia.test 是測(cè)試的應(yīng)用包名):
adb shell monkey –p com.haijia.test –-throttle 100 –-pct-touch 50 –-pct-motion 50 –v –v 1000 >d:\monkey.txt
-v : 用于指定反饋信息級(jí)別(信息級(jí)別就是日志的詳細(xì)程度),總共分3個(gè)級(jí)別糟秘,分別對(duì)應(yīng)的參數(shù)如下 表所示:
// 缺省值简逮,僅提供啟動(dòng)提示、測(cè)試完成和最終結(jié)果等少量信息
Level 0 : adb shell monkey -p com.haijia.test -v 100
// 提供較為詳細(xì)的日志尿赚,包括每個(gè)發(fā)送到Activity的事件信息
Level 1 : adb shell monkey -p com.haijia.test -v -v 100
// 最詳細(xì)的日志散庶,包括了測(cè)試中選中/未選中的Activity信息
Level 2 : adb shell monkey -p com.haijia.test -v -v -v 100
-throttle <毫秒>
用于指定事件之間的間隔時(shí)間 蕉堰,單位是毫秒;如果指定這個(gè)參數(shù)悲龟,monkey會(huì)盡可能快的 生成和發(fā)送消息屋讶。 示例:
adb shell monkey -p pkgname --throttle 3000 100
-s(隨機(jī)數(shù)種子)
用于指定偽隨機(jī)數(shù)生成器的seed值,如果seed相同须教,則兩次Monkey測(cè)試所產(chǎn)生的事件序列也相同的皿渗。 示例:
adb shell monkey -p pkgname –s 10 100
-p <允許的包名列表>
用此參數(shù)指定一個(gè)或多個(gè)包。指定包之后轻腺,monkey將只允許系統(tǒng)啟動(dòng)指定的app乐疆。如果丌指定包, monkey將允許系統(tǒng)啟動(dòng)設(shè)備中的所有app贬养。
指定一個(gè)包:adb shell monkey -p pkgname 100
指定多個(gè)包:adb shell monkey -p pkgname1 –p pkgname2 100
touch:設(shè)置觸摸事件
adb shell monkey -pct-touch :指定touch事件的百分比percent
motion:設(shè)置動(dòng)作事件
adb shell monkey -pct-motion :指定motion事件的百分比percent
trackball:設(shè)置軌跡球事件
adb shell monkey -pct-trackball :指定軌跡球事件百分比percent
nav:導(dǎo)航事件設(shè)置
adb shell monkey -pct-nav :指定基本導(dǎo)航事件百分比percent
majornav:設(shè)置主要導(dǎo)航事件
adb shell monkey -pct-majornav :設(shè)定主要導(dǎo)航事件百分比percent挤土,兼容中間鍵,返回鍵误算,菜單按鍵
syskeys:設(shè)置事件
adb shell monkey -pct-syskeys :設(shè)定系統(tǒng)事件百分比percent仰美,比如HOME,BACK,撥號(hào)及音量調(diào)節(jié)等事件。
appswitch:啟動(dòng)Activity事件
adb shell monkey -pct-appswitch :設(shè)定啟動(dòng)activity的事件百分比percent
anyevent:不常用事件設(shè)置
adb shell monkey -pct-anyevent :設(shè)定不常用事件地百分比
syskeys:設(shè)置事件
adb shell monkey -pct-syskeys :設(shè)定系統(tǒng)事件百分比percent儿礼,比如HOME,BACK,撥號(hào)及音量調(diào)節(jié)等事件咖杂。
crashes :程序崩潰事件設(shè)置
adb shell monkey -ignore-crashes :忽略崩潰和異常事件
timeouts:超時(shí)事件設(shè)置
adb shell monkey -ignore-timeouts :忽略超時(shí)事件
(三)關(guān)于測(cè)試命令
1、adb install xx.apk:
把指定的安裝包apk文件安裝到測(cè)試設(shè)備中蚊夫。
2翰苫、adb shell monkey:
給指定的設(shè)備發(fā)送壓力測(cè)試,number是要測(cè)試的次數(shù)。執(zhí)行這個(gè)命令的效果就相當(dāng)于有個(gè)手指在你的手機(jī)上亂點(diǎn)这橙。
adb shell monkey -p com.xx.xx 10
3奏窑、adb shell monkey -p pkgname:
同上面效果一樣,只是對(duì)指定包名(pkgname)apk進(jìn)行測(cè)試屈扎。
4埃唯、查看adb 版本
adb version
5、查看當(dāng)前可用設(shè)備
adb devices
6鹰晨、查看monkey 幫助
adb shell monkey -help
7墨叛、--ignore-crashes 運(yùn)行中忽略crash,遇到crash依然把后面的事件跑完
adb shell monkey --ignore-crashes -v 100
8模蜡、--ignore-timeouts 運(yùn)行中忽略ANR,遇到ANR依然把后面的事件跑完
adb shell monkey --ignore-timeouts -v 100
9漠趁、--ignore-native-crashes 忽略monkey本身的異常,直到事件執(zhí)行完畢
adb shell monkey --ignore-native-crashes -v 100
10忍疾、運(yùn)行并生成.txt的日志文件
adb shell monkey -p com.xxxx.xxx.xxx -v -v -v 1000 > Desktop/monkeytestOne.txt
(四)Monkey 日志分析
生成的文件大致如下(Monkey finished 代表執(zhí)行完成):
:Monkey: seed=1506157309339 count=500
:AllowPackage: com.haijia.test
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// - NOT USING main activity com.android.calendar.AllInOneActivity (from package com.android.calendar)
// - NOT USING main activity com.android.contacts.activities.PeopleActivity (from package com.android.contacts)
// - NOT USING main activity com.android.contacts.activities.DialtactsActivity (from package com.android.contacts)
// - NOT USING main activity com.android.deskclock.AlarmsMainActivity (from package com.android.deskclock)
// - NOT USING main activity com.android.email.activity.Welcome (from package com.android.email)
// Seeded: 1506157309339
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.haijia.test/com.stub.plugin.Stub01;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.haijia.test/com.stub.plugin.Stub01 } in package com.haijia.test
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.haijia.test/.activity.GuideActivity } in packagecom.haijia.test
// activityResuming(com.haijia.test)
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
Sleeping for 0 milliseconds
:Sending Touch (ACTION_UP): 0:(250.74362,575.5601)
Sleeping for 0 milliseconds
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.haijia.test/com.stub.plugin.Stub01;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.haijia.test/com.stub.plugin.Stub01 } in package com.haijia.test
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
// Allowing start of Intent { cmp=com.haijia.test/.activity.LoginByPhoneActivity } in package com.zcya.vtsp
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
Sleeping for 0 milliseconds
Sleeping for 0 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-2.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,1.0)
:Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT
:Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT
// activityResuming(com.zcya.vtsp)
:Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT
Sleeping for 0 milliseconds
:Sending Touch (ACTION_MOVE): 0:(389.88348,823.37866)
Events injected: 500
:Sending rotation degree=0, persist=false
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.zcya.vtsp/.activity.GuideActivity } in package com.zcya.vtsp
:Dropped: keys=0 pointers=2 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=4983ms (0ms mobile, 0ms wifi, 4983ms not connected)
// Monkey finished
異常情況
Monkey 測(cè)試出現(xiàn)錯(cuò)誤后闯传,一般的分析步驟
看Monkey的日志 (注意第一個(gè)swith以及異常信息等)
- 程序無響應(yīng)的問題: 在日志中搜索 “ANR”
- 崩潰問題:在日志中搜索 “Exception” (如果出現(xiàn)空指針, NullPointerException) 肯定是有bug卤妒。
adb shell monkey -v –throttle 300 –pct-touch 30
–pct-motion 20 –pct-nav 20 –pct-majornav 15 –pct-appswitch 5
–pct-anyevent 5 –pct-trackball 0 –pct-syskeys 0 -p ‘%s’ 1000