monkey調(diào)研

一、monkey介紹

Monkey是Android中的一個命令行工具烙常,可以運行在模擬器里或?qū)嶋H設(shè)備中印叁。它向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流(如按鍵輸入、觸摸屏輸入军掂、手勢輸入等)轮蜕,實現(xiàn)對正在開發(fā)的應(yīng)用程序進(jìn)行壓力測試。Monkey測試是一種為了測試軟件的穩(wěn)定性蝗锥、健壯性的快速有效的方法跃洛。

該工具用于進(jìn)行壓力測試。然后開發(fā)人員結(jié)合monkey 打印的日志和系統(tǒng)打印的日志终议,分析測試中的問題

二汇竭、Monkey 測試的特點:

Monkey 測試,所有的事件都是隨機(jī)產(chǎn)生的,不帶任何人的主觀性穴张。

1细燎、測試的對象僅為應(yīng)用程序包,有一定的局限性皂甘。

2玻驻、Monky測試使用的事件數(shù)據(jù)流是隨機(jī)的,不能進(jìn)行自定義。

3璧瞬、可對MonkeyTest的對象户辫,事件數(shù)量,類型嗤锉,頻率等進(jìn)行設(shè)置渔欢。

三、實例

以com.android.calculator2作為對象進(jìn)行MonkeyTest

#monkey -p com.android.calculator2 -v 500

其中-p表示對象包 –v 表示反饋信息級別

運行過程中瘟忱,Emulator中的應(yīng)用程序在不斷地切換畫面奥额。

按照選定的不同級別的反饋信息,在Monkey中還可以看到其執(zhí)行過程報告和生成的事件访诱。?

四披坏、使用monkey help 命令查看命令參數(shù)

C:\Users\chenfenping>adb shell monkey -help

usage: monkey [-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] [--pct-pinchzoom 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]

[--periodic-bugreport]

COUNT

1 參數(shù): -p

用于約束限制,用此參數(shù)指定一個或多個包(Package盐数,即App)棒拂。指定包之后,monkey將只允許系統(tǒng)啟動指定的APP,如果不指定包玫氢,將允許系統(tǒng)啟動設(shè)備中的所有APP.

* 指定一個包: adb shell monkey -p cn.emoney.acg 10

* 指定多個包:adb shell monkey -p cn.emoney.acg –p cn.emoney.wea -p cn.emoney.acg 100

* 不指定包:adb shell monkey 100


2 參數(shù): -v

用于指定反饋信息級別(信息級別就是日志的詳細(xì)程度)帚屉,總共分3個級別,分別對應(yīng)的參數(shù)如下表所示:

日志級別 Level0

示例 adb shell monkey -p cn.emoney.acg –v 100

說明缺省值漾峡,僅提供啟動提示攻旦、測試完成和最終結(jié)果等少量信息


日志級別 Level 1

示例 adb shell monkey -p cn.emoney.acg –v -v 100

說明提供較為詳細(xì)的日志,包括每個發(fā)送到Activity的事件信息


日志級別 Level 2

示例 adb shell monkey -p cn.emoney.acg –v -v –v 100

說明最詳細(xì)的日志生逸,包括了測試中選中/未選中的Activity信息

3 參數(shù): -s

用于指定偽隨機(jī)數(shù)生成器的seed值牢屋,如果seed相同,則兩次Monkey測試所產(chǎn)生的事件序列也相同的槽袄。

Monkey 測試1:adb shell monkey -p cn.emoney.acg -s 10? 100

Monkey 測試2:adb shell monkey -p cn.emoney.acg –s 10 100

兩次測試的效果是相同的烙无,因為模擬的用戶操作序列(每次操作按照一定的先后順序所組成的一系列操作,即一個序列)是一樣的遍尺。

4 參數(shù): --throttle<毫秒>

用于指定用戶操作(即事件)間的時延截酷,單位是毫秒;

adb shell monkey -p cn.emoney.acg --throttle 5000 100

5 參數(shù): --ignore-crashes

用于指定當(dāng)應(yīng)用程序崩潰時(Force& Close錯誤)乾戏,Monkey是否停止運行迂苛。如果使用此參數(shù),即使應(yīng)用程序崩潰鼓择,Monkey依然會發(fā)送事件三幻,直到事件計數(shù)完成。

adb shellmonkey -p cn.emoney.acg --ignore-crashes 1000

測試過程中即使程序崩潰呐能,Monkey依然會繼續(xù)發(fā)送事件直到事件數(shù)目達(dá)到1000為止

