一、爲什麼要用Monkey 測試?
簡單在說就是象猴子一樣亂點,爲了測試軟件的穩定性,健壯性。號稱最快速有效的方法。有時候運行相同系列的測試,即使是複雜的測試,但是以相同的順序和路徑,即使一遍又一遍地運行也很少機會能發現內存和資源使用的bug。而此時猴子就比人更有效了。
簡介
Monkey是一個命令行工具 ,可以運行在模擬器裏或實際設備中。它向系統發送僞隨機的用戶事件流,實現對正在開發的應用程序進行壓力測試。Monkey包括許多選項,它們大致分爲四大類:
· 基本配置 選項,如設置嘗試的事件數量。
· 運行約束選項,如設置只對單獨的一個包進行測試。
· 事件類型和頻率。
· 調試選項。
在Monkey運行的時候,它生成事件,並把它們發給系統。同時,Monkey還對測試中的系統進行監測,對下列三種情況進行特殊處理:
· 如果限定了Monkey運行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操作,並對其進行阻止。
· 如果應用程序崩潰或接收到任何失控異常 ,Monkey將停止並報錯。
· 如果應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會停止並報錯。
按照選定的不同級別的反饋信息,在Monkey中還可以看到其執行過程報告和生成的事件。
二、怎麼用的?
首先用一個最簡單的例子分析:
//p參數: 表示指定測試的程序
//v參數: 表示查看monkey生成的一些詳細的隨機的事件名
//數字
100
: 表示測試事件數爲
100
monkey -p com.example.android.apis -v -v -v
100
結果如下:
:Monkey: seed=
0
count=
100
:AllowPackage: com.example.android.apis
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
//各種事件所佔的比例。
//各數字分別表示:
[--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]
// 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:
//表示跳轉到com.example.android.apis 裏面的ApiDemos這一個Activity裏。
#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=
0x10000000
;component=com.example.android.apis/.ApiDemos;end
//允許此Intent跳轉,
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.android.apis/.ApiDemos } in package com.example.android.apis
//發送的一些動作,如點擊按下,點擊放開,移動。
:Sending Pointer ACTION_MOVE x=-
4.0
y=
2.0
:Sending Pointer ACTION_UP x=
0.0
y=
0.0
:Sending Pointer ACTION_DOWN x=
207.0
y=
282.0
:Sending Pointer ACTION_UP x=
189.0
y=
289.0
:Sending Pointer ACTION_DOWN x=
95.0
y=
259.0
:Sending Pointer ACTION_UP x=
95.0
y=
259.0
:Sending Pointer ACTION_DOWN x=
295.0
y=
223.0
:Sending Pointer ACTION_UP x=
290.0
y=
213.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=
3.0
:Sending Pointer ACTION_MOVE x=
0.0
y=-
5.0
//拒絕此跳轉,因爲它是跳轉到非它自己的包的Activity,本測試中是指寫測試它程序所在的包,此跳轉是跳出本程序,進入到桌面。
// Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=com.android.launcher/.Launcher } in package com.android.launcher
//繼續發送動作。
:Sending Pointer ACTION_DOWN x=
74.0
y=
201.0
:Sending Pointer ACTION_UP x=
74.0
y=
201.0
:Sending Pointer ACTION_MOVE x=
3.0
y=-
2.0
:Sending Pointer ACTION_UP x=
0.0
y=
0.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
2.0
Events injected:
100
//丟棄的,鍵=
0
,指針=
0
,軌跡球=
0
,翻轉=
0
。
:Dropped: keys=
0
pointers=
0
trackballs=
0
flips=
0
//網絡統計經過時間爲4202ms,其中4202ms是用於在手機上的,0ms用於無線網絡上,沒有連接的時間爲0ms。
## Network stats: elapsed time=4202ms (4202ms mobile, 0ms wifi, 0ms not connected)
//monkey測試完成。
// Monkey finished
從例子中可以看出,該程序在這次測試中沒有問題,若程序出現問題終端將打印出異常供程序員查找錯誤。
以下是monkey命令行的一些參數:
-p:所在測試的包,可以是一個也可以是多個 如 monkey -p com.androd.sms -p com.androd.explorer
-c:如果用此參數指定了一個或幾個類別,Monkey將只允許系統啓動被這些類別中的某個類別列出的Activity。如果不指定任何類別,Monkey將選擇下列類別中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多個類別,需要使用多個-c選項,每個-c選項只能用於一個類別。
-ignore-crash:當應用程序崩潰或發生任何失控異常時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。
-ignore-timeouts:通常,當應用程序發生任何超時錯誤(如“Application Not Responding”對話框)時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。
-ignore-security-exceptions:通常,當應用程序發生許可錯誤(如啓動一個需要某些許可的Activity)時,Monkey將停止運行。如果設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。
-monitor-
native
-crashes:監視並報告Android系統中本地代碼的崩潰事件。如果設置了–kill-process-after-error,系統將停止運行。
-kill-process-after-error:如果程序出現錯誤,monkey將結束此程序進程。
-hprof:設置此項,將在monkey事件序列之前和之後立即生成profilling報告。這將會在data/misc中生成大文件(約5mb)所以要小心使用它。
-pct-touch:調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕的某單一位置)。
-pct-motion:動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的隨機事件和一個up事件組成)。
-pct-trackball:調整軌跡事件的百分比(軌跡事件由一個或幾個隨機移動組成,有時還伴隨着點擊)。
-pct-syskeys:調整系統按鍵事件的百分比(這些按鍵通常被保留,由系統使用,如home,back,start call,end call及音量控制)。
-pct-nav 調整基本導航事件的百分比(導航事件來自方向輸入設備的up/down/left/right組成)。
-pct-majornav:調整“主要”導航事件的百分比(這些導航事件通常引發圖形界面中的動作,如:
5
-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)
-pct-appswitch:調整啓動Activity的百分比。在隨機間隔裏,Monkey將執行一個startActivity()調用,作爲最大程度覆蓋包中全部Activity的一種方法。
-pct-anyevent:調整啓動Activity的百分比。它包羅了所有其它的事件類型,如:按鍵,其它不常用的設備按鈕。
-pct-flip:
–wait-dbg:停止執行中的Monkey,直到有調試器和它相連接。
–dbg-no-events:設置此選項,Monkey將執行初始啓動,進入到一個測試Activity,然後不會再進一步生成事件。爲了得到最佳結果,把它與-v、一個或幾個包約束、以及一個保持Monkey運行
30
秒或更長時間的非零值聯合起來,從而提供一個環境,可以監視應用程序所調用的包之間的轉換。
-setup:
-f:
-port:爲monkey開啓專用端口。此時只monkey不會幫你亂點擊,而此時你自己就是一隻monkey了,在你亂點的時候,monkey會輸出你點擊後回饋的信息。如果你打完命令之後模擬器上沒有啓動你所要啓動的包,你需要自己啓動,但是你只能啓動你-p中指定的那幾個包。ctrl+c中斷。
--throttle :當事件起效時等待的毫秒數。
-s:隨機數生成器的seed值。如果用相同的seed值再次運行monkey,它將生成相同的事件序列。
COUNT:要發送的事件數。
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions] [--monitor-
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]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...] [--throttle MILLISEC]
COUNT
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)
// - NOT USING main activity com.android.music.MusicBrowserActivity (from package com.android.music)
// - NOT USING main activity com.android.contacts.DialtactsActivity (from package com.android.contacts)
// - NOT USING main activity com.android.contacts.DialtactsContactsEntryActivity (from package com.android.contacts)
// - NOT USING main activity com.android.mms.ui.ConversationList (from package com.android.mms)
// - NOT USING main activity com.android.spare_parts.SpareParts (from package com.android.spare_parts)
// - NOT USING main activity com.android.camera.Camera (from package com.android.camera)
// - NOT USING main activity com.android.alarmclock.AlarmClock (from package com.android.alarmclock)
// - NOT USING main activity com.android.settings.Settings (from package com.android.settings)
// - NOT USING main activity com.android.camera.GalleryPicker (from package com.android.gallery)
// - NOT USING main activity com.android.email.activity.Welcome (from package com.android.email)
// - NOT USING main activity com.example.android.apis.ApiDemos (from package com.example.android.apis)
// - NOT USING main activity com.android.calculator2.Calculator (from package com.android.calculator2)
// - NOT USING main activity com.android.customlocale.CustomLocaleActivity (from package com.android.customlocale)
// - NOT USING main activity com.android.development.Development (from package com.android.development)
// - NOT USING main activity com.myactivity.MyActivity (from package com.myactivity)
// + Using main activity wfh.LessonTable.MainTable (from package wfh.LessonTable)
// - NOT USING main activity wfh.rss.MainRSS (from package wfh.rss)
// Selecting main activities from category android.intent.category.MONKEY
// - NOT USING main activity com.android.launcher.Launcher (from package com.android.launcher)
// - NOT USING main activity com.android.settings.ManageApplications (from package com.android.settings)
// - NOT USING main activity com.android.settings.RunningServices (from package com.android.settings)
// 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_MOVE x=-
4.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=-
4.0
:Sending Pointer ACTION_MOVE x=
0.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=-
3.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
2.0
//-------------移動事件!!!
:Sending Pointer ACTION_MOVE x=-
2.0
y=
4.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
1.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=
4.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=
1.0
:Sending Pointer ACTION_MOVE x=
0.0
y=-
2.0
:Sending Pointer ACTION_DOWN x=
0.0
y=
0.0
:Sending Pointer ACTION_UP x=
0.0
y=
0.0
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
82
// KEYCODE_MENU
:SendKey (ACTION_UP):
82
// KEYCODE_MENU
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
64
// KEYCODE_EXPLORER
:SendKey (ACTION_UP):
64
// KEYCODE_EXPLORER
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
23
// KEYCODE_DPAD_CENTER
:SendKey (ACTION_UP):
23
// KEYCODE_DPAD_CENTER
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
91
// KEYCODE_MUTE
// Allowing start of Intent { cmp=wfh.LessonTable/.EditLesson } in package wfh.LessonTable
:SendKey (ACTION_UP):
91
// KEYCODE_MUTE
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
207.0
y=
282.0
:Sending Pointer ACTION_MOVE x=
210.0
y=
277.0
:Sending Pointer ACTION_MOVE x=
204.0
y=
283.0
:Sending Pointer ACTION_MOVE x=
205.0
y=
278.0
:Sending Pointer ACTION_MOVE x=
199.0
y=
278.0
:Sending Pointer ACTION_MOVE x=
199.0
y=
287.0
:Sending Pointer ACTION_MOVE x=
194.0
y=
295.0
:Sending Pointer ACTION_MOVE x=
198.0
y=
290.0
:Sending Pointer ACTION_MOVE x=
197.0
y=
286.0
:Sending Pointer ACTION_MOVE x=
189.0
y=
289.0
:Sending Pointer ACTION_UP x=
189.0
y=
289.0
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
56
// KEYCODE_PERIOD
:SendKey (ACTION_UP):
56
// KEYCODE_PERIOD
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
95.0
y=
259.0
:Sending Pointer ACTION_UP x=
95.0
y=
259.0
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
295.0
y=
223.0
:Sending Pointer ACTION_MOVE x=
291.0
y=
223.0
:Sending Pointer ACTION_MOVE x=
291.0
y=
218.0
:Sending Pointer ACTION_MOVE x=
284.0
y=
215.0
:Sending Pointer ACTION_MOVE x=
284.0
y=
206.0
:Sending Pointer ACTION_MOVE x=
285.0
y=
205.0
:Sending Pointer ACTION_MOVE x=
290.0
y=
213.0
:Sending Pointer ACTION_UP x=
290.0
y=
213.0
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
82
// KEYCODE_MENU
:SendKey (ACTION_UP):
82
// KEYCODE_MENU
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_MOVE x=-
5.0
y=
3.0
:Sending Pointer ACTION_MOVE x=
3.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
1.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
4.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
0.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=
2.0
:Sending Pointer ACTION_MOVE x=
3.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=-
5.0
:Sending Pointer ACTION_MOVE x=
1.0
y=
4.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=-
5.0
:SendKey (ACTION_DOWN):
21
// KEYCODE_DPAD_LEFT
:SendKey (ACTION_UP):
21
// KEYCODE_DPAD_LEFT
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_MOVE x=
0.0
y=-
5.0
:Sending Pointer ACTION_MOVE x=
3.0
y=-
5.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
0.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
3.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
1.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
3.0
:Sending Pointer ACTION_MOVE x=-
1.0
y=-
4.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=-
2.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=-
3.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=-
1.0
:SendKey (ACTION_DOWN):
3
// KEYCODE_HOME
:SendKey (ACTION_UP):
3
// KEYCODE_HOME
// Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=com.android.launcher/.Launcher } in package com.android.launcher
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
74.0
y=
201.0
:Sending Pointer ACTION_UP x=
74.0
y=
201.0
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
23
// KEYCODE_DPAD_CENTER
:SendKey (ACTION_UP):
23
// KEYCODE_DPAD_CENTER
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_MOVE x=
3.0
y=-
2.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=
4.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=
0.0
:Sending Pointer ACTION_MOVE x=
3.0
y=
2.0
:Sending Pointer ACTION_MOVE x=
0.0
y=
0.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
3.0
:Sending Pointer ACTION_MOVE x=-
3.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
1.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=
1.0
:Sending Pointer ACTION_DOWN x=
0.0
y=
0.0
:Sending Pointer ACTION_UP x=
0.0
y=
0.0
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
21
// KEYCODE_DPAD_LEFT
:SendKey (ACTION_UP):
21
// KEYCODE_DPAD_LEFT
// activityResuming(wfh.LessonTable)
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
82
// KEYCODE_MENU
:SendKey (ACTION_UP):
82
// KEYCODE_MENU
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
20
// KEYCODE_DPAD_DOWN
:SendKey (ACTION_UP):
20
// KEYCODE_DPAD_DOWN
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
20
// KEYCODE_DPAD_DOWN
:SendKey (ACTION_UP):
20
// KEYCODE_DPAD_DOWN
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
21
// KEYCODE_DPAD_LEFT
:SendKey (ACTION_UP):
21
// KEYCODE_DPAD_LEFT
Sleeping
for
0
milliseconds ??????
:Sending Pointer ACTION_MOVE x=-
4.0
y=
2.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
0.0
// Sending event #100
:Sending Pointer ACTION_MOVE x=
3.0
y=
0.0
:Sending Pointer ACTION_MOVE x=
3.0
y=
1.0
:Sending Pointer ACTION_MOVE x=
3.0
y=-
5.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
3.0
:Sending Pointer ACTION_MOVE x=
1.0
y=-
2.0
:Sending Pointer ACTION_MOVE x=
0.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=
1.0
:Sending Pointer ACTION_MOVE x=
2.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
1.0
y=
2.0
:Sending Pointer ACTION_MOVE x=
3.0
y=-
3.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
0.0
:Sending Pointer ACTION_MOVE x=
0.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=
4.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
4.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
4.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
2.0
:Sending Pointer ACTION_MOVE x=
2.0
y=-
2.0
:SendKey (ACTION_DOWN):
22
// KEYCODE_DPAD_RIGHT
:SendKey (ACTION_UP):
22
// KEYCODE_DPAD_RIGHT
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
53
// KEYCODE_Y
:SendKey (ACTION_UP):
53
// KEYCODE_Y
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
24
// KEYCODE_VOLUME_UP
:SendKey (ACTION_UP):
24
// KEYCODE_VOLUME_UP
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
82
// KEYCODE_MENU
:SendKey (ACTION_UP):
82
// KEYCODE_MENU
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
149.0
y=
150.0
:Sending Pointer ACTION_MOVE x=
149.0
y=
151.0
:Sending Pointer ACTION_MOVE x=
152.0
y=
158.0
:Sending Pointer ACTION_MOVE x=
148.0
y=
162.0
:Sending Pointer ACTION_MOVE x=
148.0
y=
156.0
:Sending Pointer ACTION_MOVE x=
152.0
y=
149.0
:Sending Pointer ACTION_MOVE x=
155.0
y=
146.0
:Sending Pointer ACTION_MOVE x=
150.0
y=
138.0
:Sending Pointer ACTION_MOVE x=
155.0
y=
142.0
:Sending Pointer ACTION_MOVE x=
162.0
y=
150.0
:Sending Pointer ACTION_UP x=
162.0
y=
150.0
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
82
// KEYCODE_MENU
:SendKey (ACTION_UP):
82
// KEYCODE_MENU
// Allowing start of Intent { cmp=wfh.LessonTable/.AWeekLesson } in package wfh.LessonTable
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_MOVE x=
0.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=
0.0
:Sending Pointer ACTION_MOVE x=
2.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=-
1.0
:Sending Pointer ACTION_MOVE x=-
1.0
y=
0.0
:Sending Pointer ACTION_MOVE x=-
4.0
y=
4.0
:Sending Pointer ACTION_MOVE x=
4.0
y=
4.0
:Sending Pointer ACTION_MOVE x=
3.0
y=-
2.0
:Sending Pointer ACTION_MOVE x=
2.0
y=
2.0
:Sending Pointer ACTION_MOVE x=-
1.0
y=-
1.0
:SendKey (ACTION_DOWN):
19
// KEYCODE_DPAD_UP
:SendKey (ACTION_UP):
19
// KEYCODE_DPAD_UP
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
134.0
y=
239.0
:Sending Pointer ACTION_UP x=
134.0
y=
239.0
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
4
// KEYCODE_BACK
:SendKey (ACTION_UP):
4
// KEYCODE_BACK
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
23
// KEYCODE_DPAD_CENTER
// activityResuming(wfh.LessonTable)
:SendKey (ACTION_UP):
23
// KEYCODE_DPAD_CENTER
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
22
// KEYCODE_DPAD_RIGHT
:SendKey (ACTION_UP):
22
// KEYCODE_DPAD_RIGHT
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
19
// KEYCODE_DPAD_UP
:SendKey (ACTION_UP):
19
// KEYCODE_DPAD_UP
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
21
// KEYCODE_DPAD_LEFT
:SendKey (ACTION_UP):
21
// KEYCODE_DPAD_LEFT
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
19
// KEYCODE_DPAD_UP
:SendKey (ACTION_UP):
19
// KEYCODE_DPAD_UP
Sleeping
for
0
milliseconds
:SendKey (ACTION_DOWN):
23
// KEYCODE_DPAD_CENTER
:SendKey (ACTION_UP):
23
// KEYCODE_DPAD_CENTER
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
118.0
y=
37.0
:Sending Pointer ACTION_MOVE x=
119.0
y=
33.0
:Sending Pointer ACTION_UP x=
119.0
y=
33.0
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
297.0
y=
358.0
:Sending Pointer ACTION_MOVE x=
289.0
y=
363.0
:Sending Pointer ACTION_MOVE x=
284.0
y=
369.0
:Sending Pointer ACTION_UP x=
284.0
y=
369.0
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_DOWN x=
258.0
y=
403.0
:Sending Pointer ACTION_MOVE x=
249.0
y=
398.0
:Sending Pointer ACTION_MOVE x=
258.0
y=
393.0
:Sending Pointer ACTION_MOVE x=
258.0
y=
402.0
:Sending Pointer ACTION_MOVE x=
263.0
y=
395.0
:Sending Pointer ACTION_MOVE x=
266.0
y=
399.0
:Sending Pointer ACTION_MOVE x=
273.0
y=
403.0
:Sending Pointer ACTION_UP x=
273.0
y=
403.0
Sleeping
for
0
milliseconds
:Sending Pointer ACTION_MOVE x=-
5.0
y=-
5.0
:Sending Pointer ACTION_MOVE x=
1.0
y=-
2.0
:Sending Pointer ACTION_MOVE x=
1.0
y=-
4.0
:Sending Pointer ACTION_MOVE x=-
2.0
y=
2.0
:Sending Pointer ACTION_MOVE x=
3.0
y=-
3.0
:Sending Pointer ACTION_MOVE x=
2.0
y=-
4.0
:Sending Pointer ACTION_MOVE x=-
5.0
y=
2.0
:Sending Pointer ACTION_MOVE x=
0.0
y=
0.0
當測試到ACTION_MOVE x=
0.0
y=
0.0
這個動作時,發生了FC(Force Close)錯誤,以下爲輸出錯誤信息。同時在LogCat裏面也有錯誤輸出,而且LogCat裏面的錯誤信息更爲詳細,在實際的測試中應該結合兩者輸出的信息進行調試程序。
未完待續!