monkey monkeyrunner

Monkey

什么是Monkey
Monkey是Android中的一個(gè)命令行工具,可以運(yùn)行在模擬器里或?qū)嶋H設(shè)備中。它向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流(如按鍵輸入、觸摸屏輸入脖旱、手勢(shì)輸入等)堪遂,實(shí)現(xiàn)對(duì)正在開(kāi)發(fā)的應(yīng)用程序進(jìn)行壓力測(cè)試。Monkey測(cè)試是一種為了測(cè)試軟件的穩(wěn)定性萌庆、健壯性的快速有效的方法溶褪。

Monkey的特征
1、 測(cè)試的對(duì)象僅為應(yīng)用程序包践险,有一定的局限性猿妈。
2、 Monky測(cè)試使用的事件流數(shù)據(jù)流是隨機(jī)的巍虫,不能進(jìn)行自定義彭则。
3、 可對(duì)Test的對(duì)象占遥,事件數(shù)量俯抖,類型,頻率等進(jìn)行設(shè)置筷频。
Monkey的基本用法
基本語(yǔ)法如下:

adb shell monkey [options] <event-count>  

options 這個(gè)是配置monkey的設(shè)置,例如,指定啟動(dòng)那個(gè)包,不指定將會(huì)隨機(jī)啟動(dòng)所有程序
event-count 這個(gè)是讓monkey發(fā)送多少次事件

詳細(xì)的monkey介紹,和options的參數(shù)請(qǐng)查看 如果不指定options蚌成,Monkey將以無(wú)反饋模式啟動(dòng)前痘,并把事件任意發(fā)送到安裝在目標(biāo)環(huán)境中的全部包凛捏。

Monkey測(cè)試的停止條件
1、如果限定了Monkey運(yùn)行在一個(gè)或幾個(gè)特定的包上芹缔,那么它會(huì)監(jiān)測(cè)試圖轉(zhuǎn)到其它包的操作坯癣,并對(duì)其進(jìn)行阻止。
2最欠、如果應(yīng)用程序崩潰或接收到任何失控異常示罗,Monkey將停止并報(bào)錯(cuò)。
3芝硬、如果應(yīng)用程序產(chǎn)生了應(yīng)用程序不響應(yīng)(application not responding)的錯(cuò)誤蚜点,Monkey將會(huì)停止并報(bào)錯(cuò)。

實(shí)例

下面是一個(gè)更為典型的命令行示例拌阴,它啟動(dòng)指定的應(yīng)用程序绍绘,并向其發(fā)送500個(gè)偽隨機(jī)事件:


adb shell monkey -p your.package.name -vvv 500 > monkeytest.txt  

-p表示對(duì)象包 -v 為 verbose的縮寫(xiě)(信息級(jí)別就是日志的詳細(xì)程度),就是詳細(xì)輸出事件等級(jí),這個(gè)3個(gè)v就是輸出等級(jí)1至3的所有事件.(使用管道命令將輸出結(jié)果放到一個(gè)文本里面方便查看)

舉例:
eclipse連接真機(jī)設(shè)備,Window打開(kāi)CMD迟赃,命令行輸入:adb shell陪拘,進(jìn)入shell界面后:



我運(yùn)行的是手機(jī)上的 計(jì)算器 程序,具體你可以指定自己的APP包名就可以了~
真機(jī)效果:



如圖所示纤壁,它真的就是隨機(jī)輸入數(shù)值左刽,隨機(jī)按鈕,隨機(jī).....的...................缺點(diǎn)是我們不能控制觸摸或按鈕事件酌媒,接下來(lái)MonkeyRunner就要登場(chǎng)了~

MonkeyRunner

什么是monkeyrunner
monkeyrunner工具提供了一個(gè)API欠痴,使用此API寫(xiě)出的程序可以在Android代碼之外控制Android設(shè)備和模擬器迄靠。通過(guò)monkeyrunner,您可以寫(xiě)出一個(gè)Python程序去安裝一個(gè)Android應(yīng)用程序或測(cè)試包喇辽,運(yùn)行它梨水,向它發(fā)送模擬擊鍵,截取它的用戶界面圖片茵臭,并將截圖存儲(chǔ)于工作站上疫诽。monkeyrunner工具的主要設(shè)計(jì)目的是用于測(cè)試功能/框架水平上的應(yīng)用程序和設(shè)備,或用于運(yùn)行單元測(cè)試套件旦委。

