編輯:Android開發實例
本人比較懶,但是,研究如何讓人變懶,卻很積極…最新版的android SDK 4.0 ,monkey和monkeyRunner,變化很大…大到默認是運行失敗的…囧,雖然,monkey和monkeyrunner目前有些不完善,但是,足以應付我們的使用需要.(最新的R15已經解決了這個問題更新真快…)
有時候,我們要折騰一下程序,健壯不健壯,然後,找個上幼兒園的的弟弟/妹妹,把手機交給他/她,讓他/她胡亂的按,看你的程序能不能接受這樣的折騰,但是,我們身邊不可能都有正太和蘿莉,也不能保證他們拿到手機以後不是測試軟件的健壯性,反而測試你的手機經不經摔,這與我們的期望差太遠了…畢竟咱們是來軟的不是來硬的…
當然,這世界牛人一把把的,然後,google公司考慮到我們的需要,把找個由某個牛人寫的程序,集成到了比較新版本的SDK R8(即 android 2.2以後),然後,就有了下文
monkey 的使用
Monkey的智力就是一個三歲小孩的水平,所以,使用起來也是非常簡單,當然,也做不了什麼復雜的東西
1
adb shell monkey [options] <event-count>
options event-count 這個是配置monkey的設置,例如,指定啟動那個包,不指定將會隨機啟動所有程序 這個是讓monkey發送多少次事件
詳細的monkey介紹,和options的參數請查看
http://developer.android.com/guide/developing/tools/monkey.html
這裡就不重復造輪子了…
實例:
我們驗證程序在隨機1000次事件中,能不能正常運行下去
1
adb shell monkey -p your.package.name -vvv 1000 > monkey1000.txt
-v 為 verbose的縮寫,就是詳細輸出事件等級,這個3個v就是輸出等級1至3的所有事件,然後再使用管道命令將輸出結果放到一個文本裡面方便查看.接下來就是看你的程序能不能在這樣的折騰下堅持下去了.
以上截個圖看看吧
------------------------------以下為折騰星人研究參考資料------------------------------
然後,補充一下官方文檔並沒有更新的參數…不信你自己對照著來看,如果,你看到時候,官方更新了我說的這個,希望能回復我一下,讓我更新一下…
主要多了兩個參數:
[--port port] 指定monkey的端口,實現使用Client-server Monkey,這個參數的作用就是讓你可以通過telnet來手動設置monkey的參數,就是讓monkey的智力進化到能聽懂能的話…可惜的是我一直都沒搞成功. [--setup scriptfile] [-f scriptfile ….] 這個是讓monkey 指定手機中的腳本運行.這裡我貼一個,國外有人用本地指定scriptfile成功的使用
I am trying to do 2 things with monkey
1. Execute a script with a command like
adb shell monkey -p MY_PACKAGE --setup scriptfile -f /sdcard/ mon_script1.txt 1
where mon_script.txt contains a few touch commands. After I execute this, I see nothing happening on the screen. It even does not give me the "Number of events injected message". I have verified that my touch co-ordinates fall over actual UI elements.
This is the script file I am using
tap 79 29 tap 100 100 tap 200 200 tap 300 300 quit
2. Execute Monkey Network control to type commands individually. I start up monkey to listen to a port and use PuTTY to send commands. I get "OK" return messages, but nothing happens on the screen.
Whenever I use monkey in the random mode, I see interaction on the screen. But I need to get one of the above 2 methods to work. I have seen the sources of monkey and nothing seems to be wrong. Has anyone used monkey in the above described way? If so, please tell me what I am doing wrong.
使用遠程monkey 的代碼模板
1
adb –e shell monkey -p your.pakagename --port 1080 &
然後重定向我們的模擬器端口
1
adb -e forward tcp 1080 tcp 1080
然後telnet 的我們的模擬器
view sourceprint?1
telnet localhost 1080
接著telnet成功以後據說可以這樣
tap 150 200
----以上代碼來源於Android application Test Guide 書中
然後,就可以看到我們控制UI事件了,可惜的是,我怎麼測試都不能成功…
小結:
目前看來,monkey這個程序其實並不完善,有些功能連官方文檔都還沒更新,不過,作為折騰應用的使用還是足夠的,看著自己的程序在模擬器中不斷的被折磨…接下來要講就是Monkey的進化--->MonkeyRunner
如果,把現階段的monkey比做是幼兒園的小孩,那麼monkeyrunner就是一個初中生了…它支持,自己編寫插件,控制事件,隨時截圖,簡而言之,任何你在模擬器/設備中能干的事情,MonkeyRunner都能干,而且還可以記錄和回放!!!
具體介紹…看官方文檔.這裡還是不重復造輪子
http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html
注意:android sdk r14並沒有把一個關鍵的jar包放lib目錄中,所以,將無法運行,…然後請將SDK TOOLS 直接更新到最新的R15
下面提供一些常用的腳本,自己看著來改吧..
monkey_recorder.py
monkey_placback.py
help.py
http://115.com/file/e6r0sln9#
monkeyrunner_py腳本.rar
雖然,少了些東西,但是,並不影響我們大部分的需要.接下來用一段典型的monkeyRunner代碼講解!
注意!如果monkeyrunner腳本文件要使用中文,記得格式保存為utf8,不然會ASCNII(忘了怎麼拼寫了..)無法支持錯誤
01 #導入我們需要用到的包和類並且起別名
02 import sys
03 from com.android.monkeyrunner import MonkeyRunner as mr
04 from com.android.monkeyrunner import MonkeyDevice as md
05 from com.android.monkeyrunner import MonkeyImage as mi
06
07 #connect device 連接設備
08 #第一個參數為等待連接設備時間
09 #第二個參數為具體連接的設備
10 device = mr.waitForConnection(1.0,'emulator-5554')
11 if not device:
12 print >> sys.stderr,"fail"
13 sys.exit(1)
14 #定義要啟動的Activity
15 componentName='kg.monkey/.MonkeyActivity'
16 #啟動特定的Activity
17 device.startActivity(component=componentName)
18 mr.sleep(3.0)
19 #do someting 進行我們的操作
20 #輸入a s d
21 device.type('asd')
22 #輸入回車
23 device.press('KEYCODE_ENTER')
24 #return keyboard 點擊返回用於取消等下看到截圖的下方的白條
25 #device.press('KEYCODE_BACK')
26 #------
27 #takeSnapshot截圖
28 mr.sleep(3.0)
29 result = device.takeSnapshot()
30
31 #save to file 保存到文件
32 result.writeToFile('takeSnapshot\\result1.png','png');
以上代碼就是用monkeyrunner 實現操作特定操作以後,並且截圖的功能,看上去貌似挺麻煩的…如果你有很多設備要一起測試,你就會發現以上代碼是多麼爽丫丫的事情.這個腳本的實質就是一個python腳本,懂點,python的朋友,可以利用這個實現非常強悍的功能.這裡就打住了,各位想到什麼好玩,實用的記得回復一下…大家一起交流.
前面講的都是一些在命令行上的操作,我可記不住那麼多的指令操作,我可不知道,我點擊的這個點的坐標是多少,我多麼希望,我能夠在可視化界面裡面講我的操作記錄下來,然後,直接重新播放,就像宏一樣,我可以很高興的告訴你,MonkeyRunner有這個功能實現起來也非常簡單,我提供的打包文件中有一個,monkey_recorder.py,直接在命令行中打上:
monkeyrunner monkey_recorder.py
例如我們刪掉我們剛才的asd字符串它就會記錄下我們所有的操作!,就會看到如上截圖!!!
Button Description Wait 等待時間 Press a Button 發送,MENU,HOME,or SEARCH 按鈕.Press,Down,or Up事件 Type Something 發送一些字符串 Fling 用來操作虛擬鍵盤
Export Action 將我們的腳本導出來 Refresh Display 刷新當前界面
接下來運行我們的保存的腳本,然後,你就看到模擬器,進行你剛才一樣的操作
monkeyrunner monkey_playback.py monkey_test.mr
打開我們的文件可以看到其實就是一些monkeyrunner的一些腳本
TOUCH|{'x':329,'y':132,'type':'downAndUp',}
TOUCH|{'x':100,'y':100,'type':'downAndUp',}
TOUCH|{'x':296,'y':407,'type':'downAndUp',}
TOUCH|{'x':296,'y':407,'type':'downAndUp',}
TOUCH|{'x':296,'y':407,'type':'downAndUp',}
TOUCH|{'x':296,'y':407,'type':'downAndUp',}
TOUCH|{'x':351,'y':227,'type':'downAndUp',}
當然,有界面為什麼不用呢~~~呵呵~
補充一點:如果我們要進行多設備測試怎麼辦呢?
我們可以打開monkey_playback.py文件
view sourceprint?
01 import sys
02 from com.android.monkeyrunner import MonkeyRunner
03
04 # The format of the file we are parsing is very carfeully constructed.
05 # Each line corresponds to a single command. The line is split into 2
06 # parts with a | character. Text to the left of the pipe denotes
07 # which command to run. The text to the right of the pipe is a python
08 # dictionary (it can be evaled into existence) that specifies the
09 # arguments for the command. In most cases, this directly maps to the
10 # keyword argument dictionary that could be passed to the underlying
11 # command.
12
13 # Lookup table to map command strings to functions that implement that
14 # command.
15 CMD_MAP = {
16 'TOUCH': lambda dev, arg: dev.touch(**arg),
17 'DRAG': lambda dev, arg: dev.drag(**arg),
18 'PRESS': lambda dev, arg: dev.press(**arg),
19 'TYPE': lambda dev, arg: dev.type(**arg),
20 'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)
21 }
22
23 # Process a single file for the specified device.
24 def process_file(fp, device):
25 for line in fp:
26 (cmd, rest) = line.split('|')
27 try:
28 # Parse the pydict
29 rest = eval(rest)
30 except:
31 print 'unable to parse options'
32 continue
33
34 if cmd not in CMD_MAP:
35 print 'unknown command: ' + cmd
36 continue
37
38 CMD_MAP[cmd](device, rest)
39
40
41 def main():
42 file = sys.argv[1]
43 fp = open(file, 'r')
44 #在這裡指定你的設備吧
45 device = MonkeyRunner.waitForConnection()
46
47 process_file(fp, device)
48 fp.close();
49
50
51 if __name__ == '__main__':
52 main()
小結
至此,monkeyrunner的常用方式就這樣完了,這裡不打算說怎麼編寫一個自己的monkeyrunner插件,因為,我覺得我以上介紹的功能在實際開發中基本夠用,而且,monkeyrunner估計,在下一個版本中會有一些更新,有興趣的同學,自己查閱官方文檔,當然,也可以聯系本人…
目前Android已經在只能手機市場已經具有強大的霸主地位,也吸引了越來越多的追捧者。Android的學習也越來越火。但是,報名費用確實大多人望而卻步 一、新建項
欣賞一下我們清爽的界面吧~ 如果是只用activity來制作這樣的東西簡直是太小兒科了,此處我們當然用的是service 首先我們先上service的代碼: 1
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
今天根據騰訊qq,我們做一個練習,來學習如何制作一個漂亮的布局。首先看一下官方圖片 還是一個啟動畫面,之後進入登錄頁面,導航頁面就不介紹了,大家可以參考微信的導