monkey命令解析詳解

 
我面試時遇到過幾回讓背個monkey命令的,能夠這樣簡單說一個:adb shell monkey -p(約束包名) -s 200 -v -v --throttle 300 1500000 >e:\001.txt (日誌保存路徑)
 
1、monkey簡介:

Monkey 就是SDK中附帶的一個工具。Monkey是Android中的一個命令行工具,能夠運行在模擬器裏或實際設備中。它向系統發送僞隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。Monkey測試是一種爲了測試軟件的穩定性、健壯性的快速有效的方法。java

該工具用於進行壓力測試。而後開發人員結合monkey 打印的日誌和系統打印的日誌,分析測試中的問題linux

Monkey 測試的特色:android

Monkey 測試,全部的事件都是隨機產生的,不帶任何人的主觀性。面試

一、測試的對象僅爲應用程序包,有必定的侷限性。shell

二、Monky測試使用的事件數據流是隨機的,不能進行自定義。瀏覽器

三、可對MonkeyTest的對象,事件數量,類型,頻率等進行設置。網絡

2、Monkey的基本用法app

基本語法以下:dom

$ adb shell monkey [options]eclipse

若是不指定options,Monkey將以無反饋模式啓動,並把事件任意發送到安裝在目標環境中的所有包。下面是一個更爲典型的命令行示例,它啓動指定的應用程序,並向其發送500個僞隨機事件:

$ adb shell monkey -p your.package.name -v 500
使用android自動化測試工具monkeyrunner啓動應用時,須要填寫被測程序的包名和啓動的Activity,如下有兩種查看應用包名package和入口activity名稱的方法:

方法一:使用aapt    //aapt是sdk自帶的一個工具,在sdk\builds-tools\目錄下

1.以ES文件瀏覽器爲例,命令行中切換到aapt.exe目錄執行:aapt dump badging E:\apk\es3.apk

2.

注:在android sdk目錄搜索能夠找到aapt.exe,若是沒有能夠下載apktool。

 

 

3、Monkey測試的一個實例

經過這個實例,咱們能理解Monkey測試的步驟以及如何知道哪些應用程序可以用Monkey進行測試。

Windows下(注:2—4步是爲了查看咱們能夠測試哪些應用程序包,可省略):

一、經過eclipse啓動一個Android的emulator

二、在命令行中輸入:adb devices查看設備鏈接狀況

C:\Documents and Settings\Administrator>adb devices

List of devices attached

emulator-5554   device

三、在有設備鏈接的前提下,在命令行中輸入:adb shell 進入shell界面

C:\Documents and Settings\Administrator>adb shell

#

四、查看data/data文件夾下的應用程序包。注:咱們能測試的應用程序包都在這個目錄下面

C:\Documents and Settings\Administrator>adb shell

# ls data/data

ls data/data

五、以com.android.calculator2做爲對象進行MonkeyTest

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

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

運行過程當中,Emulator中的應用程序在不斷地切換畫面。

按照選定的不一樣級別的反饋信息,在Monkey中還能夠看到其執行過程報告和生成的事件。 

4、使用monkey help 命令查看命令參數

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 參數: -p

用於約束限制,用此參數指定一個或多個包(Package,即App)。指定包以後,monkey將只容許系統啓動指定的APP,若是不指定包,將容許系統啓動設備中的全部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 參數: -v

用於指定反饋信息級別(信息級別就是日誌的詳細程度),總共分3個級別,分別對應的參數以下表所示:

日誌級別 Level0

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

說明缺省值,僅提供啓動提示、測試完成和最終結果等少許信息

 

日誌級別 Level 1

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

說明提供較爲詳細的日誌,包括每一個發送到Activity的事件信息

 

日誌級別 Level 2

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

說明最詳細的日誌,包括了測試中選中/未選中的Activity信息

3 參數: -s

用於指定僞隨機數生成器的seed值,若是seed相同,則兩次Monkey測試所產生的事件序列也相同的。

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 參數: --throttle<毫秒>

