Monkey的使用及日志解讀

一、Monkey是什么

Monkey是Android中的一個(gè)命令行工具,它其實(shí)就是SDK中附帶的一個(gè)工具,可以運(yùn)行在模擬器里或?qū)嶋H設(shè)備中。

二、Monkey測(cè)試的目的

Monkey測(cè)試是Android平臺(tái)自動(dòng)化測(cè)試的一種手段,通過(guò)Monkey程序模擬用戶(hù)的按鍵輸入,觸摸屏輸入,手勢(shì)輸入等操作來(lái)對(duì)設(shè)備上的程序進(jìn)行壓力測(cè)試,檢測(cè)程序多久的時(shí)間會(huì)發(fā)生異常。該工具主要用于進(jìn)行壓力測(cè)試,開(kāi)發(fā)人員結(jié)合monkey打印的日志解決測(cè)試中出現(xiàn)的問(wèn)題。

三、Monkey測(cè)試的特點(diǎn)

1、測(cè)試的對(duì)象僅為應(yīng)用程序包,有一定的局限性。

2、Monkey測(cè)試,所有的事件都是隨機(jī)產(chǎn)生的,不帶任何人的主觀(guān)性。

3、可對(duì)MonkeyTest的對(duì)象,事件數(shù)量,類(lèi)型,頻率等進(jìn)行設(shè)置。

四、Monkey的使用場(chǎng)景

APP開(kāi)發(fā)過(guò)程中的各個(gè)階段:提測(cè)、集成、et等。

五、Monkey的使用及命令詳解

1、每個(gè)命令的詳細(xì)解釋

--help 列出簡(jiǎn)單的用法。

-v?

命令行的每一個(gè)-v將增加反饋信息的級(jí)別。Level 0(缺省值)除啟動(dòng)提示、測(cè)試完成和最終結(jié)果之外,提供較少信息。Level 1 提供較為詳細(xì)的測(cè)試信息,如逐個(gè)發(fā)送到Activity的事件。Level 2 提供更加詳細(xì)的設(shè)置信息,如測(cè)試中被選中的或未被選中的Activity事件

-s?

偽隨機(jī)數(shù)生成器的seed值。如果用相同的seed值再次運(yùn)行Monkey,它將生成相同的事件序列。

--throttle?

在事件之間插入固定延遲。通過(guò)這個(gè)選項(xiàng)可以減緩Monkey的執(zhí)行速度。如果不指定該選項(xiàng),Monkey將不會(huì)被延遲,事件將盡可能快地被產(chǎn)成。

--pct-touch?

調(diào)整觸摸事件的百分比(觸摸事件是一個(gè)down-up事件,它發(fā)生在屏幕上的某單一位置)。

--pct-motion?

調(diào)整動(dòng)作事件的百分比(動(dòng)作事件由屏幕上某處的一個(gè)down事件、一系列的偽隨機(jī)事件和一個(gè)up事件組成)。

--pct-trackball?

調(diào)整軌跡事件的百分比(軌跡事件由一個(gè)或幾個(gè)隨機(jī)的移動(dòng)組成,有時(shí)還伴隨有點(diǎn)擊)。

--pct-nav?

調(diào)整“基本”導(dǎo)航事件的百分比(導(dǎo)航事件由來(lái)自方向輸入設(shè)備的up/down/left/right組成)。

--pct-majornav?

調(diào)整“主要”導(dǎo)航事件的百分比(這些導(dǎo)航事件通常引發(fā)圖形界面中的動(dòng)作,如:5-way鍵盤(pán)的中間按鍵、回退按鍵、菜單按鍵)?

--pct-syskeys?

調(diào)整“系統(tǒng)”按鍵事件的百分比(這些按鍵通常被保留,由系統(tǒng)使用,如Home、Back、Start Call、End Call及音量控制鍵)。

--pct-appswitch?

調(diào)整啟動(dòng)Activity的百分比。在隨機(jī)間隔里,Monkey將執(zhí)行一個(gè)startActivity()調(diào)用,作為最大程度覆蓋包中全部Activity的一種方法。

--pct-anyevent?

調(diào)整其它類(lèi)型事件的百分比。它包羅了所有其它類(lèi)型的事件,如:按鍵、其它不常用的設(shè)備按鈕、等等。約束限制

-p

如果用此參數(shù)指定了一個(gè)或幾個(gè)包,Monkey將只允許系統(tǒng)啟動(dòng)這些包里的Activity。如果你的應(yīng)用程序還需要訪(fǎng)問(wèn)其它包里的Activity(如選 擇取一個(gè)聯(lián)系人),那些包也需要在此同時(shí)指定。如果不指定任何包,Monkey將允許系統(tǒng)啟動(dòng)全部包里的Activity。要指定多個(gè)包,需要使用多個(gè)

-p

