一县好、Monkey是什么
Monkey是Android中的一個命令行工具收擦,它其實就是SDK中附帶的一個工具,可以運行在模擬器里或?qū)嶋H設備中鳍置。
二、Monkey測試的目的
Monkey測試是Android平臺自動化測試的一種手段邻奠,通過Monkey程序模擬用戶的按鍵輸入,觸摸屏輸入扬舒,手勢輸入等操作來對設備上的程序進行壓力測試,檢測程序多久的時間會發(fā)生異常凫佛。該工具主要用于進行壓力測試讲坎,開發(fā)人員結合monkey打印的日志解決測試中出現(xiàn)的問題。
三愧薛、Monkey測試的特點
1晨炕、測試的對象僅為應用程序包,有一定的局限性毫炉。
2瓮栗、Monkey測試,所有的事件都是隨機產(chǎn)生的,不帶任何人的主觀性瞄勾。
3费奸、可對MonkeyTest的對象,事件數(shù)量进陡,類型愿阐,頻率等進行設置。
四趾疚、Monkey的使用場景
APP開發(fā)過程中的各個階段:提測缨历、集成以蕴、et等。
五辛孵、Monkey的使用及命令詳解
1舒裤、每個命令的詳細解釋
--help 列出簡單的用法。
-v?
命令行的每一個-v將增加反饋信息的級別觉吭。Level 0(缺省值)除啟動提示腾供、測試完成和最終結果之外,提供較少信息鲜滩。Level 1 提供較為詳細的測試信息伴鳖,如逐個發(fā)送到Activity的事件。Level 2 提供更加詳細的設置信息徙硅,如測試中被選中的或未被選中的Activity事件
-s?
偽隨機數(shù)生成器的seed值榜聂。如果用相同的seed值再次運行Monkey,它將生成相同的事件序列嗓蘑。
--throttle?
在事件之間插入固定延遲须肆。通過這個選項可以減緩Monkey的執(zhí)行速度。如果不指定該選項桩皿,Monkey將不會被延遲豌汇,事件將盡可能快地被產(chǎn)成。
--pct-touch?
調(diào)整觸摸事件的百分比(觸摸事件是一個down-up事件泄隔,它發(fā)生在屏幕上的某單一位置)拒贱。
--pct-motion?
調(diào)整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的偽隨機事件和一個up事件組成)佛嬉。
--pct-trackball?
調(diào)整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成逻澳,有時還伴隨有點擊)。
--pct-nav?
調(diào)整“基本”導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)暖呕。
--pct-majornav?
調(diào)整“主要”導航事件的百分比(這些導航事件通常引發(fā)圖形界面中的動作斜做,如:5-way鍵盤的中間按鍵、回退按鍵湾揽、菜單按鍵)?
--pct-syskeys?
調(diào)整“系統(tǒng)”按鍵事件的百分比(這些按鍵通常被保留瓤逼,由系統(tǒng)使用,如Home钝腺、Back抛姑、Start Call、End Call及音量控制鍵)艳狐。
--pct-appswitch?
調(diào)整啟動Activity的百分比定硝。在隨機間隔里,Monkey將執(zhí)行一個startActivity()調(diào)用毫目,作為最大程度覆蓋包中全部Activity的一種方法蔬啡。
--pct-anyevent?
調(diào)整其它類型事件的百分比诲侮。它包羅了所有其它類型的事件,如:按鍵箱蟆、其它不常用的設備按鈕沟绪、等等。約束限制
-p
如果用此參數(shù)指定了一個或幾個包空猜,Monkey將只允許系統(tǒng)啟動這些包里的Activity绽慈。如果你的應用程序還需要訪問其它包里的Activity(如選 擇取一個聯(lián)系人),那些包也需要在此同時指定辈毯。如果不指定任何包坝疼,Monkey將允許系統(tǒng)啟動全部包里的Activity。要指定多個包谆沃,需要使用多個
-p
選項钝凶,每個-p選項只能用于一個包。
-c?
如 果用此參數(shù)指定了一個或幾個類別唁影,Monkey將只允許系統(tǒng)啟動被這些類別中的某個類別列出的Activity耕陷。如果不指定任何類別,Monkey將選擇 下列類別中列出的Activity:Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY据沈。要指定多個類 別哟沫,需要使用多個-c選項,每個-c選項只能用于一個類別調(diào)試
--dbg-no-events?
設置此選項卓舵,Monkey將執(zhí)行初始啟動南用,進入到一個測試Activity,然后不會再進一步生成事件掏湾。為了得到最佳結果,把它與-v肿嘲、一個或幾個包約束融击、以及一個保持Monkey運行30秒或更長時間的非零值聯(lián)合起來,從而提供一個環(huán)境雳窟,可以監(jiān)視應用程序所調(diào)用的包之間的轉(zhuǎn)換尊浪。
--hprof
設置此選項,將在Monkey事件序列之前和之后立即生成profiling報告封救。這將會在data/misc中生成大文件(~5Mb)拇涤,所以要小心使用它。
--ignore-crashes
通常誉结,當應用程序崩潰或發(fā)生任何失控異常時鹅士,Monkey將停止運行。如果設置此選項惩坑,Monkey將繼續(xù)向系統(tǒng)發(fā)送事件掉盅,直到計數(shù)完成也拜。
--ignore-timeouts
通常,當應用程序發(fā)生任何超時錯誤(如“Application Not Responding”對話框)時趾痘,Monkey將停止運行慢哈。如果設置此選項,Monkey將繼續(xù)向系統(tǒng)發(fā)送事件永票,直到計數(shù)完成卵贱。
--ignore-security-exceptions
通常,當應用程序發(fā)生許可錯誤(如啟動一個需要某些許可的Activity) 時侣集,Monkey將停止運行键俱。如果設置了此選項,Monkey將繼續(xù)向系統(tǒng)發(fā)送事件肚吏,直到計數(shù)完成方妖。
--kill-process-after-error
通常,當Monkey由于一個錯誤而停止時罚攀,出錯的應用程序?qū)⒗^續(xù)處于運行狀態(tài)党觅。當設置了此選項時,將會通知系統(tǒng)停止發(fā)生錯誤的進程斋泄。注意杯瞻,正常的(成功的)結束,并沒有停止啟動的進程炫掐,設備只是在結束事件之后魁莉,簡單地保持在最后的狀態(tài)。
--monitor-native-crashes
監(jiān)視并報告Android系統(tǒng)中本地代碼的崩潰事件募胃。如果設置了--kill- process-after-error旗唁,系統(tǒng)將停止運行。--wait-dbg停止執(zhí)行中的Monkey痹束,直到有調(diào)試器和它相連接检疫。
2.monkey的簡單示例
adb shell monkey -p com.ganji.android.haoche_c -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --throttle 100 -v -v 100>e:\monkeytest1008.txt
【命令釋義monkey作用的包:com.ganji.android.haoche_c
產(chǎn)生時間序列的種子值:100,忽略程序崩潰祷嘶、忽略超時屎媳、忽略程序錯誤、監(jiān)視本地程序崩潰论巍、事件之間延遲時間設定為100ms烛谊、日志詳細信息級別為2 , 產(chǎn)生100個事件嘉汰,日志寫入e盤的monkeytest1008.txt文檔中 丹禀。】
五、Monkey日志分析
:Monkey: seed=100 count=100? /* seed:隨機種子數(shù)湃崩;count:事件總數(shù) */
:AllowPackage: com.ganji.android.haoche_c?? /* 包名? */
: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.bbkmusic.WidgetToTrackActivity (from package com.android.bbkmusic)
//?? - NOT USING main activity com.android.bbksoundrecorder.SoundRecorder (from package com.android.bbksoundrecorder)
//?? - NOT USING main activity com.android.camera.CameraActivity (from package com.android.camera)
//?? - NOT USING main activity com.android.contacts.DialtactsContactsEntryActivity (from package com.android.contacts)
//?? - NOT USING main activity com.android.dialer.TwelveKeyDialer (from package com.android.dialer)
//?? - NOT USING main activity com.android.mms.ui.ConversationList (from package com.android.mms)
//?? - NOT USING main activity com.android.settings.Settings (from package com.android.settings)
//?? - NOT USING main activity com.bbk.calendar.MainActivity (from package com.bbk.calendar)
//?? - NOT USING main activity com.bbk.theme.Theme (from package com.bbk.theme)
//?? - NOT USING main activity com.chaozh.iReader.ui.activity.WelcomeActivity (from package com.chaozh.iReader)
//?? - NOT USING main activity com.vivo.email.activity.Welcome (from package com.vivo.email)
//?? - NOT USING main activity com.android.gallery3d.vivo.GalleryTabActivity (from package com.vivo.gallery)
//?? - NOT USING main activity com.google.android.apps.chrome.Main (from package com.android.chrome)
//?? - NOT USING main activity com.cubic.autohome.LogoActivity (from package com.cubic.autohome)
//?? - NOT USING main activity org.hapjs.mockup.activity.MainActivity (from package org.hapjs.mockup)
//?? - NOT USING main activity com.android.BBKClock.Timer (from package com.android.BBKClock)
//?? - NOT USING main activity com.vivo.video.app.splash.SplashActivity (from package com.android.VideoPlayer)
//?? - NOT USING main activity com.android.bbkcalculator.Calculator (from package com.android.bbkcalculator)
//?? - NOT USING main activity com.android.filemanager.FileManagerActivity (from package com.android.filemanager)
//?? - NOT USING main activity com.android.notes.Notes (from package com.android.notes)
//?? - NOT USING main activity com.bbk.appstore.ui.AppStore (from package com.bbk.appstore)
//?? - NOT USING main activity com.bbk.cloud.activities.BBKCloudHomeScreen (from package com.bbk.cloud)
//?? - NOT USING main activity com.iqoo.secure.MainGuideActivity (from package com.iqoo.secure)
//?? - NOT USING main activity com.vivo.Tips.MainActivity (from package com.vivo.Tips)
//?? - NOT USING main activity com.vivo.browser.BrowserActivity (from package com.vivo.browser)
//?? - NOT USING main activity com.vivo.childrenmode.activity.ChildHomeActivity (from package com.vivo.childrenmode)
//?? - NOT USING main activity com.vivo.compass.CalibrationActivity (from package com.vivo.compass)
//?? - NOT USING main activity com.vivo.game.ui.LogoActivity (from package com.vivo.game)
//?? - NOT USING main activity com.vivo.space.ui.LogoActivity (from package com.vivo.space)
//?? - NOT USING main activity com.vivo.weather.WeatherMain (from package com.vivo.weather)
//?? - NOT USING main activity com.UCMobile.main.UCMobile (from package com.UCMobile)
//?? - NOT USING main activity com.android.bbk.lockscreen3.LockScreenActivity (from package com.android.bbk.lockscreen3)
//?? - NOT USING main activity com.bbk.iqoo.feedback.activities.UserFeedBackActivity (from package com.bbk.iqoo.feedback)
//?? - NOT USING main activity com.guazi.crm.modules.splash.SplashActivity (from package com.ganji.android.haoche)
//?? - NOT USING main activity com.squareup.leakcanary.internal.DisplayLeakActivity (from package com.ganji.android.haoche)
//?? - NOT USING main activity com.github.moduth.blockcanary.ui.DisplayActivity (from package com.ganji.android.haoche)
//?? + Using main activity com.ganji.android.haoche_c.ui.main.MainActivity (from package com.ganji.android.haoche_c)
//?? - NOT USING main activity com.guazi.android.expert.activity.SplashLoginActivity (from package com.guazi.android.expert)
//?? - NOT USING main activity com.guazi.newcar.modules.splash.SplashActivity (from package com.guazi.newcar)
//?? - NOT USING main activity com.squareup.leakcanary.internal.DisplayLeakActivity (from package com.guazi.newcar)
//?? - NOT USING main activity com.guazi.polaris.SplashActivity (from package com.guazi.polaris)
//?? - NOT USING main activity com.ijinshan.browser.screen.SplashActivity (from package com.ijinshan.browser_fast)
//?? - NOT USING main activity com.jingdong.app.mall.main.MainActivity (from package com.jingdong.app.mall)
//?? - NOT USING main activity com.lucky.luckyclient.splash.splash.SplashActivity (from package com.lucky.luckyclient)
//?? - NOT USING main activity com.maintain.verify.activity.SplashActivity (from package com.maintain.verify)
//?? - NOT USING main activity com.renrenche.carapp.ui.activity.SplashActivity (from package com.renrenche.carapp)
//?? - NOT USING main activity?com.meituan.android.pt.homepage.activity.Welcome (from package com.sankuai.meituan)
//?? - NOT USING main activity com.sina.weibo.SplashActivity (from package com.sina.weibo)
//?? - NOT USING main activity com.taobao.tao.welcome.Welcome (from package com.taobao.taobao)
//?? - NOT USING main activity?com.tencent.mm.ui.LauncherUI (from package?com.tencent.mm)
//?? - NOT USING main activity com.tencent.mobileqq.activity.SplashActivity (from package com.tencent.mobileqq)
//?? - NOT USING main activity com.tencent.mtt.SplashActivity (from package com.tencent.mtt)
//?? - NOT USING main activity com.tencent.news.activity.SplashActivity (from package com.tencent.news)
//?? - NOT USING main activity com.tencent.qqlive.ona.activity.WelcomeActivity (from package com.tencent.qqlive)
//?? - NOT USING main activity com.uxin.usedcar.ui.fragment.SplashActivity (from package com.uxin.usedcar)
//?? - NOT USING main activity com.vivo.easyshare.activity.SplashScreenActivity (from package com.vivo.easyshare)
//?? - NOT USING main activity com.pp.assistant.activity.PPMainActivity (from package com.wandoujia.phoenix2)
//?? - NOT USING main activity com.wuba.activity.launch.LaunchActivity (from package com.wuba)
//?? - NOT USING main activity com.zhihu.android.app.ui.activity.LauncherActivity (from package com.zhihu.android)
//?? - NOT USING main activity ctrip.business.splash.CtripSplashActivity (from package ctrip.android.view)
//?? - NOT USING main activity io.appium.settings.Settings (from package io.appium.settings)
//?? - NOT USING main activity io.appium.unlock.Unlock (from package io.appium.unlock)
//?? - NOT USING main activity org.hapjs.debugger.MainActivity (from package org.hapjs.debugger)
//?? - NOT USING main activity sogou.mobile.explorer.NoDisplayActivity (from package sogou.mobile.explorer)
// Selecting main activities from category android.intent.category.MONKEY
//?? - NOT USING main activity com.android.settings.Settings$RunningServicesActivity (from package com.android.settings)
//?? - NOT USING main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings)
//?? - NOT USING main activity com.bbk.launcher2.Launcher (from package com.bbk.launcher2)
//?? - NOT USING main activity com.bbk.scene.launcher.theme.SceneLauncherThemeMainActivity (from package com.bbk.scene.launcher.theme)
//?? - NOT USING main activity com.iqoo.engineermode.EngineerMode (from package com.iqoo.engineermode)
//?? - NOT USING main activity com.vivo.childrenmode.activity.MainActivity (from package com.vivo.childrenmode)
// Seeded: 100
// Event percentages:
//?? 0: 15.0% ? /* 0:觸摸事件百分比荧降,即參數(shù)--pct-touc */?
//?? 1: 10.0%?? /* 1:滑動事件百分比,即參數(shù)--pct-motion */
//?? 2: 2.0%???? /* 2:縮放事件百分比攒读,即參數(shù)--pct-pinchzoom */
//?? 3: 15.0%?? /* 3:軌跡球事件百分比朵诫,即參數(shù)--pct-trackball */
//?? 4: -0.0%?? /* 4:屏幕旋轉(zhuǎn)事件百分比,即參數(shù)--pct-rotation */
//?? 5: -0.0%?? /* 5:基本導航事件百分比薄扁,即參數(shù)--pct-nav */
//?? 6: 25.0%? /* 6:主要導航事件百分比剪返,即參數(shù)--pct-majornav */
//?? 7: 15.0%? /* 7:系統(tǒng)事件百分比,即參數(shù)--pct-syskeys */
//?? 8: 2.0%?? /* 8:Activity啟動事件百分比邓梅,即參數(shù)--pct-appswitch */
//?? 9: 2.0%?? /* 9:鍵盤翻轉(zhuǎn)事件百分比脱盲,即參數(shù)--pct-flip */
//?? 10: 14.0% /* 10:其他事件百分比,即參數(shù)--pct-anyevent */
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.ganji.android.haoche_c/.ui.main.MainActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.ganji.android.haoche_c/.ui.main.MainActivity } in package com.ganji.android.haoche_c
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 Touch (ACTION_DOWN): 0:(236.0,1448.0)
:Sending Touch (ACTION_UP): 0:(239.6952,1450.5131)
Sleeping for 0 milliseconds
:Sending Touch (ACTION_DOWN): 0:(817.0,672.0)
:Sending Touch (ACTION_MOVE): 0:(806.7215,674.58936)
// Rejecting start of Intent { cmp=com.vivo.upslide/.recents.RecentsActivity } in package com.vivo.upslide
:Sending Touch (ACTION_MOVE): 0:(796.983,678.33875)
:Sending Touch (ACTION_MOVE): 0:(777.5646,682.8886)
:Sending Touch (ACTION_MOVE): 0:(760.08307,683.68207)
:Sending Touch (ACTION_MOVE): 0:(753.2682,686.4697)
:Sending Touch (ACTION_MOVE): 0:(744.06885,686.58435)
:Sending Touch (ACTION_MOVE): 0:(732.9116,692.0274)
:Sending Touch (ACTION_MOVE): 0:(720.2788,693.7811)
:Sending Touch (ACTION_UP): 0:(704.8928,701.56537)
Sleeping for 0 milliseconds
:Sending Touch (ACTION_DOWN): 0:(268.0,1826.0)
:Sending Touch (ACTION_UP): 0:(264.17523,1823.462)
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): 23??? // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23??? // KEYCODE_DPAD_CENTER
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:(336.0,359.0)
:Sending Touch (ACTION_MOVE): 0:(340.20886,357.3222)
:Sending Touch (ACTION_MOVE): 0:(342.71722,353.41183)
:Sending Touch (ACTION_MOVE): 0:(346.9966,350.894)
:Sending Touch (ACTION_MOVE): 0:(355.95114,348.16638)
:Sending Touch (ACTION_MOVE): 0:(358.57358,344.2732)
:Sending Touch (ACTION_UP): 0:(367.2303,344.00336)
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 242??? // KEYCODE_TV_ANTENNA_CABLE
:Sending Key (ACTION_UP): 242??? // KEYCODE_TV_ANTENNA_CABLE
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 Trackball (ACTION_MOVE): 0:(-4.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,2.0)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,3.0)
: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,-2.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,-5.0)
: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:(546.0,1255.0)
:Sending Touch (ACTION_UP): 0:(538.475,1257.1292)
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:(788.0,1096.0)
:Sending Touch (ACTION_UP): 0:(785.90125,1099.7758)
Sleeping for 0 milliseconds
:Sending Touch (ACTION_DOWN): 0:(440.0,1768.0)
:Sending Touch (ACTION_MOVE): 0:(443.97714,1764.4805)
:Sending Touch (ACTION_MOVE): 0:(452.77997,1757.93)
:Sending Touch (ACTION_MOVE): 0:(454.22604,1757.2743)
:Sending Touch (ACTION_MOVE): 0:(463.5927,1757.0007)
:Sending Touch (ACTION_MOVE): 0:(472.0165,1752.8053)
:Sending Touch (ACTION_MOVE): 0:(475.4624,1751.4882)
:Sending Touch (ACTION_MOVE): 0:(482.6616,1745.5962)
:Sending Touch (ACTION_UP): 0:(489.12665,1742.0593)
Sleeping for 0 milliseconds
:Sending Flip keyboardOpen=false
Got IOException performing?flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed
Sleeping for 0 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(-4.0,0.0)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0)
// Allowing start of Intent { cmp=com.ganji.android.haoche_c/.ui.html5.Html5Activity } in package com.ganji.android.haoche_c
:Sending Trackball (ACTION_MOVE): 0:(3.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,3.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(2.0,2.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(0.0,3.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,0.0)
:Sending Key (ACTION_DOWN): 20??? // KEYCODE_DPAD_DOWN
:Sending Key (ACTION_UP): 20??? // KEYCODE_DPAD_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): 135??? // KEYCODE_F5
:Sending Key (ACTION_UP): 135??? // KEYCODE_F5
Sleeping for 0 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(-4.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(0.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,4.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,3.0)
:Sending Trackball (ACTION_MOVE): 0:(2.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,3.0)
:Sending Trackball (ACTION_MOVE): 0:(0.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,0.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-5.0)
:Sending Key (ACTION_DOWN): 22??? // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22??? // KEYCODE_DPAD_RIGHT
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 Trackball (ACTION_MOVE): 0:(3.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(2.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(0.0,-2.0)
Events injected: 100
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=1 rotations=0
## Network stats: elapsed time=483ms (0ms mobile, 0ms wifi, 483ms not connected)
// Monkey finished
查看Monkey日志日缨,初步分析方法:
Monkey測試出現(xiàn)錯誤后钱反,一般的差錯步驟為以下幾步:
1、 找到是monkey里面的哪個地方出錯(如(快捷鍵Ctrl+f)搜索crash匣距,查看crash位置前后是否有當前app的包名面哥,如果有,則定位到crash由app引起的)
2毅待、 查看Monkey里面出錯前的一些事件動作尚卫,并手動執(zhí)行該動作
3、 若以上步驟還不能找出尸红,可以使用之前執(zhí)行的monkey命令再執(zhí)行一遍吱涉,注意seed值要一樣
一般的測試結果分析:
1、 ANR問題(無響應問題):在日志中搜索“ANR”
2外里、 崩潰問題:在日志中搜索“Exception”
六怎爵、個人在Monkey中常遇見的問題
1、 真機用adb shell命令時出現(xiàn)以下提示:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
error: device not found
解決方案:①查看下手機設置 USB Debugging 是否開啟盅蝗?
②試試重啟adb:adb kill-server
adb start-server
adb remount
③小米手機需要在彈出的對話框點確定允許調(diào)試疙咸。
2、跑monkey的時候想抓程序log導出時风科,有時會提示:cannot create D:monkeytest.txt: read-only file system
為什么有時候可以有時候不可以?后來發(fā)現(xiàn)跟使用使用習慣不一樣有關乞旦。有時候是先進入adb shell 再用命令贼穆,有時候是直接命令進入。進入adb shell后再用命令就會失敗兰粉,進入adb shell后就相當于進入linux的root下面故痊,沒有權限在里面創(chuàng)建文件。正確方法:退出shell或者執(zhí)行命令時先不要進shell玖姑。
3愕秫、跑monkey的時候慨菱,如果出現(xiàn)特殊情況需要強行停止,如(斷網(wǎng)等干擾)
停止monkey的方式:1戴甩、adb shell(登錄設備)? 2符喝、top|grep "monkey" (實時查詢monkey的進程號) 3、kill -9 31819(-9:強制殺死進程甜孤;31819為查詢出來的進程號)
4协饲、monkey的隨機事件可以幫助我們發(fā)現(xiàn)app中的一些缺陷,但是這些“隨機”也會給我們帶來一些困擾
手機經(jīng)常會在一個頁面出不去缴川,其他業(yè)務測試不到
手機網(wǎng)絡關掉后茉稠,導致APP大部分在無網(wǎng)情況下運行,一些業(yè)務測試不到
怎樣才能知道手機跑monkey時候的運行狀態(tài)把夸,如內(nèi)存
1.手機經(jīng)常會在一個頁面出不去而线,其他業(yè)務測試不到
手機會困在一個頁面出不去。那我們需要做的就是在跑Monkey的間隔把APP從頁面推出去恋日。
一個方法是使用“back”鍵退出程序:adb shell input keyevent 4?循環(huán)幾次就可以退出去了
但是現(xiàn)實中還是有退不出的情況膀篮,怎么辦?
另一個方案就是強制退出:adb shell am force-stop yourPkgName
2.手機網(wǎng)絡關掉后谚鄙,導致APP大部分在無網(wǎng)情況下運行各拷,一些業(yè)務測試不到
目前的方案就是停止monkey,在網(wǎng)絡環(huán)境好的情況下重新跑monkey:1闷营、adb shell(登錄設備)? 2烤黍、top|grep "monkey" (實時查詢monkey的進程號) 3、kill -9 31819(-9:強制殺死進程傻盟;31819為查詢出來的進程號)
3.怎樣才能知道手機跑monkey時候的運行狀態(tài)速蕊,如內(nèi)存
adb shell cat /proc/meminfo
運行這個命令,就可以獲取相關的內(nèi)存信息了娘赴。