monkeyrunner同monkey的區(qū)別
Monkey工具直接運(yùn)行在設(shè)備或模擬器的adb shell中奇徒,生成用戶或系統(tǒng)的偽隨機(jī)事件流。monkeyrunner工具則是在工作站上通過(guò)API定義的特定命令和事件控制設(shè)備或模擬器缨硝,它支持,自己編寫(xiě)插件,控制事件,隨時(shí)截圖,簡(jiǎn)而言之,任何你在模擬器/設(shè)備中能干的事情,MonkeyRunner都能干,而且還可以記錄和回放摩钙。

monkeyrunner的測(cè)試類型

1、多設(shè)備控制:monkeyrunner API可以跨多個(gè)設(shè)備或模擬器實(shí)施測(cè)試套件查辩。您可以在同一時(shí)間接上所有的設(shè)備或一次啟動(dòng)全部模擬器(或統(tǒng)統(tǒng)一起)胖笛,依據(jù)程序依次連接到每一個(gè),然后運(yùn)行一個(gè)或多個(gè)測(cè)試宜岛。您也可以用程序啟動(dòng)一個(gè)配置好的模擬器长踊,運(yùn)行一個(gè)或多個(gè)測(cè)試,然后關(guān)閉模擬器萍倡。
2身弊、 功能測(cè)試: monkeyrunner可以為一個(gè)應(yīng)用自動(dòng)貫徹一次功能測(cè)試。您提供按鍵或觸摸事件的輸入數(shù)值列敲,然后觀察輸出結(jié)果的截屏阱佛。
3、 回歸測(cè)試:monkeyrunner可以運(yùn)行某個(gè)應(yīng)用戴而,并將其結(jié)果截屏與既定已知正確的結(jié)果截屏相比較凑术,以此測(cè)試應(yīng)用的穩(wěn)定性。
4所意、 可擴(kuò)展的自動(dòng)化:由于monkeyrunner是一個(gè)API工具包淮逊,您可以基于Python模塊和程序開(kāi)發(fā)一整套系統(tǒng),以此來(lái)控制Android設(shè)備扁眯。除了使用monkeyrunner API之外壮莹,您還可以使用標(biāo)準(zhǔn)的Python os和subprocess模塊來(lái)調(diào)用Android Debug Bridge這樣的Android工具。

運(yùn)行monkeyrunner
您可以直接使用一個(gè)代碼文件運(yùn)行monkeyrunner姻檀,抑或在交互式對(duì)話中輸入monkeyrunner語(yǔ)句命满。不論使用哪種方式,您都需要調(diào)用SDK目錄的tools子目錄下的monkeyrunner命令绣版。如果您提供一個(gè)文件名作為運(yùn)行參數(shù)胶台,則monkeyrunner將視文件內(nèi)容為Python程序歼疮,并加以運(yùn)行;否則诈唬,它將提供一個(gè)交互對(duì)話環(huán)境韩脏。

monkeyrunner基本語(yǔ)法


monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>  

具體介紹…看官方文檔
實(shí)例
連接真機(jī)(模擬器),打開(kāi)CMD铸磅,進(jìn)入:E:\android-sdk-windows\tools文件夾內(nèi)(里面有monkeyrunner.bat)
創(chuàng)建一個(gè)Python腳本文件:testrunner.py赡矢,內(nèi)容如下:
注意!如果monkeyrunner腳本文件要使用中文,記得格式保存為utf8,不然會(huì)ASCNII無(wú)法支持錯(cuò)誤


#導(dǎo)入我們需要用到的包和類并且起別名  
import sys  
from com.android.monkeyrunner import MonkeyRunner as mr  
from com.android.monkeyrunner import MonkeyDevice as md  
from com.android.monkeyrunner import MonkeyImage as mi  
   
#connect device 連接設(shè)備  
#第一個(gè)參數(shù)為等待連接設(shè)備時(shí)間  
#第二個(gè)參數(shù)為具體連接的設(shè)備  
device = mr.waitForConnection(1.0,'e0d98451')  
if not device:  
    print >> sys.stderr,"fail"  
    sys.exit(1)  
#定義要啟動(dòng)的Activity  
componentName='com.example.simulate/.ShellActivity'  
#啟動(dòng)特定的Activity  
device.startActivity(component=componentName)  
mr.sleep(3.0)  
#do someting 進(jìn)行我們的操作  
#輸入 helloworld  
device.type('helloworld')  
#輸入回車  
device.press('KEYCODE_ENTER')  
#return keyboard  
#device.press('KEYCODE_BACK')  
#------  
#takeSnapshot截圖  
mr.sleep(3.0)  
result = device.takeSnapshot()  
   
#save to file 保存到文件  
result.writeToFile('./shot1.png','png');  

接下來(lái)命令行輸入:

monkeyrunner testrunner.py  

這是一個(gè)小的腳本文件,主要是啟動(dòng)com.example.simulate包名下的ShellActivity界面阅仔,接下來(lái)按下Enter按鈕吹散,最后截屏,并保存在當(dāng)前目錄下為shot1.png八酒,可以在toosl文件夾下查看空民。