用於指定用戶操做(即事件)間的時延,單位是毫秒;

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

5 參數: --ignore-crashes

用於指定當應用程序崩潰時(Force& Close錯誤),Monkey是否中止運行。若是使用此參數,即便應用程序崩潰,Monkey依然會發送事件,直到事件計數完成。

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

測試過程當中即便程序崩潰,Monkey依然會繼續發送事件直到事件數目達到1000爲止

adb shellmonkey -p cn.emoney.acg 1000

測試過程當中,若是acg程序崩潰,Monkey將會中止運行

 

6 參數: --ignore-timeouts

用於指定當應用程序發生ANR(Application No Responding)錯誤時,Monkey是否中止運行。若是使用此參數,即便應用程序發生ANR錯誤,Monkey依然會發送事件,直到事件計數完成。

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

 

7 參數: --ignore-security-exceptions

用於指定當應用程序發生許可錯誤時(如證書許可,網絡許可等),Monkey是否中止運行。若是使用此參數,即便應用程序發生許可錯誤,Monkey依然會發送事件,直到事件計數完成。

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

 


8 參數: --kill-process-after-error


用於指定當應用程序發生錯誤時,是否中止其運行。若是指定此參數,當應用程序發生錯誤時,應用程序中止運行並保持在當前狀態

(注意:應用程序僅是靜止在發生錯誤時的狀態,系統並不會結束該應用程序的進程)。

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

 


9 參數: --monitor-native-crashes

用於指定是否監視並報告應用程序發生崩潰的本地代碼。

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

 

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

用於指定每種類別事件的數目百分比(在Monkey事件序列中,該類事件數目佔總事件數目的百分比)
示例:
--pct-touch{+百分比}
調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)

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


--pct-motion {+百分比}
調整動做事件的百分比(動做事件由屏幕上某處的一個down事件、一系列的僞隨件機事和一個up事件組成)

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


--pct-trackball {+百分比}
調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)

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


--pct-nav {+百分比}

調整「基本」導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)

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


--pct-majornav {+百分比}
調整「主要」導航事件的百分比(這些導航事件一般引起圖形界面中的動做,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)

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

7、輸出monkeylog

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

爲何有時候能夠有時候不能夠?

後來發現跟使用使用習慣不同,一會是先進入adb shell 再用命令,一會是直接命令進入。

進入adb shell後再用命令就會失敗~

正確方法:退出shell或者執行命令時先不要進shell

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

 -v 300  >e:\text.txt

 

進入adb shell後就至關於進入linux的root下面,沒有權限在裏面建立文件~

5、Monkey測試結果分析

一. 初步分析方法:

Monkey測試出現錯誤後,通常的查錯步驟爲如下幾步:

一、找到是monkey裏面的哪一個地方出錯

二、查看Monkey裏面出錯前的一些事件動做,並手動執行該動做

三、若以上步驟還不能找出,可使用以前執行的monkey命令再執行一遍,注意seed值要同樣--復現

通常的測試結果分析:

一、 ANR問題:在日誌中搜索「ANR」

二、崩潰問題:在日誌中搜索「Exception」  Force Close

二. 詳細分析monkey日誌:

將執行Monkey生成的log,從手機中導出並打開查看該log;在log的最開始都會顯示Monkey執行的seed值、執行次數和測試的包名。

首先咱們須要查看Monkey測試中是否出現了ANR或者異常,具體方法如上述。

而後咱們要分析log中的具體信息,方法以下:

查看log中第一個Switch,主要是查看Monkey執行的是那一個Activity,譬以下面的log中,執行的是com.tencent.smtt.SplashActivity,在下一個swtich之間的,若是出現了崩潰或其餘異常,能夠在該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表明當前執行了一個單擊的操做;

Sleeping for 500 milliseconds這句log是執行Monkey測試時,throttle設定的間隔時間,每出現一次,就表明一個事件。

SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 表明當前執行了一個點擊下導航鍵的操做;

