monkey命令詳解

一、Monkey 簡介

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

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

Monkey 測試的特點:

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

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

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

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

二、Monkey的基本用法

基本語法如下:

$ adb shell monkey [options]

如果不指定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。

 

 

三、Monkey測試的一個實例

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

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

1、通過eclipse啓動一個Android的emulator

2、在命令行中輸入:adb devices查看設備連接情況

C:\Documents and Settings\Administrator>adb devices

List of devices attached

emulator-5554   device

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

C:\Documents and Settings\Administrator>adb shell

#

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

C:\Documents and Settings\Administrator>adb shell

# ls data/data

ls data/data

5、以com.android.calculator2作爲對象進行MonkeyTest

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

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

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

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

四、使用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

七、輸出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下面,沒有權限在裏面創建文件~

五、Monkey測試結果分析

一. 初步分析方法:

Monkey測試出現錯誤後,一般的查錯步驟爲以下幾步:

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

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

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

一般的測試結果分析:

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

2、崩潰問題:在日誌中搜索“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)

四、總結:

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

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

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

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

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

 

五、附錄:

以下內容爲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

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章