選項(xiàng),每個(gè)-p選項(xiàng)只能用于一個(gè)包。

-c?

如 果用此參數(shù)指定了一個(gè)或幾個(gè)類(lèi)別,Monkey將只允許系統(tǒng)啟動(dòng)被這些類(lèi)別中的某個(gè)類(lèi)別列出的Activity。如果不指定任何類(lèi)別,Monkey將選擇 下列類(lèi)別中列出的Activity:Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多個(gè)類(lèi) 別,需要使用多個(gè)-c選項(xiàng),每個(gè)-c選項(xiàng)只能用于一個(gè)類(lèi)別調(diào)試

--dbg-no-events?

設(shè)置此選項(xiàng),Monkey將執(zhí)行初始啟動(dòng),進(jìn)入到一個(gè)測(cè)試Activity,然后不會(huì)再進(jìn)一步生成事件。為了得到最佳結(jié)果,把它與-v、一個(gè)或幾個(gè)包約束、以及一個(gè)保持Monkey運(yùn)行30秒或更長(zhǎng)時(shí)間的非零值聯(lián)合起來(lái),從而提供一個(gè)環(huán)境,可以監(jiān)視應(yīng)用程序所調(diào)用的包之間的轉(zhuǎn)換。

--hprof

設(shè)置此選項(xiàng),將在Monkey事件序列之前和之后立即生成profiling報(bào)告。這將會(huì)在data/misc中生成大文件(~5Mb),所以要小心使用它。

--ignore-crashes

通常,當(dāng)應(yīng)用程序崩潰或發(fā)生任何失控異常時(shí),Monkey將停止運(yùn)行。如果設(shè)置此選項(xiàng),Monkey將繼續(xù)向系統(tǒng)發(fā)送事件,直到計(jì)數(shù)完成。

--ignore-timeouts

通常,當(dāng)應(yīng)用程序發(fā)生任何超時(shí)錯(cuò)誤(如“Application Not Responding”對(duì)話(huà)框)時(shí),Monkey將停止運(yùn)行。如果設(shè)置此選項(xiàng),Monkey將繼續(xù)向系統(tǒng)發(fā)送事件,直到計(jì)數(shù)完成。

--ignore-security-exceptions

通常,當(dāng)應(yīng)用程序發(fā)生許可錯(cuò)誤(如啟動(dòng)一個(gè)需要某些許可的Activity) 時(shí),Monkey將停止運(yùn)行。如果設(shè)置了此選項(xiàng),Monkey將繼續(xù)向系統(tǒng)發(fā)送事件,直到計(jì)數(shù)完成。

--kill-process-after-error

通常,當(dāng)Monkey由于一個(gè)錯(cuò)誤而停止時(shí),出錯(cuò)的應(yīng)用程序?qū)⒗^續(xù)處于運(yùn)行狀態(tài)。當(dāng)設(shè)置了此選項(xiàng)時(shí),將會(huì)通知系統(tǒng)停止發(fā)生錯(cuò)誤的進(jìn)程。注意,正常的(成功的)結(jié)束,并沒(méi)有停止啟動(dòng)的進(jìn)程,設(shè)備只是在結(jié)束事件之后,簡(jiǎn)單地保持在最后的狀態(tài)。

--monitor-native-crashes

監(jiān)視并報(bào)告Android系統(tǒng)中本地代碼的崩潰事件。如果設(shè)置了--kill- process-after-error,系統(tǒng)將停止運(yùn)行。--wait-dbg停止執(zhí)行中的Monkey,直到有調(diào)試器和它相連接。

2.monkey的簡(jiǎn)單示例

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)生時(shí)間序列的種子值:100,忽略程序崩潰、忽略超時(shí)、忽略程序錯(cuò)誤、監(jiān)視本地程序崩潰、事件之間延遲時(shí)間設(shè)定為100ms、日志詳細(xì)信息級(jí)別為2 , 產(chǎn)生100個(gè)事件,日志寫(xiě)入e盤(pán)的monkeytest1008.txt文檔中 ?!?/p>

五、Monkey日志分析

:Monkey: seed=100 count=100? /* seed:隨機(jī)種子數(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:滑動(dòng)事件百分比,即參數(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:基本導(dǎo)航事件百分比,即參數(shù)--pct-nav */

//?? 6: 25.0%? /* 6:主要導(dǎo)航事件百分比,即參數(shù)--pct-majornav */

//?? 7: 15.0%? /* 7:系統(tǒng)事件百分比,即參數(shù)--pct-syskeys */

//?? 8: 2.0%?? /* 8:Activity啟動(dòng)事件百分比,即參數(shù)--pct-appswitch */

//?? 9: 2.0%?? /* 9:鍵盤(pán)翻轉(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測(cè)試出現(xiàn)錯(cuò)誤后,一般的差錯(cuò)步驟為以下幾步:

1、 找到是monkey里面的哪個(gè)地方出錯(cuò)(如(快捷鍵Ctrl+f)搜索crash,查看crash位置前后是否有當(dāng)前app的包名,如果有,則定位到crash由app引起的)

2、 查看Monkey里面出錯(cuò)前的一些事件動(dòng)作,并手動(dòng)執(zhí)行該動(dòng)作

3、 若以上步驟還不能找出,可以使用之前執(zhí)行的monkey命令再執(zhí)行一遍,注意seed值要一樣

一般的測(cè)試結(jié)果分析:

1、 ANR問(wèn)題(無(wú)響應(yīng)問(wèn)題):在日志中搜索“ANR”

2、 崩潰問(wèn)題:在日志中搜索“Exception”

六、個(gè)人在Monkey中常遇見(jiàn)的問(wèn)題

1、 真機(jī)用adb shell命令時(shí)出現(xiàn)以下提示:

* daemon not running. starting it now on port 5037 *

* daemon started successfully *

error: device not found

解決方案:①查看下手機(jī)設(shè)置 USB Debugging 是否開(kāi)啟?

②試試重啟adb:adb kill-server

adb start-server

adb remount

③小米手機(jī)需要在彈出的對(duì)話(huà)框點(diǎn)確定允許調(diào)試。

2、跑monkey的時(shí)候想抓程序log導(dǎo)出時(shí),有時(shí)會(huì)提示:cannot create D:monkeytest.txt: read-only file system

為什么有時(shí)候可以有時(shí)候不可以?后來(lái)發(fā)現(xiàn)跟使用使用習(xí)慣不一樣有關(guān)。有時(shí)候是先進(jìn)入adb shell 再用命令,有時(shí)候是直接命令進(jìn)入。進(jìn)入adb shell后再用命令就會(huì)失敗,進(jìn)入adb shell后就相當(dāng)于進(jìn)入linux的root下面,沒(méi)有權(quán)限在里面創(chuàng)建文件。正確方法:退出shell或者執(zhí)行命令時(shí)先不要進(jìn)shell。

3、跑monkey的時(shí)候,如果出現(xiàn)特殊情況需要強(qiáng)行停止,如(斷網(wǎng)等干擾)

停止monkey的方式:1、adb shell(登錄設(shè)備)? 2、top|grep "monkey" (實(shí)時(shí)查詢(xún)monkey的進(jìn)程號(hào)) 3、kill -9 31819(-9:強(qiáng)制殺死進(jìn)程;31819為查詢(xún)出來(lái)的進(jìn)程號(hào))

4、monkey的隨機(jī)事件可以幫助我們發(fā)現(xiàn)app中的一些缺陷,但是這些“隨機(jī)”也會(huì)給我們帶來(lái)一些困擾

手機(jī)經(jīng)常會(huì)在一個(gè)頁(yè)面出不去,其他業(yè)務(wù)測(cè)試不到

手機(jī)網(wǎng)絡(luò)關(guān)掉后,導(dǎo)致APP大部分在無(wú)網(wǎng)情況下運(yùn)行,一些業(yè)務(wù)測(cè)試不到

怎樣才能知道手機(jī)跑monkey時(shí)候的運(yùn)行狀態(tài),如內(nèi)存

1.手機(jī)經(jīng)常會(huì)在一個(gè)頁(yè)面出不去,其他業(yè)務(wù)測(cè)試不到

手機(jī)會(huì)困在一個(gè)頁(yè)面出不去。那我們需要做的就是在跑Monkey的間隔把APP從頁(yè)面推出去。

一個(gè)方法是使用“back”鍵退出程序:adb shell input keyevent 4?循環(huán)幾次就可以退出去了

但是現(xiàn)實(shí)中還是有退不出的情況,怎么辦?

另一個(gè)方案就是強(qiáng)制退出:adb shell am force-stop yourPkgName

2.手機(jī)網(wǎng)絡(luò)關(guān)掉后,導(dǎo)致APP大部分在無(wú)網(wǎng)情況下運(yùn)行,一些業(yè)務(wù)測(cè)試不到

目前的方案就是停止monkey,在網(wǎng)絡(luò)環(huán)境好的情況下重新跑monkey:1、adb shell(登錄設(shè)備)? 2、top|grep "monkey" (實(shí)時(shí)查詢(xún)monkey的進(jìn)程號(hào)) 3、kill -9 31819(-9:強(qiáng)制殺死進(jìn)程;31819為查詢(xún)出來(lái)的進(jìn)程號(hào))

3.怎樣才能知道手機(jī)跑monkey時(shí)候的運(yùn)行狀態(tài),如內(nèi)存

adb shell cat /proc/meminfo

運(yùn)行這個(gè)命令,就可以獲取相關(guān)的內(nèi)存信息了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容