Monkey系列之01--基本操作


monkey

一、Monkey是什么

1、Monkey測(cè)試是Android自動(dòng)化測(cè)試的一種手段,是個(gè)命令行工具,可以運(yùn)行在模擬器或?qū)嶋H設(shè)備之中;

2、Monkey測(cè)試本身非常簡(jiǎn)單,就是模擬用戶的按鍵輸入,觸摸屏輸入,手勢(shì)輸入等,看設(shè)備多長(zhǎng)時(shí)間會(huì)出異常;

3、當(dāng)Monkey程序在模擬器或真實(shí)設(shè)備運(yùn)行的時(shí)候,程序會(huì)產(chǎn)生一定數(shù)量或一定時(shí)間內(nèi)的隨機(jī)模擬用戶操作事件, 如點(diǎn)擊,按鍵,手勢(shì)等, 以及一些系統(tǒng)級(jí)別的事件;

4、Monkey測(cè)試通常也稱隨機(jī)測(cè)試或者穩(wěn)定性/健壯性測(cè)試或者稱之為壓力測(cè)試,類似于軟暴力猴子測(cè)試,抓起手機(jī)打開(kāi)APP,一頓狂點(diǎn),各種快速,高頻,無(wú)規(guī)律的隨機(jī)性操作,看app是否能正常相應(yīng),或者出現(xiàn)崩潰,閃退,內(nèi)存溢出等等問(wèn)題

二、Monkey的局限性

1、測(cè)試對(duì)象僅僅是應(yīng)用程序包,有一定的局限性

2、Monkey測(cè)試使用的事件流數(shù)據(jù)流是隨機(jī)的,不能進(jìn)行自定義

3、可以對(duì)測(cè)試的對(duì)象,事件數(shù)量,類型,頻率等進(jìn)行設(shè)置

三、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ò)。

四、使用monkey的前提

1、準(zhǔn)備一部安卓手機(jī),Apple是不行的!

2、手機(jī)最好恢復(fù)為出廠設(shè)置的狀態(tài),如果能root就更好了

3、設(shè)置用成用不黑屏的狀態(tài),黑屏和鎖屏?xí)绊懨顖?zhí)行

4、手機(jī)不要設(shè)置鎖屏和解鎖密碼,開(kāi)機(jī),常亮,沒(méi)有人工操作,永遠(yuǎn)不黑屏鎖屏

5、開(kāi)啟開(kāi)發(fā)者選項(xiàng),允許usb調(diào)試,如果有調(diào)試選項(xiàng),記得選擇MTP模式

6、PC電腦上安裝adb tool相關(guān)工具(后續(xù)單獨(dú)寫(xiě)一篇文章講ADB工具如何安裝配置吧?。?/p>

7、usb線將手機(jī)和電腦連接,彈出的提示信任的,選信任,提示允許usb調(diào)試的請(qǐng)?jiān)试S調(diào)試

8、Dos窗口cd到你的adb目錄下來(lái)執(zhí)行monkey命令(后文的演示環(huán)境下,adb安裝在d盤的adb文件夾下)

9、手機(jī)上安裝你要測(cè)試的app的包,這一步不會(huì)的,請(qǐng)到此為止,別往下看了!

五、Monkey實(shí)際操作過(guò)程

1、首先電腦和手機(jī)通過(guò)usb連接,連接后進(jìn)入adb目錄下,查看一下adb功能是否正常,如下圖:

adb相關(guān)

2、在adb目錄下執(zhí)行【adb devices】命令,就可以看到一個(gè)設(shè)備機(jī)已經(jīng)連接可用,如果不可用,那么請(qǐng)檢查你的usb調(diào)試選項(xiàng),開(kāi)發(fā)者選項(xiàng)是否允許和打開(kāi),下圖顯示device已經(jīng)正??梢允褂?,我測(cè)試的是一臺(tái)華為手機(jī):

adb list

3、手機(jī)安裝上你的apk的測(cè)試包,此時(shí)需要知道你的包的ID,才能在命令行里輸入相應(yīng)命令針對(duì)這個(gè)app進(jìn)行隨時(shí)事件測(cè)試,如何知道ID呢?(不是上面的設(shè)備名字,而是app的ID,也是不你的app的中文名,而是在系統(tǒng)文件里的一串英文名)在adb目錄下,執(zhí)行命令【adb shell】,然后執(zhí)行【pm list packages】,列出的清單里,找到你的app的名字,具體怎么判斷,根據(jù)經(jīng)驗(yàn)即可,比如我下圖中箭頭所指的是baidu的app,package:后面的【com.XXXX.XXXX】就是應(yīng)用的ID了,找到你的應(yīng)用ID,就可以去執(zhí)行測(cè)試了(找ID這個(gè)過(guò)程有幾種方法,這個(gè)最簡(jiǎn)單一點(diǎn),后文還補(bǔ)充了一種方法)

查看包名