Sending Pointer ACTION_MOVE 表明當前執行了一個滑動界面的操做。
:Sending Pointer ACTION_DOWN x=47.0 y=438.0
:Sending Pointer ACTION_MOVE x=-2.0 y=-4.0
ANR
若是Monkey測試順利執行完成,在log的最後,會打印出當前執行事件的次數和所花費的時間;// Monkey finished表明執行完成。Monkey執行中斷,在log的最後也能查看到當前已執行的次數。Monkey執行完成的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測試結果:

# 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來設置一個起效的事件發生後時延時。

: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

當測試到ACTION_MOVE x=0.0 y=0.0這個動做時,發生了FC(Force Close)錯誤,如下爲輸出錯誤信息。同時在LogCat裏面也有錯誤輸出,並且LogCat裏面的錯誤信息更爲詳細,在實際的測試中應該結合二者輸出的信息進行調試程序。

// 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輸出的錯誤信息,在如下的信息中首先從本身的包中找錯誤,若是沒有本身的包的話就再找發生錯誤的包的第一個發生了異常。由錯誤提示能夠看出很大的多是由於TabHost引起的異常。通過查看代碼發現是因爲TabHost的編寫不規範,TabHost與其中一個view放在了一塊兒,在monkey測試作滾球上下滾動時當滾到TabHost時就發生了異常了。因此把TabHost與Activity分開寫就不會出現些問題了。

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)

4、總結:

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

一、monkey -p com.yourpackage -v 500//簡單的輸出測試的信息。

二、monkey -p com.yourpackage -v -v  500 //以深度爲二級輸出測試信息。

四、monkey -p com.yourpackage -s 數字 -v 500//爲隨機數的事件序列定一個值,若出現問題下次能夠重複一樣的系列進行排錯。

五、monkey -p com.yourpackage -v --throttle 3000 500//爲每一次執行一次有效的事件後休眠3000毫秒。

 

5、附錄:

如下內容爲android系統中的keycode值,在之後的調試中會常常須要查詢:

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

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

A

65

J

74

S

83

1

49

B

66

K

75

T

84

2

50

C

67

L

76

U

85

3

51

D

68

M

77

V

86

4

52

E

69

N

78

W

87

5

53

F

70

O

79

X

88

6

54

G

71

P

80

Y

89

7

55

H

72

Q

81

Z

90

8

56

I

73

R

82

0

48

9

57

  

數字鍵盤上的鍵的鍵碼值(keyCode)

功能鍵鍵碼值(keyCode)

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

0

96

8

104

F1

112

F7

118

1

97

9

105

F2

113

F8

119

2

98

*

106

F3

114

F9

120

3

99

+

107

F4

115

F10

121

4

100

Enter

108

F5

116

F11

122

5

101

-

109

F6

117

F12

123

6

102

.

110

 

 

 

 

7

103

/

111

 

 

 

 

  

控制鍵鍵碼值(keyCode)

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

BackSpace

8

Esc

27

Right Arrow

39

-_

189

Tab

9

Spacebar

32

Dw Arrow

40

.>

190

Clear

12

Page Up

33

Insert

45

/?

191

Enter

13

Page Down

34

Delete

46

`~

192

Shift

16

End

35

Num Lock

144

[{

219

Control

17

Home

36

;:

186

\|

220

Alt

18

Left Arrow

37

=+

187

]}

221

Cape Lock

20

Up Arrow

38

,<

188

'"

222

 

 

多媒體鍵碼值(keyCode)

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

按鍵

鍵碼

音量加

175

 

 

 

 

 

 

音量減

174

 

 

 

 

 

 

中止

179

 

 

 

 

 

 

靜音

173

 

 

 

 

 

 

瀏覽器

172

 

 

 

 

 

 

郵件

180

 

 

 

 

 

 

搜索

170

 

 

 

 

 

 

收藏

171

 

 

 

 

 

 

 

 

此文章轉載自覆手爲雲p,感謝你們

相關文章
相關標籤/搜索