一 monkey簡介
1.參考資料
http://blog.csdn.net/jlminghui/article/details/38238443
2.Monkey介紹
顧名思義,Monkey就是猴子,Monkey測試,就像一只猴子,在電腦面前,亂敲鍵盤在測試。猴子什么都不懂,只知道亂敲。Monkey會發送偽隨機的事件流,通過Monkey程序模擬用戶觸摸屏幕、滑動Trackball、按鍵等操作來對設備上的程序進行壓力測試,檢測程序多久的時間會發生異常。
3.Monkey用來做什么
Monkey 主要用於Android 的壓力測試自動的一個壓力測試小工具, 主要目的就是為了測試app是否會Crash(崩潰)。
4.Monkey程序介紹
(1)Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑是: /system/framework/monkey.jar;
(2)Monkey.jar程序是由一個名為“monkey”的Shell腳本來啟動執行,shell腳本在Android文件系統中的存放路徑是:/system/bin/monkey;
(3)Monkey 命令啟動方式:
a)可以通過PC機CMD窗口中執行: adb shell monkey {+命令參數}來進行Monkey測試
b)在PC上adb shell 進入Android系統,通過執行 monkey {+命令參數} 來進行Monkey測試
c)在Android機或者模擬器上直接執行monkey 命令,可以在Android機上安裝Android終端模擬器
二 Monkey命令基本參數介紹
1.使用monkey測試手機所有程序
adb shell monkey 100
執行monkey測試100次
這種操作就是在手機上隨便點,點擊100次。對測試應用沒什么用處,如果你進入到一些大公司比如華為測試手機ROM可能會用到。
使用adb指令,安裝Login.apk
2.查看手機上應用包名
adb shell pm list packages
3.-p <允許的包名列表>
用此參數指定一個或多個包。指定包之后,monkey將只允許系統啟動指定的app。如果不指定包, monkey將允許系統啟動設備中的所有app。
指定一個包:
4.顯示日志詳細程度
用於指定反饋信息級別(信息級別就是日志的詳細程度),總共分3個級別,分別對應的參數如下所示:
Level 0 : adb shell monkey -p <軟件包名> -v 100 //缺省值,僅提供啟動提示、測試完成和最終結果等少量信息
Level 1 : adb shell monkey -p <軟件包名> -v -v 100 //提供較為詳細的日志,包括每個發送到Activity的事件信息
Level 2 : adb shell monkey -p <軟件包名> -v -v -v 100 //最詳細的日志,包括了測試中選中/未選中的Activity信息