這個(gè)腳本的實(shí)質(zhì)就是一個(gè)python腳本,懂python的朋友,可以利用這個(gè)實(shí)現(xiàn)非常強(qiáng)悍的功能~~~~~~~~~~~~~~~~~~~~~~~~

monkeyRunner 的記錄和回放

這才是真正實(shí)用的功能,直接看代碼羞迷,創(chuàng)建一個(gè)monkey_recorder.py:

#!/usr/bin/env monkeyrunner  
# Copyright 2010, The Android Open Source Project  
#  
# Licensed under the Apache License, Version 2.0 (the "License");  
# you may not use this file except in compliance with the License.  
# You may obtain a copy of the License at  
#  
#     http://www.apache.org/licenses/LICENSE-2.0  
#  
# Unless required by applicable law or agreed to in writing, software  
# distributed under the License is distributed on an "AS IS" BASIS,  
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
# See the License for the specific language governing permissions and  
# limitations under the License.  
  
from com.android.monkeyrunner import MonkeyRunner as mr  
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder  
  
device = mr.waitForConnection()  
recorder.start(device)  

命令行下運(yùn)行:

monkeyrunner monkey_recorder.py  

這時(shí)會(huì)彈出這樣的界面:



按鈕以及一些功能說(shuō)明:

1.Wait等待時(shí)間
2.Press a Button發(fā)送,MENU,HOME,or SEARCH 按鈕.Press,Down,or Up事件
3.Type Something發(fā)送一些字符串
4.Fling用來(lái)操作虛擬鍵盤(pán)

5.Export Action將我們的腳本導(dǎo)出來(lái)

6.Refresh Display刷新當(dāng)前界面

自己隨心所以創(chuàng)建一些事件腳本界轩,想做什么就可以做什么,通過(guò)MonkeyRecorder這個(gè)工具來(lái)操作設(shè)備界面衔瓮,事件編輯完后選擇Export Actions浊猾,導(dǎo)出到我們tools目錄下命名為:action.mr
我們看一下工具生成的action.mr腳本,如下:

# 注意 #:
1.在pc上操作手機(jī)屏幕會(huì)將事件記錄下來(lái)报辱。
2.事件記錄是不會(huì)添加wait 時(shí)間 要手動(dòng)添加与殃,理論每個(gè)事件執(zhí)行后都要添加

TOUCH|{'x':297,'y':533,'type':'downAndUp',}  
WAIT|{'seconds':2.0,}  
TOUCH|{'x':136,'y':278,'type':'downAndUp',}  
WAIT|{'seconds':2.0,}  
TOUCH|{'x':123,'y':356,'type':'downAndUp',}  
WAIT|{'seconds':10.0,}  
PRESS|{'name':'HOME','type':'downAndUp',}  
WAIT|{'seconds':2.0,}  
TOUCH|{'x':235,'y':720,'type':'downAndUp',}  
WAIT|{'seconds':2.0,}  
TOUCH|{'x':303,'y':630,'type':'downAndUp',}  
WAIT|{'seconds':2.0,}  
TOUCH|{'x':16,'y':71,'type':'downAndUp',}  
WAIT|{'seconds':2.0,}  
TOUCH|{'x':244,'y':735,'type':'downAndUp',}  

然后需要制作一個(gè)運(yùn)行這一系列動(dòng)作的腳本:monkey_playback.py单山,保存到tools目錄下:


#!/usr/bin/env monkeyrunner  
# Copyright 2010, The Android Open Source Project  
#  
# Licensed under the Apache License, Version 2.0 (the "License");  
# you may not use this file except in compliance with the License.  
# You may obtain a copy of the License at  
#  
#     http://www.apache.org/licenses/LICENSE-2.0  
#  
# Unless required by applicable law or agreed to in writing, software  
# distributed under the License is distributed on an "AS IS" BASIS,  
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
# See the License for the specific language governing permissions and  
# limitations under the License.  
  
import sys  
from com.android.monkeyrunner import MonkeyRunner  
  
# The format of the file we are parsing is very carfeully constructed.  
# Each line corresponds to a single command.  The line is split into 2  
# parts with a | character.  Text to the left of the pipe denotes  
# which command to run.  The text to the right of the pipe is a python  
# dictionary (it can be evaled into existence) that specifies the  
# arguments for the command.  In most cases, this directly maps to the  
# keyword argument dictionary that could be passed to the underlying  
# command.   
  