adb shellmonkey -p cn.emoney.acg 1000

測試過程中念搬,如果acg程序崩潰,Monkey將會停止運行


6 參數(shù): --ignore-timeouts

用于指定當(dāng)應(yīng)用程序發(fā)生ANR(Application No Responding)錯誤時,Monkey是否停止運行锁蠕。如果使用此參數(shù)夷野,即使應(yīng)用程序發(fā)生ANR錯誤懊蒸,Monkey依然會發(fā)送事件荣倾,直到事件計數(shù)完成。

adb shellmonkey -p cn.emoney.acg --ignore-timeouts 1000


7 參數(shù): --ignore-security-exceptions

用于指定當(dāng)應(yīng)用程序發(fā)生許可錯誤時(如證書許可骑丸,網(wǎng)絡(luò)許可等)舌仍,Monkey是否停止運行。如果使用此參數(shù)通危,即使應(yīng)用程序發(fā)生許可錯誤铸豁,Monkey依然會發(fā)送事件,直到事件計數(shù)完成菊碟。

adb shellmonkey -p cn.emoney.acg --ignore-security-exception 1000


8 參數(shù): --kill-process-after-error

用于指定當(dāng)應(yīng)用程序發(fā)生錯誤時节芥,是否停止其運行。如果指定此參數(shù)逆害,當(dāng)應(yīng)用程序發(fā)生錯誤時头镊,應(yīng)用程序停止運行并保持在當(dāng)前狀態(tài)

(注意:應(yīng)用程序僅是靜止在發(fā)生錯誤時的狀態(tài),系統(tǒng)并不會結(jié)束該應(yīng)用程序的進(jìn)程)魄幕。

adb shellmonkey -p cn.emoney.acg --kill-process-after-error 1000


9 參數(shù): --monitor-native-crashes

用于指定是否監(jiān)視并報告應(yīng)用程序發(fā)生崩潰的本地代碼相艇。

adb shellmonkey -p cn.emoney.acg --monitor-native-crashes 1000


10 參數(shù): --pct-{+事件類別}{+事件類別百分比}

用于指定每種類別事件的數(shù)目百分比(在Monkey事件序列中,該類事件數(shù)目占總事件數(shù)目的百分比)

示例:

--pct-touch{+百分比}

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

adb shell monkey -p cn.emoney.acg --pct-touch 10 1000

--pct-motion?{+百分比}

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

adb shell monkey -p cn.emoney.acg --pct-motion 20 1000

--pct-trackball?{+百分比}

調(diào)整軌跡事件的百分比(軌跡事件由一個或幾個隨機(jī)的移動組成,有時還伴隨有點擊)

adb shell monkey -p cn.emoney.acg --pct-trackball 30 1000

--pct-nav?{+百分比}

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

adb shell monkey -p cn.emoney.acg --pct-nav 40 1000

--pct-majornav?{+百分比}

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

adb shell monkey -p cn.emoney.acg --pct-majornav 50 1000

七阴颖、輸出monkeylog

跑monkey的時候或者想抓程序log導(dǎo)出時臭墨,有時會提示:cannot create D:monkeytest.txt: read-only file system

為什么有時候可以有時候不可以?

后來發(fā)現(xiàn)跟使用使用習(xí)慣不一樣膘盖,一會是先進(jìn)入adb shell 再用命令胧弛,一會是直接命令進(jìn)入。

進(jìn)入adb shell后再用命令就會失敗~

正確方法:退出shell或者執(zhí)行命令時先不要進(jìn)shell

C:\Documents and Settings\Administrator>adb shell monkey -p 包名

?-v 300 ?>e:\text.txt


進(jìn)入adb shell后就相當(dāng)于進(jìn)入linux的root下面侠畔,沒有權(quán)限在里面創(chuàng)建文件~

五结缚、Monkey測試結(jié)果分析

一. 初步分析方法:

Monkey測試出現(xiàn)錯誤后,一般的查錯步驟為以下幾步:

1软棺、找到是monkey里面的哪個地方出錯

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

3、若以上步驟還不能找出茵宪,可以使用之前執(zhí)行的monkey命令再執(zhí)行一遍最冰,注意seed值要一樣--復(fù)現(xiàn)

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

1、 ANR問題:在日志中搜索“ANR”

2稀火、崩潰問題:在日志中搜索“Exception”? Force Close

二. 詳細(xì)分析monkey日志:

