一、Monkey是什么
1顶燕、Monkey測試是Android自動化測試的一種手段,是個命令行工具冈爹,可以運(yùn)行在模擬器或?qū)嶋H設(shè)備之中涌攻;
2、Monkey測試本身非常簡單频伤,就是模擬用戶的按鍵輸入恳谎,觸摸屏輸入,手勢輸入等憋肖,看設(shè)備多長時間會出異常因痛;
3、當(dāng)Monkey程序在模擬器或真實(shí)設(shè)備運(yùn)行的時候岸更,程序會產(chǎn)生一定數(shù)量或一定時間內(nèi)的隨機(jī)模擬用戶操作事件, 如點(diǎn)擊鸵膏,按鍵,手勢等怎炊, 以及一些系統(tǒng)級別的事件谭企;
4、Monkey測試通常也稱隨機(jī)測試或者穩(wěn)定性/健壯性測試或者稱之為壓力測試评肆,類似于軟暴力猴子測試债查,抓起手機(jī)打開APP,一頓狂點(diǎn)瓜挽,各種快速盹廷,高頻,無規(guī)律的隨機(jī)性操作久橙,看app是否能正常相應(yīng)速和,或者出現(xiàn)崩潰歹垫,閃退剥汤,內(nèi)存溢出等等問題
二颠放、Monkey的局限性
1、測試對象僅僅是應(yīng)用程序包吭敢,有一定的局限性
2碰凶、Monkey測試使用的事件流數(shù)據(jù)流是隨機(jī)的,不能進(jìn)行自定義
3鹿驼、可以對測試的對象欲低,事件數(shù)量,類型畜晰,頻率等進(jìn)行設(shè)置
三砾莱、Monkey測試的停止條件
1、如果限定了Monkey運(yùn)行在一個或幾個特定的包上凄鼻,那么它會監(jiān)測試圖轉(zhuǎn)到其它包的操作腊瑟,并對其進(jìn)行阻止。
2块蚌、如果應(yīng)用程序崩潰或接收到任何失控異常闰非,Monkey將停止并報錯。
3峭范、如果應(yīng)用程序產(chǎn)生了應(yīng)用程序不響應(yīng)(application not responding)的錯誤财松,Monkey將會停止并報錯。
四纱控、使用monkey的前提
1辆毡、準(zhǔn)備一部安卓手機(jī),Apple是不行的甜害!
2舶掖、手機(jī)最好恢復(fù)為出廠設(shè)置的狀態(tài),如果能root就更好了
3唾那、設(shè)置用成用不黑屏的狀態(tài)访锻,黑屏和鎖屏?xí)绊懨顖?zhí)行
4、手機(jī)不要設(shè)置鎖屏和解鎖密碼闹获,開機(jī)期犬,常亮,沒有人工操作避诽,永遠(yuǎn)不黑屏鎖屏
5龟虎、開啟開發(fā)者選項,允許usb調(diào)試沙庐,如果有調(diào)試選項鲤妥,記得選擇MTP模式
6佳吞、PC電腦上安裝adb tool相關(guān)工具(后續(xù)單獨(dú)寫一篇文章講ADB工具如何安裝配置吧!)
7棉安、usb線將手機(jī)和電腦連接底扳,彈出的提示信任的,選信任贡耽,提示允許usb調(diào)試的請允許調(diào)試
8衷模、Dos窗口cd到你的adb目錄下來執(zhí)行monkey命令(后文的演示環(huán)境下,adb安裝在d盤的adb文件夾下)
9蒲赂、手機(jī)上安裝你要測試的app的包阱冶,這一步不會的,請到此為止滥嘴,別往下看了木蹬!
五、Monkey實(shí)際操作過程
1若皱、首先電腦和手機(jī)通過usb連接镊叁,連接后進(jìn)入adb目錄下全谤,查看一下adb功能是否正常盾鳞,如下圖:
2、在adb目錄下執(zhí)行【adb devices】命令徙垫,就可以看到一個設(shè)備機(jī)已經(jīng)連接可用饺汹,如果不可用蛔添,那么請檢查你的usb調(diào)試選項,開發(fā)者選項是否允許和打開兜辞,下圖顯示device已經(jīng)正秤疲可以使用,我測試的是一臺華為手機(jī):
3逸吵、手機(jī)安裝上你的apk的測試包凶硅,此時需要知道你的包的ID,才能在命令行里輸入相應(yīng)命令針對這個app進(jìn)行隨時事件測試扫皱,如何知道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í)行測試了(找ID這個過程有幾種方法,這個最簡單一點(diǎn)蚀浆,后文還補(bǔ)充了一種方法)
4缀程、在手機(jī)上打開你的app,登錄到應(yīng)用的主頁面市俊,然后在adb的目錄下,執(zhí)行【adb shell monkey -p com.aaa.aaaaaaaa ?-v 500 >F:/monkeylog2018.txt】這條命令的意思是對aaa.aaaaaaaa這個ID應(yīng)用包滤奈,執(zhí)行500次隨機(jī)事件(可能包含點(diǎn)擊摆昧,滑動等等,隨機(jī)生成的蜒程,無法人為控制)绅你,然后執(zhí)行的日志輸出到F盤的monkey2018.txt文件里,輸入命令后昭躺,回車忌锯,等待結(jié)果,在這個時間里你會看到你的手機(jī)的這個app會自動做各種操作领炫,點(diǎn)擊偶垮,滑動等等,都是自動化的帝洪,這就是正在執(zhí)行monkey測試了似舵,我把我公司開發(fā)的app名稱打碼了,命令執(zhí)行很快葱峡,就是這個效果:
5砚哗、命令執(zhí)行完成,接下來就去看看log吧砰奕,打開F盤自動生成的這個文件蛛芥,詳細(xì)看看都生成了什么內(nèi)容:
六、Monkey日志簡要分析
前四行基本是介紹概況军援,第一行是總計進(jìn)行了多少次隨機(jī)事件仅淑,第二行是告訴你本次測試的app的id,第三四行是說做了什么類型的操作盖溺,第五行開始是介紹這次500次隨機(jī)事件或命令的分布百分比漓糙,至于0-11是什么意思,稍后介紹烘嘱,下面是log的全文昆禽,貼出來看看(#后面是我寫的注釋蝗蛙,不是日志原文):
Monkey: seed=1515610273991 count=500 ? #累計執(zhí)行了多少次隨機(jī)事件
:AllowPackage: com.aaa.aaaaa ? #包名
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages: ? ?#事件的分布百分比
//? 0: 15.0% ? ?#觸摸事件百分比
//? 1: 10.0% ? ?#手勢事件百分比
//? 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%??#啟動activity事件百分比
//? 9: 2.0%??#鍵盤輕彈事件百分比
//? 10: 1.0%??#其他事件百分比
:Switch: ?#表示跳轉(zhuǎn)到我們要測試的包的里,命令里制定的包的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還沒反應(yīng)過來,它就執(zhí)行下一個命令了盗棵,還有就是app里沒有滑動點(diǎn)擊的功能壮韭,點(diǎn)了也沒反應(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在這篇文章里是刪減了喷屋,都差不多,貼太長沒用
: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):占用時間=2266ms(手機(jī)0ms,wifi0ms颜启,未連接2266ms)
// Monkey finished ? ?#測試結(jié)束
以上內(nèi)容包含了測試過程的操作和步驟偷俭,以及日志的基本分析,要深入的學(xué)習(xí)monkey還需要深入的分析日志缰盏,這個專題涌萤,下次再寫。
補(bǔ)充:
查看ID其他方法1:要查看設(shè)備中所有的包乳规,在CMD窗口中執(zhí)行以下命令:
? >adb shell
? #cd data/data
? #ls
會列出所有的ID形葬,從中找出自己的ID即可,但是這個方法的前提是root或者說有data目錄的權(quán)限暮的,有的機(jī)器上執(zhí)行這個命令的結(jié)果是拒絕的笙以,并不會列出包名,這種情況下冻辩,用上文提到的方法可以搞定猖腕;這個是全面出擊
查看ID其他方法2: 在手機(jī)連接電腦的情況下,點(diǎn)擊運(yùn)行你要查看id的APP后恨闪,在adb目錄下執(zhí)行這個命令倘感,也可以看到app的ID:
>adb?shell?dumpsys?activity?|?find?"mFocusedActivity" ? ?這個是精準(zhǔn)定位
查看ID其他方法3:在adb目錄下執(zhí)行:adb shell pm list packages -3 ? 這個命令是輸出第三方的包,在這列表里選出自己的app
作者碼字辛苦咙咽,凡是讀后有益者老玛,請麻煩給個評價,點(diǎn)個喜歡,如果喜歡我的文章蜡豹,請長期關(guān)注麸粮。2018年,長期更新镜廉。
有興趣溝通交流的可以加QQ群:222728298 ? ?