4、在手機(jī)上打開(kāi)你的app,登錄到應(yīng)用的主頁(yè)面,然后在adb的目錄下,執(zhí)行【adb shell monkey -p com.aaa.aaaaaaaa ?-v 500 >F:/monkeylog2018.txt】這條命令的意思是對(duì)aaa.aaaaaaaa這個(gè)ID應(yīng)用包,執(zhí)行500次隨機(jī)事件(可能包含點(diǎn)擊,滑動(dòng)等等,隨機(jī)生成的,無(wú)法人為控制),然后執(zhí)行的日志輸出到F盤的monkey2018.txt文件里,輸入命令后,回車,等待結(jié)果,在這個(gè)時(shí)間里你會(huì)看到你的手機(jī)的這個(gè)app會(huì)自動(dòng)做各種操作,點(diǎn)擊,滑動(dòng)等等,都是自動(dòng)化的,這就是正在執(zhí)行monkey測(cè)試了,我把我公司開(kāi)發(fā)的app名稱打碼了,命令執(zhí)行很快,就是這個(gè)效果:

執(zhí)行monkey測(cè)試

5、命令執(zhí)行完成,接下來(lái)就去看看log吧,打開(kāi)F盤自動(dòng)生成的這個(gè)文件,詳細(xì)看看都生成了什么內(nèi)容:

輸出日志

六、Monkey日志簡(jiǎn)要分析

前四行基本是介紹概況,第一行是總計(jì)進(jìn)行了多少次隨機(jī)事件,第二行是告訴你本次測(cè)試的app的id,第三四行是說(shuō)做了什么類型的操作,第五行開(kāi)始是介紹這次500次隨機(jī)事件或命令的分布百分比,至于0-11是什么意思,稍后介紹,下面是log的全文,貼出來(lái)看看(#后面是我寫(xiě)的注釋,不是日志原文):

Monkey: seed=1515610273991 count=500 ? #累計(jì)執(zhí)行了多少次隨機(jī)事件

:AllowPackage: com.aaa.aaaaa ? #包名

:IncludeCategory: android.intent.category.LAUNCHER

:IncludeCategory: android.intent.category.MONKEY

// Event percentages: ? ?#事件的分布百分比

//? 0: 15.0% ? ?#觸摸事件百分比

//? 1: 10.0% ? ?#手勢(shì)事件百分比

//? 2: 2.0% ? ???#二指縮放事件百分比

//? 3: 15.0%??#軌跡球事件百分比

//? 4: -0.0%??#屏幕旋轉(zhuǎn)事件百分比

//? 5: -0.0%??#基本導(dǎo)航事件百分比

//? 6: 25.0%??#主要導(dǎo)航事件百分比

//? 7: 15.0%??#系統(tǒng)按鈕事件百分比

//? 8: 2.0%??#啟動(dòng)activity事件百分比

//? 9: 2.0%??#鍵盤輕彈事件百分比

//? 10: 1.0%??#其他事件百分比

:Switch: ?#表示跳轉(zhuǎn)到我們要測(cè)試的包的里,命令里制定的包的activity里面activity#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.aaa.aaaa/.activity.SplashActivity;end

#表示允許次intent跳轉(zhuǎn)

? // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.aaa.aaaa/.activity.SplashActivity } in package com.aaa.aaaa

:Sending Trackball (ACTION_MOVE): 0:(-5.0,1.0)

:Sending Trackball (ACTION_MOVE): 0:(4.0,1.0)

:Sending Touch (ACTION_DOWN): 0:(844.0,452.0)

:Sending Touch (ACTION_UP): 0:(856.3925,455.1536)

? ? // Injection Failed ? ?#注入touch事件失敗啦,為什么呢?因?yàn)閍pp還沒(méi)反應(yīng)過(guò)來(lái),它就執(zhí)行下一個(gè)命令了,還有就是app里沒(méi)有滑動(dòng)點(diǎn)擊的功能,點(diǎn)了也沒(méi)反應(yīng)之類的,以后的文章詳細(xì)介紹monkey命令再詳解

:Sending Touch (ACTION_DOWN): 0:(246.0,256.0)

:Sending Touch (ACTION_UP): 0:(244.92224,247.17607)

:Sending Touch (ACTION_DOWN): 0:(428.0,476.0)

:Sending Touch (ACTION_UP): 0:(440.89676,405.66605)

? ? // Injection Failed

:Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0)

:Sending Touch (ACTION_DOWN): 0:(1070.0,1121.0)

:Sending Touch (ACTION_UP): 0:(1073.162,1132.0884)

:Sending Touch (ACTION_DOWN): 0:(641.0,438.0)

:Sending Touch (ACTION_UP): 0:(657.7884,396.05533)

:Sending Trackball (ACTION_MOVE): 0:(0.0,-4.0)

? ? //[calendar_time:2018-01-10 16:32:49.912? system_uptime:16578533]

? ? // Sending event #100 ?#注入事件成功100次

:Sending Trackball (ACTION_MOVE): 0:(1.0,-2.0)

:Sending Touch (ACTION_DOWN): 0:(768.0,1602.0)

:Sending Touch (ACTION_UP): 0:(896.64996,1583.9524)

:Sending Touch (ACTION_DOWN): 0:(1045.0,1781.0)

:Sending Touch (ACTION_UP): 0:(1043.9761,1774.2175)