將執(zhí)行Monkey生成的log暖哨,從手機(jī)中導(dǎo)出并打開查看該log;在log的最開始都會顯示Monkey執(zhí)行的seed值凰狞、執(zhí)行次數(shù)和測試的包名篇裁。

首先我們需要查看Monkey測試中是否出現(xiàn)了ANR或者異常,具體方法如上述赡若。

然后我們要分析log中的具體信息达布,方法如下:

查看log中第一個Switch,主要是查看Monkey執(zhí)行的是那一個Activity逾冬,譬如下面的log中黍聂,執(zhí)行的是com.tencent.smtt.SplashActivity,在下一個swtich之間的身腻,如果出現(xiàn)了崩潰或其他異常产还,可以在該Activity中查找問題的所在。

:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity;end

// Allowing start of Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]cmp=com.tencent.smtt/.SplashActivity } in package com.tencent.smtt

在下面的log中霸株,Sending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表當(dāng)前執(zhí)行了一個單擊的操作;

Sleeping for 500 milliseconds這句log是執(zhí)行Monkey測試時雕沉,throttle設(shè)定的間隔時間,每出現(xiàn)一次去件,就代表一個事件坡椒。

SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 代表當(dāng)前執(zhí)行了一個點擊下導(dǎo)航鍵的操作;

Sending Pointer ACTION_MOVE 代表當(dāng)前執(zhí)行了一個滑動界面的操作尤溜。

:Sending Pointer ACTION_DOWN x=47.0 y=438.0

:Sending Pointer ACTION_MOVE x=-2.0 y=-4.0

ANR

如果Monkey測試順利執(zhí)行完成倔叼,在log的最后,會打印出當(dāng)前執(zhí)行事件的次數(shù)和所花費的時間宫莱;// Monkey finished代表執(zhí)行完成丈攒。Monkey執(zhí)行中斷,在log的最后也能查看到當(dāng)前已執(zhí)行的次數(shù)授霸。Monkey執(zhí)行完成的log具體如下:

Events injected: 6000

:Dropped: keys=0 pointers=9 trackballs=0 flips=0

## Network stats: elapsed time=808384ms (0ms mobile, 808384ms wifi, 0msnot connected)

// Monkey finished

范例:

Monkey測試結(jié)果:

# monkey -p wfh.LessonTable -v -v -v?200

:Monkey: seed=0?count=200

:AllowPackage: wfh.LessonTable

: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.browser.BrowserActivity (from package com.android.browser)

// Seeded: 0

// Event percentages:

//?? 0: 15.0%

//?? 1: 10.0%

//?? 2: 15.0%

//?? 3: 25.0%

//?? 4: 15.0%

//?? 5: 2.0%

//?? 6: 2.0%

//?? 7: 1.0%

//?? 8: 15.0%


:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=wfh.LessonTable/.MainTable;end

????// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=wfh.LessonTable/.MainTable } in package wfh.LessonTable

Sleeping?for?0?milliseconds

:SendKey (ACTION_DOWN):?21????// KEYCODE_DPAD_LEFT

:SendKey (ACTION_UP):?21????// KEYCODE_DPAD_LEFT

Sleeping?for?0?milliseconds??//------------------------------------用--throttle來設(shè)置一個起效的事件發(fā)生后時延時巡验。

:Sending Pointer ACTION_DOWN x=0.0?y=0.0

:Sending Pointer ACTION_UP x=0.0?y=0.0

Sleeping?for?0?milliseconds

:Sending Pointer ACTION_MOVE x=0.0?y=0.0

當(dāng)測試到ACTION_MOVE x=0.0?y=0.0這個動作時,發(fā)生了FC(Force Close)錯誤碘耳,以下為輸出錯誤信息显设。同時在LogCat里面也有錯誤輸出,而且LogCat里面的錯誤信息更為詳細(xì)辛辨,在實際的測試中應(yīng)該結(jié)合兩者輸出的信息進(jìn)行調(diào)試程序捕捂。

// CRASH: wfh.LessonTable (pid 1973)

// Short Msg: java.lang.NullPointerException

// Long Msg: java.lang.NullPointerException

// Build Label: android:generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys

// Build Changelist: 35983

// Build Time: 1273161972

// ID:

// Tag: AndroidRuntime

// java.lang.NullPointerException:

//?? at android.widget.TabHost.dispatchKeyEvent(TabHost.java:279)

//?? at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)

** Monkey aborted due to error.

Events injected:?190

:Dropped: keys=0?pointers=11?trackballs=0?flips=0