# Lookup table to map command strings to functions that implement that  
# command.  
CMD_MAP = {  
    'TOUCH': lambda dev, arg: dev.touch(**arg),  
    'DRAG': lambda dev, arg: dev.drag(**arg),  
    'PRESS': lambda dev, arg: dev.press(**arg),  
    'TYPE': lambda dev, arg: dev.type(**arg),  
    'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)  
    }  
  
# Process a single file for the specified device.  
def process_file(fp, device):  
    for line in fp:  
        (cmd, rest) = line.split('|')  
        try:  
            # Parse the pydict  
            rest = eval(rest)  
        except:  
            print 'unable to parse options'  
            continue  
  
        if cmd not in CMD_MAP:  
            print 'unknown command: ' + cmd  
            continue  
  
        CMD_MAP[cmd](device, rest)  
  
  
def main():  
    file = sys.argv[1]  
    fp = open(file, 'r')  
  
    device = MonkeyRunner.waitForConnection()  
      
    process_file(fp, device)  
    fp.close();  
      
  
if __name__ == '__main__':  
    main()  

接下來(lái)運(yùn)行我們的保存的腳本,然后,你就看到真機(jī)(模擬器)碍现,進(jìn)行你剛才一樣的操作~


E:\android-sdk-windows\tools>monkeyrunner monkey_playback.py action.mr  


我的腳本是執(zhí)行一些press down 和press up動(dòng)作,同時(shí)會(huì)有延遲米奸,之后按下home按鈕昼接,最后打開(kāi)桌面的短信程序,并打開(kāi)某一條信息是不是有點(diǎn)像按鍵精靈的感覺(jué)悴晰?但是得依靠命令行執(zhí)行腳本~~

至此慢睡,monkey和monkeyrunner介紹完畢。

轉(zhuǎn)自:http://blog.csdn.net/mad1989/article/details/38087737
附件傳送門(mén)地址铡溪,網(wǎng)上一位朋友寫(xiě)好的常用的recorder漂辐、playback腳本,包括我以上所列py棕硫,你可以自己看著修改髓涯,別人的資源,免費(fèi)共享:
http://download.csdn.net/detail/mad1989/7674089

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哈扮,一起剝皮案震驚了整個(gè)濱河市纬纪,隨后出現(xiàn)的幾起案子蚓再,更是在濱河造成了極大的恐慌,老刑警劉巖包各,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摘仅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡问畅,警方通過(guò)查閱死者的電腦和手機(jī)娃属,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)护姆,“玉大人膳犹,你說(shuō)我怎么就攤上這事∏┰颍” “怎么了须床?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渐裂。 經(jīng)常有香客問(wèn)我豺旬,道長(zhǎng),這世上最難降的妖魔是什么柒凉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任族阅,我火速辦了婚禮,結(jié)果婚禮上膝捞,老公的妹妹穿的比我還像新娘坦刀。我一直安慰自己,他們只是感情好蔬咬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布鲤遥。 她就那樣靜靜地躺著,像睡著了一般林艘。 火紅的嫁衣襯著肌膚如雪盖奈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天狐援,我揣著相機(jī)與錄音钢坦,去河邊找鬼。 笑死啥酱,一個(gè)胖子當(dāng)著我的面吹牛爹凹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镶殷,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼禾酱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宇植,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤得封,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后指郁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忙上,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年闲坎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疫粥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腰懂,死狀恐怖梗逮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绣溜,我是刑警寧澤慷彤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站怖喻,受9級(jí)特大地震影響底哗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锚沸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一跋选、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哗蜈,春花似錦前标、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绽昼,卻和暖如春唯鸭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硅确。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留明肮,地道東北人菱农。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柿估,于是被迫代替她去往敵國(guó)和親循未。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 移動(dòng)APP測(cè)試講義 本篇講義主要闡述APP的手工測(cè)試要點(diǎn),并概括介紹主流的APP測(cè)試框架的妖。 1. APP測(cè)試的準(zhǔn)備...
    厲鉚兄閱讀 9,665評(píng)論 6 109
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理绣檬,服務(wù)發(fā)現(xiàn),斷路器嫂粟,智...
    卡卡羅2017閱讀 134,707評(píng)論 18 139
  • 原文 圣人之治民娇未,度于本,不從其欲星虹,期于利民而已零抬。故其與之刑,非所以惡民宽涌,愛(ài)之本也平夜。刑勝而民靜,賞繁而奸生卸亮。故治民...
    慢牛策略閱讀 310評(píng)論 0 0
  • 玫瑰花物語(yǔ)代表 幸福 浪漫 愛(ài)情等… 2月14號(hào)西方情人節(jié)兼贸,也是大家最喜歡的節(jié)日锰扶,這一天會(huì)有人送禮物請(qǐng)吃飯有驚喜也...
    邱敏V塑締造你的美麗閱讀 589評(píng)論 0 2