:Sending Touch (ACTION_DOWN): 0:(1037.0,1271.0)

:Sending Touch (ACTION_UP): 0:(983.8985,1251.1171)

:Sending Touch (ACTION_DOWN): 0:(393.0,1354.0)

:Sending Touch (ACTION_UP): 0:(241.84598,1213.4604)

:Sending Touch (ACTION_DOWN): 0:(737.0,243.0)

:Sending Touch (ACTION_UP): 0:(739.0893,253.83078)

:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.aaa.aaaa/.activity.SplashActivity;end

? ? // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.aaa.aaaa/.activity.SplashActivity } in package com.aaa.aaaa

:Sending Touch (ACTION_DOWN): 0:(839.0,474.0)

:Sending Touch (ACTION_UP): 0:(838.525,469.33966)

:Sending Touch (ACTION_DOWN): 0:(150.0,1406.0)

? ? //[calendar_time:2018-01-10 16:32:50.269? system_uptime:16578890]

? ? // Sending event #200

:Sending Touch (ACTION_UP): 0:(122.750374,1494.216)

:Sending Touch (ACTION_DOWN): 0:(548.0,1164.0)

:Sending Touch (ACTION_UP): 0:(562.61395,1165.6589)

:Sending Trackball (ACTION_MOVE): 0:(-5.0,3.0)

? ? // Rejecting start of Intent { act=com.huawei.membranetouch.action.MT_GUIDE pkg=com.huawei.membranetouch cmp=com.huawei.membranetouch/.MtGuideActivity } in package com.huawei.membranetouch

:Sending Touch (ACTION_DOWN): 0:(30.0,474.0)

:Sending Touch (ACTION_UP): 0:(32.203053,478.70514)

:Sending Touch (ACTION_DOWN): 0:(736.0,1180.0)

:Sending Touch (ACTION_UP): 0:(687.7853,1144.4519)

:Sending Trackball (ACTION_MOVE): 0:(-5.0,-4.0)

:Sending Touch (ACTION_DOWN): 0:(278.0,0.0)

:Sending Touch (ACTION_UP): 0:(277.88403,0.0)

:Sending Touch (ACTION_DOWN): 0:(880.0,947.0)

:Sending Touch (ACTION_UP): 0:(892.1809,885.9538)

:Sending Touch (ACTION_DOWN): 0:(543.0,1594.0)

:Sending Touch (ACTION_UP): 0:(573.5902,1647.6938)

:Sending Touch (ACTION_DOWN): 0:(309.0,1204.0)

:Sending Touch (ACTION_UP): 0:(298.53745,1205.275)

Events injected: 500 ?#事件注入了500次,我的log在這篇文章里是刪減了,都差不多,貼太長(zhǎng)沒(méi)用

:Sending rotation degree=0, persist=false #發(fā)送屏幕翻轉(zhuǎn) 度=0,存留=假

:Dropped: keys=0 pointers=11 trackballs=0 flips=6 rotations=0 ? #丟棄:鍵=0,指針=11,軌跡球=0,鍵盤輕彈=6,屏幕翻轉(zhuǎn)=0

## Network stats: elapsed time=2266ms (0ms mobile, 0ms wifi, 2266ms not connected) ?#網(wǎng)絡(luò)狀態(tài):占用時(shí)間=2266ms(手機(jī)0ms,wifi0ms,未連接2266ms)

// Monkey finished ? ?#測(cè)試結(jié)束

以上內(nèi)容包含了測(cè)試過(guò)程的操作和步驟,以及日志的基本分析,要深入的學(xué)習(xí)monkey還需要深入的分析日志,這個(gè)專題,下次再寫(xiě)。

補(bǔ)充:

查看ID其他方法1:要查看設(shè)備中所有的包,在CMD窗口中執(zhí)行以下命令:

? >adb shell

? #cd data/data

? #ls

會(huì)列出所有的ID,從中找出自己的ID即可,但是這個(gè)方法的前提是root或者說(shuō)有data目錄的權(quán)限,有的機(jī)器上執(zhí)行這個(gè)命令的結(jié)果是拒絕的,并不會(huì)列出包名,這種情況下,用上文提到的方法可以搞定;這個(gè)是全面出擊

查看ID其他方法2: 在手機(jī)連接電腦的情況下,點(diǎn)擊運(yùn)行你要查看id的APP后,在adb目錄下執(zhí)行這個(gè)命令,也可以看到app的ID:

>adb?shell?dumpsys?activity?|?find?"mFocusedActivity" ? ?這個(gè)是精準(zhǔn)定位

手機(jī)百度的ID查找

查看ID其他方法3:在adb目錄下執(zhí)行:adb shell pm list packages -3 ? 這個(gè)命令是輸出第三方的包,在這列表里選出自己的app

查看第三方包ID



作者碼字辛苦,凡是讀后有益者,請(qǐng)麻煩給個(gè)評(píng)價(jià),點(diǎn)個(gè)喜歡,如果喜歡我的文章,請(qǐng)長(zhǎng)期關(guān)注。2018年,長(zhǎng)期更新。

有興趣溝通交流的可以加QQ群:222728298 ? ?


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容