## Network stats: elapsed time=27954ms (27954ms mobile, 0ms wifi, 0ms not connected)

** System appears to have crashed at event?190?of?200?using seed?0

#

開始monkey測試時android的LogCat輸出的信息:

11-01?08:52:53.712: DEBUG/AndroidRuntime(2077): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<

11-01?08:52:53.742: DEBUG/AndroidRuntime(2077): CheckJNI is ON

11-01?08:52:54.453: DEBUG/AndroidRuntime(2077): ---

以下為LogCat輸出的錯誤信息瑟枫,在以下的信息中首先從自己的包中找錯誤,如果沒有自己的包的話就再找發(fā)生錯誤的包的第一個發(fā)生了異常指攒。由錯誤提示可以看出很大的可能是因為TabHost引發(fā)的異常慷妙。經(jīng)過查看代碼發(fā)現(xiàn)是由于TabHost的編寫不規(guī)范,TabHost與其中一個view放在了一起允悦,在monkey測試做滾球上下滾動時當(dāng)滾到TabHost時就發(fā)生了異常了分唾。所以把TabHost與Activity分開寫就不會出現(xiàn)些問題了谐岁。

11-01?08:53:27.113: ERROR/AndroidRuntime(1973): Uncaught handler: thread main exiting due to uncaught exception

11-01?08:53:27.133: ERROR/AndroidRuntime(1973): java.lang.NullPointerException

11-01?08:53:27.133: ERROR/AndroidRuntime(1973):???? at android.widget.TabHost.dispatchKeyEvent(TabHost.java:279)

11-01?08:53:27.133: ERROR/AndroidRuntime(1973):???? at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)

四披蕉、總結(jié):

在monkey測試中常用的命令組合有:

1妖爷、monkey -p com.yourpackage -v?500//簡單的輸出測試的信息咐旧。

2驶鹉、monkey -p com.yourpackage -v -v ?500?//以深度為二級輸出測試信息。

4铣墨、monkey -p com.yourpackage -s 數(shù)字 -v?500//為隨機(jī)數(shù)的事件序列定一個值室埋,若出現(xiàn)問題下次可以重復(fù)同樣的系列進(jìn)行排錯。

5伊约、monkey -p com.yourpackage -v --throttle?3000?500//為每一次執(zhí)行一次有效的事件后休眠3000毫秒姚淆。


五、附錄:

以下內(nèi)容為android系統(tǒng)中的keycode值屡律,在以后的調(diào)試中會經(jīng)常需要查詢:

字母和數(shù)字鍵的鍵碼值(keyCode)





備注:以上內(nèi)容轉(zhuǎn)載自網(wǎng)上腌逢,原文地址:https://www.cnblogs.com/aland-1415/p/6949964.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市超埋,隨后出現(xiàn)的幾起案子搏讶,更是在濱河造成了極大的恐慌,老刑警劉巖霍殴,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒惕,死亡現(xiàn)場離奇詭異,居然都是意外死亡来庭,警方通過查閱死者的電腦和手機(jī)妒蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來月弛,“玉大人肴盏,你說我怎么就攤上這事∶毖茫” “怎么了菜皂?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佛寿。 經(jīng)常有香客問我幌墓,道長但壮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任常侣,我火速辦了婚禮蜡饵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胳施。我一直安慰自己溯祸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布舞肆。 她就那樣靜靜地躺著焦辅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪椿胯。 梳的紋絲不亂的頭發(fā)上筷登,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音哩盲,去河邊找鬼前方。 笑死,一個胖子當(dāng)著我的面吹牛廉油,可吹牛的內(nèi)容都是我干的惠险。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼抒线,長吁一口氣:“原來是場噩夢啊……” “哼班巩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嘶炭,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤抱慌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后旱物,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遥缕,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年宵呛,在試婚紗的時候發(fā)現(xiàn)自己被綠了单匣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡宝穗,死狀恐怖户秤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逮矛,我是刑警寧澤鸡号,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站须鼎,受9級特大地震影響鲸伴,放射性物質(zhì)發(fā)生泄漏府蔗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一汞窗、第九天 我趴在偏房一處隱蔽的房頂上張望姓赤。 院中可真熱鬧,春花似錦仲吏、人聲如沸不铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誓斥。三九已至,卻和暖如春许帐,著一層夾襖步出監(jiān)牢的瞬間劳坑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工舞吭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留泡垃,地道東北人析珊。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓羡鸥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忠寻。 傳聞我的和親對象是個殘疾皇子惧浴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容