Monkey:Android SDK自帶的一個(gè)命令行工具澜搅,使用adb來(lái)運(yùn)行它勉躺,向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流,如按鍵柳弄、觸屏碧注、輸入等糖赔;實(shí)現(xiàn)對(duì)正在開(kāi)發(fā)的應(yīng)用程序進(jìn)行壓力測(cè)試放典,伴隨著日志輸出。實(shí)際上該工具只能做程序做一些壓力測(cè)試壳影,由于測(cè)試事件和數(shù)據(jù)都是隨機(jī)的宴咧,不能自定義径缅,所以有很大的局限性。
MonkeyRunner:Android SDK提供的測(cè)試工具桃笙,位于tools目錄下沙绝,比Monkey強(qiáng)大闪檬,可以編寫(xiě)腳本來(lái)自定義數(shù)據(jù),事件;但是腳本是采用python語(yǔ)言編寫(xiě)的为黎,其實(shí)就是對(duì)python進(jìn)行了封裝铭乾,對(duì)測(cè)試人員要求較高娃循。
Instrumentation:這個(gè)是Google早期提供的測(cè)試自動(dòng)化測(cè)試工具類捌斧,可以看成是Android的一個(gè)組件,可以模擬用戶眾多事件妇押,通常用來(lái)單元測(cè)試敲霍,對(duì)測(cè)試人員要求較高丁存,需要了解Android的api解寝。
UiAutomator:Android提供的自動(dòng)化測(cè)試框架,也是前兩年最佳的UI測(cè)試框架与学,基本上支持所有的用戶事件索守,可以抓取APP頁(yè)面控件屬性卵佛,測(cè)試代碼結(jié)構(gòu)簡(jiǎn)單,編寫(xiě)容易疾牲,能跨APP測(cè)試阳柔,但是要求設(shè)備在Android4.1以上蚓峦,不支持Hybird APP暑椰,WebApp一汽。
Appium:這應(yīng)該是最近很火的一個(gè)測(cè)試框架召夹,支持Native APP戳鹅,Hybird APP枫虏,Web APP腾它;可以跨平臺(tái)在Windows妓忍,Mac定罢,Linux使用酬凳,支持Android,ios稠屠;支持java完箩,js,php阻逮,Python等語(yǔ)言編寫(xiě)測(cè)試腳本叔扼。
Monkey命令介紹
我們?cè)赾md中先進(jìn)入adb所在目錄瓜富,然后輸入命令 adb shell monkey -help 可以查看到monkey相關(guān)的命令
-p 用于約束限制鳍咱,用此參數(shù)指定一個(gè)包,指定包后Monkey將被允許啟動(dòng)指定應(yīng)用与柑;如果不指定包谤辜,? Monkey將被允許啟動(dòng)設(shè)備中的所有應(yīng)用(主Activity有android.intent.category.LAUNCHER 或android.intent.category.MONKEY類別?)。比如 adb shell monkey -p xxx.xxx.xxx 1 ?;?xxx.xxx.xxx 表示應(yīng)用包名价捧,1 表示monkey模擬用戶隨機(jī)事件參數(shù)丑念,最低1,這樣就能把應(yīng)用啟動(dòng)起來(lái)
-v 用于指定反饋信息級(jí)別结蟋,也就是日志的詳細(xì)程度脯倚,分三個(gè);-v 默認(rèn)值推正,僅提供啟動(dòng)提示恍涂,操作結(jié)果等少量信息 比如adb shell monkey -p ?xxx.xxx.xxx -v?1 ;-v -v 提供比較詳細(xì)信息植榕,比如啟動(dòng)的每個(gè)activity信息 再沧,比如adb shell monkey -p xxx.xxx.xxx -v -v?1 ;-v -v -v 提供最詳細(xì)的信息 内贮,比如adb shell monkey -p xxx.xxx.xxx -v -v -v?1?
-s 偽隨機(jī)數(shù)生成器的種子值产园,如果我們兩次monkey測(cè)試事件使用相同的種子值,會(huì)產(chǎn)生相同的事件序列夜郁;如果不指定種子值什燕,系統(tǒng)會(huì)產(chǎn)生一個(gè)隨機(jī)值。種子值對(duì)我們復(fù)現(xiàn)bug很重要竞端。使用如下adb shell monkey -p xxx.xxx.xxx?-s 11111 10
--ignore-crashes 忽略異常崩潰屎即,如果不指定,那么在monkey測(cè)試的時(shí)候事富,應(yīng)用發(fā)生崩潰時(shí)就會(huì)停止運(yùn)行技俐;如果加上了這個(gè)參數(shù),monkey就會(huì)運(yùn)行到指定事件數(shù)才停止统台。比如adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--ignore-crashes?10?
--ignore-timeouts 忽略ANR雕擂,情況與4類似,當(dāng)發(fā)送ANR時(shí)候贱勃,讓monkey繼續(xù)運(yùn)行井赌。比如adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--ignore-timeouts?10
--ignore-native-crashes 忽略native層代碼的崩潰,情況與4類似贵扰,比如adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--ignore-native-crashes?10
--ignore-security-exceptions 忽略一些許可錯(cuò)誤仇穗,比如證書(shū)許可,網(wǎng)絡(luò)許可戚绕,adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--ignore-security-exceptions?10
--monitor-native-crashes 是否監(jiān)視并報(bào)告native層發(fā)送的崩潰代碼纹坐,adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--monitor-native-crashes?10
--kill-procress-after-error 用于在發(fā)送錯(cuò)誤后殺死進(jìn)程
--hprof ?設(shè)置后,在Monkey事件序列之前和之后立即生產(chǎn)分析報(bào)告舞丛,保存于data/mic目錄耘子,不過(guò)將會(huì)生成大量幾兆文件,謹(jǐn)慎使用
--throttle 設(shè)置每個(gè)事件結(jié)束后延遲多少時(shí)間再繼續(xù)下一個(gè)事件球切,降低cpu壓力拴还;如果不設(shè)置,事件與事件之間將不會(huì)延遲欧聘,事件將會(huì)盡快生成片林;一般設(shè)置300ms,因?yàn)槿俗羁?00ms左右一個(gè)動(dòng)作,比如?adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--throttle?300 10
--pct-touch 設(shè)置觸摸事件的百分比费封,即手指對(duì)屏幕進(jìn)行點(diǎn)擊抬起(down-up)的動(dòng)作焕妙;不做設(shè)置情況下系統(tǒng)將隨機(jī)分配各種事件的百分比。比如adb shell monkey -p xxx.xxxx.xxx --pct-touch 50 -v -v 100 弓摘,這就表示100次事件里有50%事件是觸摸事件
--pct-motion 設(shè)置運(yùn)動(dòng)事件百分比焚鹊,這種事件類型是由屏幕上某處的一個(gè)down事件-一系列偽隨機(jī)的移動(dòng)事件-一個(gè)up事件,即點(diǎn)擊屏幕韧献,然后直線運(yùn)動(dòng)末患,最后抬起這種運(yùn)動(dòng)。
--pct-trackball 設(shè)置軌跡球事件百分比锤窑,這種事件類型是一個(gè)或者多個(gè)隨機(jī)移動(dòng),包含點(diǎn)擊事件渊啰;這里可以是曲線運(yùn)動(dòng)
--pct-syskeys 設(shè)置系統(tǒng)按鍵事件百分比探橱,比如home鍵,音量鍵绘证,返回鍵隧膏,撥打電話等
--pct-nav 設(shè)置基本的導(dǎo)航按鍵事件百分比,比如輸入設(shè)備上的上下左右四個(gè)方向鍵
--pct-appswitch 設(shè)置activity跳轉(zhuǎn)事件的百分比
--ptc-anyevent 設(shè)置其它事件百分比
--ptc-majornav 設(shè)置主導(dǎo)航事件的百分比
保存dos窗口打印的monkey信息嚷那,在monkey命令后面補(bǔ)上輸出地址胞枕,如adb shell monkey -p xxx.xxxx.xxx ?-v -v 100 > D:\monkey.txt;這樣monkey測(cè)試結(jié)束后魏宽,所有打印的信息都會(huì)輸出到這個(gè)文件里
通過(guò)adb bugreport 命令可以獲取整個(gè)android系統(tǒng)在運(yùn)行過(guò)程中所有app的內(nèi)存使用情況曲稼,cpu使用情況,activity運(yùn)行信息等湖员,包括出現(xiàn)異常等信息。使用方法?adb bugreport > bugreport.txt ;這樣在當(dāng)前目錄就會(huì)產(chǎn)生一個(gè)txt文件和一個(gè)壓縮包瑞驱,具體信息可在壓縮包查看娘摔,txt文件只會(huì)記錄壓縮包的生成過(guò)程信息
-f 加載monkey腳本文件進(jìn)行測(cè)試,比如 adb shell monkey -f sdcard/monkey.txt -v -v 500
Monkey使用
1.進(jìn)入adb目錄
2.通過(guò)adb install apk名字
3.輸入adb shell monkey -p xxx.xxxx.xxx ?-s 123123 --throttle 300 -v -v 20 > d:\monkey.txt唤反,這里指定了seed值凳寺,每個(gè)事件之間休息300ms,執(zhí)行了20個(gè)事件彤侍,然后將日志信息保存在了monkey.txt文件中
4.打開(kāi)文件肠缨,查看信息如下:
Monkey: seed=123123 count=20 //seed值是指定的123123,方便出現(xiàn)bug后再?gòu)?fù)現(xiàn) 事件次數(shù)是20
:AllowPackage: com.android.mangodialog // 應(yīng)用包名
:IncludeCategory: android.intent.category.LAUNCHER //啟動(dòng)的主activity的類別盏阶,兩種只要有一種就行
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// ? + Using main activity com.android.mangodialog.MainActivity (from package com.android.mangodialog) //該應(yīng)用符合這種類別的activity
// Selecting main activities from category android.intent.category.MONKEY
// Seeded: 123123
// Event percentages://各種事件的百分比
// ? 0: 15.0% ?//可通過(guò)--pct-touch 參數(shù)設(shè)置的事件的百分比 常用
// ? 1: 10.0% ?//可通過(guò)--pct-motion 參數(shù)設(shè)置的事件的百分比 常用
// ? 2: 2.0% ? //可通過(guò)--pct-pinchzoom 參數(shù)設(shè)置的事件的百分比
// ? 3: 15.0% ?//可通過(guò)--pct-trackball 參數(shù)設(shè)置的事件的百分比
// ? 4: -0.0% ?
// ? 5: -0.0% ?
// ? 6: 25.0% ?//可通過(guò)--pct-nav 參數(shù)設(shè)置的事件的百分比
// ? 7: 15.0% ?//可通過(guò)--pct-majornav 參數(shù)設(shè)置的事件的百分比
// ? 8: 2.0% ? //可通過(guò)--pct-syskeys 參數(shù)設(shè)置的事件的百分比 常用
// ? 9: 2.0% ? //可通過(guò)--pct-appswitch 參數(shù)設(shè)置的事件的百分比?常用
// ? 10: 1.0% ?//可通過(guò)--pct-flip 參數(shù)設(shè)置的事件的百分比
// ? 11: 13.0% //可通過(guò)--pct-anyevent 參數(shù)設(shè)置的事件的百分比?
//啟動(dòng)的activity
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.mangodialog/.MainActivity;end
? ? // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.mangodialog/.MainActivity } in package com.android.mangodialog
Sleeping for 300 milliseconds //設(shè)置的事件之間間隔300ms 下面就是執(zhí)行點(diǎn)擊事件
:Sending Key (ACTION_DOWN): 82 ? ?// KEYCODE_MENU
:Sending Key (ACTION_UP): 82 ? ?// KEYCODE_MENU
Sleeping for 300 milliseconds
:Sending Key (ACTION_DOWN): 23 ? ?// KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23 ? ?// KEYCODE_DPAD_CENTER
Sleeping for 300 milliseconds
? ? // Allowing start of Intent { cmp=com.android.mangodialog/.MainActivity2 } in package com.android.mangodialog
:Sending Key (ACTION_DOWN): 22 ? ?// KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22 ? ?// KEYCODE_DPAD_RIGHT
Sleeping for 300 milliseconds
:Sending Key (ACTION_DOWN): 21 ? ?// KEYCODE_DPAD_LEFT
:Sending Key (ACTION_UP): 21 ? ?// KEYCODE_DPAD_LEFT
Sleeping for 300 milliseconds
:Sending Touch (ACTION_DOWN): 0:(1017.0,280.0)
:Sending Touch (ACTION_UP): 0:(1021.8751,281.12732)
Sleeping for 300 milliseconds
:Sending Touch (ACTION_DOWN): 0:(1005.0,1599.0)
:Sending Touch (ACTION_UP): 0:(994.4962,1589.7715)
Sleeping for 300 milliseconds
:Sending Key (ACTION_DOWN): 2 ? ?// KEYCODE_SOFT_RIGHT
:Sending Key (ACTION_UP): 2 ? ?// KEYCODE_SOFT_RIGHT
Sleeping for 300 milliseconds
:Sending Key (ACTION_DOWN): 20 ? ?// KEYCODE_DPAD_DOWN
:Sending Key (ACTION_UP): 20 ? ?// KEYCODE_DPAD_DOWN
Sleeping for 300 milliseconds
:Sending Key (ACTION_DOWN): 22 ? ?// KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22 ? ?// KEYCODE_DPAD_RIGHT
Sleeping for 300 milliseconds //軌跡球運(yùn)動(dòng)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-5.0)//手機(jī)屏幕上的坐標(biāo)
Events injected: 20 //monkey共執(zhí)行了20次事件
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
//測(cè)試過(guò)程中的網(wǎng)絡(luò)狀態(tài)晒奕,花費(fèi)了3064ms連接,既沒(méi)有連接上手機(jī)網(wǎng)絡(luò),也沒(méi)有連接上wifi
## Network stats: elapsed time=3064ms (0ms mobile, 0ms wifi, 3064ms not connected)?
// Monkey finished //monkey測(cè)試結(jié)束
5.平時(shí)會(huì)使用比較復(fù)雜的參數(shù)去測(cè)試脑慧,如下
adb shell monkey -v -v -v -s 123123 --throttle 300 --pct-touch 40 --pct-motion 25 --pct-appswitch 25 --pct-syskeys 10 --pct-majornav 0 --pct-nav 0 --pct-trackball 0 --ignore-crashes?--ignore-timeouts?--ignore-native-crashes?-p xxx.xxx.xxx 100000 > d:\monkey.txt
具體什么意思就不再一一解釋了魄眉。
6.其實(shí)我們比較關(guān)注的是app在使用過(guò)程中出現(xiàn)的錯(cuò)誤信息,像上面我們選擇忽略掉集中錯(cuò)誤情況闷袒,這樣當(dāng)monkey執(zhí)行結(jié)束后坑律,相關(guān)的信息會(huì)被寫(xiě)入到monkey文件中,但是錯(cuò)誤信息比如crash囊骤,anr等信息會(huì)打印在dos窗口晃择,這些錯(cuò)誤信息會(huì)明確的指出哪里發(fā)生的錯(cuò)誤;如果需要復(fù)現(xiàn)也物,我們可以把忽略參數(shù)去掉宫屠,然后通過(guò)相同的seed值再次進(jìn)行monkey測(cè)試,直到發(fā)生錯(cuò)誤跳出monkey測(cè)試焦除,我們?cè)俨榭醇た觯缦?/p>
public class MainActivity2 extends AppCompatActivity {
? ? @Override
? ? protected void onCreate(@Nullable Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.act_main2);
? ? ? ? float s = 1/0;
? ? }
}
我這第二個(gè)activity的oncreate方法中寫(xiě)這個(gè)會(huì)報(bào)錯(cuò)的代碼,然后在第一個(gè)activity的一個(gè)按鈕中進(jìn)行跳轉(zhuǎn)進(jìn)入這個(gè)activity膘魄,接下來(lái)進(jìn)行monkey測(cè)試來(lái)復(fù)現(xiàn)這個(gè)bug
adb shell monkey -p xxx.xxx.xxx -s 123456 -v -v 2000 ?> d:\monkey.txt
我們看這個(gè)文件
:Sending Trackball (ACTION_MOVE): 0:(4.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,1.0)
:Sending Trackball (ACTION_DOWN): 0:(0.0,0.0)
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
Sleeping for 300 milliseconds
? ? // Allowing start of Intent { cmp=com.android.mangodialog/.MainActivity2 } in package com.android.mangodialog
** Monkey aborted due to error.
Events injected: 190
這里可以看到是當(dāng)打開(kāi)MainActivity2的時(shí)候monkey發(fā)生錯(cuò)誤退出乌逐,只執(zhí)行了190個(gè)事件。至于錯(cuò)誤信息打印在了dos窗口创葡。
這里我們也可以通過(guò)adb bugreport命令將手機(jī)運(yùn)行日志導(dǎo)出來(lái)查看浙踢,這里面的信息更詳細(xì),包括出錯(cuò)信息灿渴。
Monkey腳本
monkeyscript是monkey的腳本語(yǔ)言洛波,能夠被monkey識(shí)別的命令集合,可以實(shí)現(xiàn)一些固定的重復(fù)性動(dòng)作骚露。Monkey可以通過(guò)命令加載腳本來(lái)進(jìn)行測(cè)試蹬挤,簡(jiǎn)單方便。
腳本格式如下:
type= raw events
count= 1
speed= 1.0 ??
start data >> ??
LaunchActivity(pkg_name, cl_name)??
第一句到第三局就使用默認(rèn)值棘幸,不需要改焰扳,其實(shí)這里設(shè)置是無(wú)效的,最終會(huì)采用命令行里的值误续;
start data >> 表示開(kāi)始執(zhí)行下面所有的命令行
LaunchActivity就是一個(gè)啟動(dòng)應(yīng)用的命令
腳本命令
LaunchActivity(pkg_name, cl_name) 打開(kāi)應(yīng)用吨悍,第一個(gè)參數(shù)是包名,第二個(gè)是啟動(dòng)的activity名
DispatchPress(keyName) 按下物理按鍵蹋嵌,例如home鍵育瓜,back鍵;參數(shù)是按鍵值 栽烂,按鍵值可查看keycode
Tap(x, y) 點(diǎn)擊屏幕躏仇,參數(shù)是點(diǎn)擊坐標(biāo)
Drag(xStart, yStart, xEnd, yEnd) 滑動(dòng)屏幕恋脚,坐標(biāo)是從哪一點(diǎn)滑到哪一點(diǎn)
LongPress() 長(zhǎng)按2s
ProfileWait 等待5s
PressAndHold(x, y, pressDuration) 模擬長(zhǎng)按?
PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount) 模擬縮放
DispatchString(input) 輸入字符串
RunCmd(cmd) 執(zhí)行shell命令,比如截圖?screencap -p /data/local/tmp/tmp.png
RotateScreen(rotationDegree, persist) 選擇屏幕钙态,第一個(gè)參數(shù)是旋轉(zhuǎn)角度慧起,第二個(gè)是旋轉(zhuǎn)后是否停在當(dāng)前位置
DispatchFlip(true/false) 打開(kāi)或者關(guān)閉軟鍵盤(pán)
UserWait(sleepTime) 睡眠指定時(shí)間
DeviceWakeUp() 喚醒屏幕
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags) 向指定位置發(fā)送單個(gè)手勢(shì)
更多方法可查看Monkey源碼
現(xiàn)在來(lái)寫(xiě)一個(gè)腳本:
type= raw events
count= 1
speed= 1.0 ??
start data >> ??
LaunchActivity(com.android.mangodialog,com.android.mangodialog.MainActivity);
UserWait(1000);
Tab(500,300);
DispatchPress(KEYCODE_ENTER)
UserWait(1000);
DispatchPress(KEYCODE_BACK);
UserWait(1000);
RunCmd(screencap -p /sdcard/tmp.png);
UserWait(1000);
Drag(0, 0, 500, 500);
DispatchPress(KEYCODE_ENTER)
UserWait(1000);
DispatchString(www.baidu.com);
UserWait(1000);
DispatchPress(KEYCODE_BACK);
UserWait(1000);
然后通過(guò)adb push d:\monkey.txt sdcard/monkey.txt 將文件推送到手機(jī)sd卡上,然后通過(guò)
adb shell monkey -f sdcard/monkey.txt -v -v 1 執(zhí)行腳本文件
---------------------
原文:https://blog.csdn.net/qq_30993595/article/details/80748559