C:\Users\Administrator>adb shell monkey -p com.example.login -v 100 :Monkey: seed=1541108337471 count=100 :AllowPackage: com.example.login :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.categ ory.LAUNCHER;launchFlags=0x10200000;component=com.example.login/.MainActivity;en d // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in tent.category.LAUNCHER] cmp=com.example.login/.MainActivity } in package com.exa mple.login :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.categ ory.LAUNCHER;launchFlags=0x10200000;component=com.example.login/.MainActivity;en d // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in tent.category.LAUNCHER] cmp=com.example.login/.MainActivity } in package com.exa mple.login :Sending Touch (ACTION_DOWN): 0:(137.0,218.0) :Sending Touch (ACTION_UP): 0:(173.40945,226.30446) :Sending Touch (ACTION_DOWN): 0:(180.0,259.0) :Sending Touch (ACTION_UP): 0:(189.61348,257.59262) :Sending Trackball (ACTION_MOVE): 0:(3.0,-2.0) :Sending Trackball (ACTION_MOVE): 0:(1.0,-5.0) :Sending Touch (ACTION_DOWN): 0:(88.0,281.0) :Sending Touch (ACTION_UP): 0:(112.34274,320.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,1.0) :Sending Trackball (ACTION_UP): 0:(0.0,0.0) :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.categ ory.LAUNCHER;launchFlags=0x10200000;component=com.example.login/.MainActivity;en d // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in tent.category.LAUNCHER] cmp=com.example.login/.MainActivity } in package com.exa mple.login :Sending Trackball (ACTION_MOVE): 0:(3.0,-4.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,-3.0) :Sending Touch (ACTION_DOWN): 0:(39.0,248.0) :Sending Touch (ACTION_UP): 0:(51.867878,247.03575) :Sending Touch (ACTION_DOWN): 0:(118.0,288.0) Events injected: 100 :Sending rotation degree=0, persist=false :Dropped: keys=20 pointers=77 trackballs=0 flips=0 rotations=0 ## Network stats: elapsed time=510ms (510ms mobile, 0ms wifi, 0ms not connected) // Monkey finished C:\Users\Administrator>adb shell monkey -p com.example.login -v -v 100 :Monkey: seed=1541108102892 count=100 :AllowPackage: com.example.login :IncludeCategory: android.intent.category.LAUNCHER :IncludeCategory: android.intent.category.MONKEY // Selecting main activities from category android.intent.category.LAUNCHER // + Using main activity com.example.login.MainActivity (from package com.exam ple.login) // Selecting main activities from category android.intent.category.MONKEY // Seeded: 1541108102892 // 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.categ ory.LAUNCHER;launchFlags=0x10200000;component=com.example.login/.MainActivity;en d // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in tent.category.LAUNCHER] cmp=com.example.login/.MainActivity } in package com.exa mple.login Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 199 // KEYCODE_BUTTON_12 :Sending Key (ACTION_UP): 199 // KEYCODE_BUTTON_12 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 Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER :Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 90 // KEYCODE_MEDIA_FAST_FORWARD :Sending Key (ACTION_UP): 90 // KEYCODE_MEDIA_FAST_FORWARD Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 139 // KEYCODE_F9 :Sending Key (ACTION_UP): 139 // KEYCODE_F9 Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(228.0,109.0) :Sending Touch (ACTION_UP): 0:(239.7635,108.96301) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 93 // KEYCODE_PAGE_DOWN :Sending Key (ACTION_UP): 93 // KEYCODE_PAGE_DOWN Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN :Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 33 // KEYCODE_E :Sending Key (ACTION_UP): 33 // KEYCODE_E Sleeping for 0 milliseconds :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.categ ory.LAUNCHER;launchFlags=0x10200000;component=com.example.login/.MainActivity;en d // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in tent.category.LAUNCHER] cmp=com.example.login/.MainActivity } in package com.exa mple.login Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN :Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 143 // KEYCODE_NUM_LOCK :Sending Key (ACTION_UP): 143 // KEYCODE_NUM_LOCK 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 Key (ACTION_DOWN): 166 // KEYCODE_CHANNEL_UP :Sending Key (ACTION_UP): 166 // KEYCODE_CHANNEL_UP 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): 25 // KEYCODE_VOLUME_DOWN :Sending Key (ACTION_UP): 25 // KEYCODE_VOLUME_DOWN Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 190 // KEYCODE_BUTTON_3 :Sending Key (ACTION_UP): 190 // KEYCODE_BUTTON_3 Sleeping for 0 milliseconds :Sending Trackball (ACTION_MOVE): 0:(-2.0,-1.0) :Sending Trackball (ACTION_MOVE): 0:(4.0,1.0) :Sending Trackball (ACTION_MOVE): 0:(3.0,-3.0) :Sending Trackball (ACTION_MOVE): 0:(1.0,-3.0) :Sending Trackball (ACTION_MOVE): 0:(2.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(2.0,-4.0) :Sending Trackball (ACTION_MOVE): 0:(-4.0,3.0) :Sending Trackball (ACTION_MOVE): 0:(4.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,1.0) :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 187 // KEYCODE_APP_SWITCH :Sending Key (ACTION_UP): 187 // KEYCODE_APP_SWITCH Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP 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): 155 // KEYCODE_NUMPAD_MULTIPLY :Sending Key (ACTION_UP): 155 // KEYCODE_NUMPAD_MULTIPLY 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): 22 // KEYCODE_DPAD_RIGHT :Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(210.0,1.0) :Sending Touch (ACTION_UP): 0:(206.1193,5.3746395) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP 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_DOWN): 0:(202.0,72.0) :Sending Touch (ACTION_UP): 0:(203.49069,55.111717) 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_DOWN): 0:(213.0,169.0) :Sending Touch (ACTION_POINTER_DOWN 1): 0:(213.03842,169.64987) 1:(90.0,273.0) :Sending Touch (ACTION_MOVE): 0:(224.27519,172.04413) 1:(85.0046,253.13188) :Sending Touch (ACTION_MOVE): 0:(232.99971,179.71663) 1:(79.35529,246.14488) :Sending Touch (ACTION_MOVE): 0:(240.0,185.72884) 1:(73.46896,229.39772) :Sending Touch (ACTION_MOVE): 0:(240.0,199.92346) 1:(70.65656,218.28358) :Sending Touch (ACTION_MOVE): 0:(240.0,203.7676) 1:(70.50711,214.87372) :Sending Touch (ACTION_MOVE): 0:(240.0,204.10182) 1:(65.11935,199.15561) :Sending Touch (ACTION_MOVE): 0:(240.0,218.79683) 1:(60.31317,189.60109) :Sending Touch (ACTION_MOVE): 0:(240.0,220.99147) 1:(56.169495,187.63142) :Sending Touch (ACTION_MOVE): 0:(240.0,235.9418) 1:(50.057125,180.71246) :Sending Touch (ACTION_POINTER_UP 1): 0:(240.0,236.40236) 1:(44.15694,173.95424) :Sending Touch (ACTION_UP): 0:(240.0,255.14737) Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(115.0,305.0) :Sending Touch (ACTION_UP): 0:(113.861176,304.03662) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT :Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 171 // KEYCODE_WINDOW :Sending Key (ACTION_UP): 171 // KEYCODE_WINDOW Sleeping for 0 milliseconds :Sending Trackball (ACTION_MOVE): 0:(1.0,-3.0) :Sending Trackball (ACTION_MOVE): 0:(2.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,2.0) :Sending Trackball (ACTION_MOVE): 0:(-4.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(-4.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(4.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,-4.0) Events injected: 100 :Sending rotation degree=0, persist=false :Dropped: keys=60 pointers=38 trackballs=0 flips=0 rotations=0 ## Network stats: elapsed time=792ms (792ms mobile, 0ms wifi, 0ms not connected) // Monkey finished C:\Users\Administrator>adb shell monkey -p com.example.login -v -v -v 100 :Monkey: seed=1541107230859 count=100 :AllowPackage: com.example.login :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.calculator2.Calculator (from package com.android.calculator2) // - NOT USING main activity com.android.mms.ui.ConversationList (from package com.android.mms) // - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser) // - NOT USING main activity com.android.deskclock.DeskClock (from package com .android.deskclock) // - NOT USING main activity com.android.camera.GalleryPicker (from package co m.android.gallery) // - NOT USING main activity com.android.music.MusicBrowserActivity (from pack age com.android.music) // - NOT USING main activity com.android.calendar.AllInOneActivity (from packa ge com.android.calendar) // - NOT USING main activity com.android.settings.Settings (from package com.a ndroid.settings) // - NOT USING main activity com.android.camera.Camera (from package com.andro id.camera) // - NOT USING main activity com.android.contacts.activities.DialtactsActivity (from package com.android.contacts) // - NOT USING main activity com.android.contacts.activities.PeopleActivity (f rom package com.android.contacts) // - NOT USING main activity com.android.widgetpreview.WidgetPreviewActivity ( from package com.android.widgetpreview) // - NOT USING main activity com.android.gesture.builder.GestureBuilderActivit y (from package com.android.gesture.builder) // - NOT USING main activity com.example.android.apis.ApiDemos (from package c om.example.android.apis) // - NOT USING main activity com.android.customlocale2.CustomLocaleActivity (f rom package com.android.customlocale2) // - NOT USING main activity com.android.development.Development (from package com.android.development) // - NOT USING main activity com.android.quicksearchbox.SearchActivity (from p ackage com.android.quicksearchbox) // - NOT USING main activity com.android.speechrecorder.SpeechRecorderActivity (from package com.android.speechrecorder) // - NOT USING main activity com.android.providers.downloads.ui.DownloadList ( from package com.android.providers.downloads.ui) // - NOT USING main activity android.app.AliasActivity (from package com.andro id.development_settings) // + Using main activity com.example.login.MainActivity (from package com.exam ple.login) // - NOT USING main activity com.example.test.MainActivity (from package com.e xample.test) // Selecting main activities from category android.intent.category.MONKEY // - NOT USING main activity com.android.launcher2.Launcher (from package com. android.launcher) // - NOT USING main activity com.android.settings.Settings$RunningServicesActi vity (from package com.android.settings) // - NOT USING main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings) // Seeded: 1541107230859 // 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.categ ory.LAUNCHER;launchFlags=0x10200000;component=com.example.login/.MainActivity;en d // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in tent.category.LAUNCHER] cmp=com.example.login/.MainActivity } in package com.exa mple.login Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 24 // KEYCODE_VOLUME_UP :Sending Key (ACTION_UP): 24 // KEYCODE_VOLUME_UP Sleeping for 0 milliseconds :Sending Flip keyboardOpen=false 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 Touch (ACTION_DOWN): 0:(159.0,217.0) :Sending Touch (ACTION_UP): 0:(165.70789,214.53561) Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(19.0,106.0) :Sending Touch (ACTION_POINTER_DOWN 1): 0:(0.0,108.30382) 1:(11.0,171.0) :Sending Touch (ACTION_MOVE): 0:(0.0,116.11915) 1:(6.463764,177.53587) :Sending Touch (ACTION_POINTER_UP 1): 0:(0.0,122.11656) 1:(0.0,184.39256) :Sending Touch (ACTION_UP): 0:(0.0,134.64552) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT :Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(30.0,283.0) :Sending Touch (ACTION_UP): 0:(29.540138,270.772) Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(35.0,315.0) :Sending Touch (ACTION_MOVE): 0:(41.940323,301.62585) :Sending Touch (ACTION_MOVE): 0:(46.01829,277.74582) :Sending Touch (ACTION_UP): 0:(48.474968,266.00723) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT :Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 145 // KEYCODE_NUMPAD_1 :Sending Key (ACTION_UP): 145 // KEYCODE_NUMPAD_1 Sleeping for 0 milliseconds :Sending Trackball (ACTION_MOVE): 0:(1.0,-2.0) :Sending Trackball (ACTION_MOVE): 0:(-2.0,-2.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,4.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,2.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,-4.0) :Sending Trackball (ACTION_MOVE): 0:(-4.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(1.0,3.0) :Sending Trackball (ACTION_MOVE): 0:(3.0,2.0) :Sending Trackball (ACTION_MOVE): 0:(2.0,2.0) :Sending Trackball (ACTION_MOVE): 0:(-2.0,-1.0) :Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN :Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(183.0,203.0) :Sending Touch (ACTION_UP): 0:(194.52084,187.27563) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN :Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(100.0,171.0) :Sending Touch (ACTION_UP): 0:(96.87977,170.16449) Sleeping for 0 milliseconds :Sending Flip keyboardOpen=true Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 95 // KEYCODE_SWITCH_CHARSET :Sending Key (ACTION_UP): 95 // KEYCODE_SWITCH_CHARSET Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN :Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN Sleeping for 0 milliseconds :Sending Trackball (ACTION_MOVE): 0:(4.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(3.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(0.0,2.0) :Sending Trackball (ACTION_MOVE): 0:(0.0,1.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,-1.0) :Sending Trackball (ACTION_MOVE): 0:(2.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,1.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(-4.0,-3.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,3.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): 206 // KEYCODE_3D_MODE :Sending Key (ACTION_UP): 206 // KEYCODE_3D_MODE Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 4 // KEYCODE_BACK :Sending Key (ACTION_UP): 4 // KEYCODE_BACK Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(168.0,253.0) :Sending Touch (ACTION_POINTER_DOWN 1): 0:(166.42249,231.88263) 1:(212.0,58.0) :Sending Touch (ACTION_MOVE): 0:(166.0931,228.01944) 1:(195.48389,51.1498) :Sending Touch (ACTION_MOVE): 0:(155.35042,223.16498) 1:(175.32312,31.635899) :Sending Touch (ACTION_MOVE): 0:(154.35658,211.59282) 1:(161.17451,21.018143) :Sending Touch (ACTION_MOVE): 0:(142.34442,188.13126) 1:(154.24657,14.730347) :Sending Touch (ACTION_POINTER_UP 1): 0:(138.6136,164.46696) 1:(153.50166,3.2237 806) :Sending Touch (ACTION_UP): 0:(129.04036,156.62956) Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(52.0,215.0) :Sending Touch (ACTION_UP): 0:(50.890404,218.14482) Sleeping for 0 milliseconds :Sending Trackball (ACTION_MOVE): 0:(1.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(0.0,-4.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,-1.0) :Sending Trackball (ACTION_MOVE): 0:(-1.0,-2.0) :Sending Trackball (ACTION_MOVE): 0:(4.0,1.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,2.0) :Sending Trackball (ACTION_MOVE): 0:(2.0,-3.0) :Sending Trackball (ACTION_MOVE): 0:(4.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(-2.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0) :Sending Touch (ACTION_DOWN): 0:(136.0,308.0) :Sending Touch (ACTION_MOVE): 0:(140.34961,310.26785) :Sending Touch (ACTION_UP): 0:(161.46814,310.94815) 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_DOWN): 0:(202.0,241.0) :Sending Touch (ACTION_MOVE): 0:(200.27258,244.47406) :Sending Touch (ACTION_MOVE): 0:(198.87253,246.80893) :Sending Touch (ACTION_UP): 0:(198.36757,252.80966) Sleeping for 0 milliseconds :Sending Trackball (ACTION_MOVE): 0:(-4.0,-1.0) :Sending Trackball (ACTION_MOVE): 0:(3.0,4.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,-5.0) Events injected: 100 :Sending rotation degree=0, persist=false :Dropped: keys=30 pointers=67 trackballs=0 flips=0 rotations=0 ## Network stats: elapsed time=909ms (909ms mobile, 0ms wifi, 0ms not connected) // Monkey finished
5.Monkey日志分析
adb shell monkey 100 >E:/log/a.txt
將log信息寫到文檔中
正常情況,如果Monkey測試順利執行完成,在log的最后,會打印出當前執行事件的次數和所花費的時間
隨機數種子
用於指定偽隨機數生成器的seed值,如果seed相同,則兩次Monkey測試所產生的事件序列也相同的。示例:
monkey測試1:adb shell monkey -p <軟件包名> –s 10 100
monkey測試2:adb shell monkey -p <軟件包名> –s 10 100
6.--throttle <毫秒>
用亍指定用戶操作(即事件)間的時延,單位是毫秒;如果不指定這個參數,monkey會盡可能快的生成和發送消息。
示例:adb shell monkey -p com.example.login --throttle 3000 100 #3秒之后開始執行
7.--pct-touch <percent>
調整觸摸事件的百分比。(觸摸事件是指在屏幕中的一個down-up事件,即在屏幕某處按下並抬起的操作)
示例:adb shell monkey --pct-touch 100 -v 10
8.--pct-motion <percent>
調整motion事件百分比。(motion事件是由屏幕上某處一個down事件、一系列偽隨機的移動事件和一個up事件組成)
示例:adb shell monkey --pct-motion 100 -v 10
9.--ignore-crashes
作用:通常應用發生崩潰或異常時Monkey會停止運行。如果設置此項,Monkey會在日志中記錄相關信息並將繼續發送事件給系統,直到事件計數完成。
正常操作,不忽略異常
忽略異常
10.--ignore-timeouts
作用:通常應用程序發生任何超時錯誤(如“Application Not responding”對話框)Monkey將停止運行,設置此項,Monkey將繼續發送事件給系統,直到事件計數完成。
11.Monkey實例
實例1:adb shell monkey -p com.example.login --ignore-crashes --ignore-timeouts --throttle 100 --pct-touch 50 --pct-motion 50 -v -v 100 >E:\log\login.txt
用monkey 命令對登錄apk進行性能測試
實例2:adb shell monkey -p com.example.login --pct-touch 30 --pct-motion 30 --pct-trackball 0 --pct-nav 0 --pct-majornav 20 --pct-appswitch 10 --pct-anyevent 10 -s 12867 --ignore-crashes --ignore-timeouts --throttle 100 -v -v 100 >E:\log\login.txt
使用--pct-xxx參數進行操作的限制。比如操作不僅僅需要點擊,還需要滑動、長按,在智能手機硬件按鈕、應用之間的切換等。
12.Monkey異常分析
Monkey測試出現錯誤后,一般的分析步驟:
看Monkey的日志 (注意第一個swith以及異常信息等)
1. 程序無響應的問題: 在日志中搜索 “ANR”
2. 崩潰問題:在日志中搜索“Exception”或者“crash”(如果出現空指針,NullPointerException)肯定是有bug
Monkey 執行中斷, 在log最后也能看到當前執行次數
三 Monkey進階
1.第一個簡單的Monkey測試命令
上圖日志中間部分顯示了操作事件的默認百分比,這些百分比數字對應的操作可參考Monkey測試的源碼.../Monkey/src/com/android/commands/monkey/MonkeySourceRandom.java文件中的操作定義。
2.Monkey測試注意點
2.1.測試前准備好一切測試的前置條件
2.2.慎重使用adb服務
比如當你正在執行Monkey測試時,由於某種原因使用adb命令重啟了adb服務,那么Monkey測試的日志記錄就會被終止,但正在機器上執行的測試行為不會停止。換句話說,你會看到測試在執行,但卻沒有任何記錄了。
2.3.同時記錄Android系統日志
adb logcat還是非常有必要的。
2.4.一定需要記錄Seed值
Seed值是唯一能夠重現(repro)Monkey測試中出現的崩潰問題的方法。當問題被修復后同樣需要它來進行重現並驗證。
2.5.不要使用單一的命令
多寫幾條有不同測試偏重點的Monkey測試命令,在一個項目中同時使用,有助於找到更多的缺陷。
2.6.必須重視Crash
Monkey測試出現的NullPointException,一般都是可以在用戶使用時出現的,何時出現只是時間問題。所以本質上來說,Monkey所有的CRASH都需要在Release前fix掉。
3.Monkey工具再探索
從development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java源碼中可以很容易找到Monkey測試提供的每個參數,以及是如何實現的,有什么弊端。如果覺得Monkey測試的偽隨機流還不能滿足測試的需求,希望能夠按照特定步驟來執行測試的話,可用以下兩種方法:
(1)更改Monkey自身的源碼。在Linux環境下,下載要測試版本對應的全部源代碼,在終端中定位到源代碼的根目錄,輸入make monkey即可。通過編譯之后可在/out/.../monkey/中獲取Monkey.jar這個包。將編譯好的包通過adb push到要測試的Android系統中的/System/framework下。隨后,或通過Monkey提供的參數啟動,或通過自己寫的參數調用即可。
2.可編寫腳本進行指定的操作。寫一個腳本,將需要Monkey執行的操作放在一個隊列中,從而根據自定義的步驟執行。具體步驟大家可自行谷歌相關信息,或者查看源碼中的核心類:android-x.x.x/development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java。