Monkey:Android SDK自帶的一個命令行工具,使用adb來運行它,向系統(tǒng)發(fā)送偽隨機的用戶事件流,如按鍵、觸屏、輸入等;實現(xiàn)對正在開發(fā)的應用程序進行壓力測試,伴隨著日志輸出。實際上該工具只能做程序做一些壓力測試,由于測試事件和數(shù)據(jù)都是隨機的,不能自定義,所以有很大的局限性。
MonkeyRunner:Android SDK提供的測試工具,位于tools目錄下,比Monkey強大,可以編寫腳本來自定義數(shù)據(jù),事件;但是腳本是采用python語言編寫的,其實就是對python進行了封裝,對測試人員要求較高。
Instrumentation:這個是Google早期提供的測試自動化測試工具類,可以看成是Android的一個組件,可以模擬用戶眾多事件,通常用來單元測試,對測試人員要求較高,需要了解Android的api。
UiAutomator:Android提供的自動化測試框架,也是前兩年最佳的UI測試框架,基本上支持所有的用戶事件,可以抓取APP頁面控件屬性,測試代碼結(jié)構(gòu)簡單,編寫容易,能跨APP測試,但是要求設(shè)備在Android4.1以上,不支持Hybird APP,WebApp。
Appium:這應該是最近很火的一個測試框架,支持Native APP,Hybird APP,Web APP;可以跨平臺在Windows,Mac,Linux使用,支持Android,ios;支持java,js,php,Python等語言編寫測試腳本。
Monkey命令介紹
我們在cmd中先進入adb所在目錄,然后輸入命令 adb shell monkey -help 可以查看到monkey相關(guān)的命令
-p 用于約束限制,用此參數(shù)指定一個包,指定包后Monkey將被允許啟動指定應用;如果不指定包,? Monkey將被允許啟動設(shè)備中的所有應用(主Activity有android.intent.category.LAUNCHER 或android.intent.category.MONKEY類別?)。比如 adb shell monkey -p xxx.xxx.xxx 1 ?;?xxx.xxx.xxx 表示應用包名,1 表示monkey模擬用戶隨機事件參數(shù),最低1,這樣就能把應用啟動起來
-v 用于指定反饋信息級別,也就是日志的詳細程度,分三個;-v 默認值,僅提供啟動提示,操作結(jié)果等少量信息 比如adb shell monkey -p ?xxx.xxx.xxx -v?1 ;-v -v 提供比較詳細信息,比如啟動的每個activity信息 ,比如adb shell monkey -p xxx.xxx.xxx -v -v?1 ;-v -v -v 提供最詳細的信息 ,比如adb shell monkey -p xxx.xxx.xxx -v -v -v?1?
-s 偽隨機數(shù)生成器的種子值,如果我們兩次monkey測試事件使用相同的種子值,會產(chǎn)生相同的事件序列;如果不指定種子值,系統(tǒng)會產(chǎn)生一個隨機值。種子值對我們復現(xiàn)bug很重要。使用如下adb shell monkey -p xxx.xxx.xxx?-s 11111 10
--ignore-crashes 忽略異常崩潰,如果不指定,那么在monkey測試的時候,應用發(fā)生崩潰時就會停止運行;如果加上了這個參數(shù),monkey就會運行到指定事件數(shù)才停止。比如adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--ignore-crashes?10?
--ignore-timeouts 忽略ANR,情況與4類似,當發(fā)送ANR時候,讓monkey繼續(xù)運行。比如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 忽略一些許可錯誤,比如證書許可,網(wǎng)絡許可,adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--ignore-security-exceptions?10
--monitor-native-crashes 是否監(jiān)視并報告native層發(fā)送的崩潰代碼,adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--monitor-native-crashes?10
--kill-procress-after-error 用于在發(fā)送錯誤后殺死進程
--hprof ?設(shè)置后,在Monkey事件序列之前和之后立即生產(chǎn)分析報告,保存于data/mic目錄,不過將會生成大量幾兆文件,謹慎使用
--throttle 設(shè)置每個事件結(jié)束后延遲多少時間再繼續(xù)下一個事件,降低cpu壓力;如果不設(shè)置,事件與事件之間將不會延遲,事件將會盡快生成;一般設(shè)置300ms,因為人最快300ms左右一個動作,比如?adb shell monkey -p xxx.xxx.xxx?-v -v -v ?--throttle?300 10
--pct-touch 設(shè)置觸摸事件的百分比,即手指對屏幕進行點擊抬起(down-up)的動作;不做設(shè)置情況下系統(tǒng)將隨機分配各種事件的百分比。比如adb shell monkey -p xxx.xxxx.xxx --pct-touch 50 -v -v 100 ,這就表示100次事件里有50%事件是觸摸事件
--pct-motion 設(shè)置運動事件百分比,這種事件類型是由屏幕上某處的一個down事件-一系列偽隨機的移動事件-一個up事件,即點擊屏幕,然后直線運動,最后抬起這種運動。
--pct-trackball 設(shè)置軌跡球事件百分比,這種事件類型是一個或者多個隨機移動,包含點擊事件;這里可以是曲線運動
--pct-syskeys 設(shè)置系統(tǒng)按鍵事件百分比,比如home鍵,音量鍵,返回鍵,撥打電話等
--pct-nav 設(shè)置基本的導航按鍵事件百分比,比如輸入設(shè)備上的上下左右四個方向鍵
--pct-appswitch 設(shè)置activity跳轉(zhuǎn)事件的百分比
--ptc-anyevent 設(shè)置其它事件百分比
--ptc-majornav 設(shè)置主導航事件的百分比
保存dos窗口打印的monkey信息,在monkey命令后面補上輸出地址,如adb shell monkey -p xxx.xxxx.xxx ?-v -v 100 > D:\monkey.txt;這樣monkey測試結(jié)束后,所有打印的信息都會輸出到這個文件里
通過adb bugreport 命令可以獲取整個android系統(tǒng)在運行過程中所有app的內(nèi)存使用情況,cpu使用情況,activity運行信息等,包括出現(xiàn)異常等信息。使用方法?adb bugreport > bugreport.txt ;這樣在當前目錄就會產(chǎn)生一個txt文件和一個壓縮包,具體信息可在壓縮包查看,txt文件只會記錄壓縮包的生成過程信息
-f 加載monkey腳本文件進行測試,比如 adb shell monkey -f sdcard/monkey.txt -v -v 500
Monkey使用
1.進入adb目錄
2.通過adb install apk名字
3.輸入adb shell monkey -p xxx.xxxx.xxx ?-s 123123 --throttle 300 -v -v 20 > d:\monkey.txt,這里指定了seed值,每個事件之間休息300ms,執(zhí)行了20個事件,然后將日志信息保存在了monkey.txt文件中
4.打開文件,查看信息如下:
Monkey: seed=123123 count=20 //seed值是指定的123123,方便出現(xiàn)bug后再復現(xiàn) 事件次數(shù)是20
:AllowPackage: com.android.mangodialog // 應用包名
:IncludeCategory: android.intent.category.LAUNCHER //啟動的主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) //該應用符合這種類別的activity
// Selecting main activities from category android.intent.category.MONKEY
// Seeded: 123123
// Event percentages://各種事件的百分比
// ? 0: 15.0% ?//可通過--pct-touch 參數(shù)設(shè)置的事件的百分比 常用
// ? 1: 10.0% ?//可通過--pct-motion 參數(shù)設(shè)置的事件的百分比 常用
// ? 2: 2.0% ? //可通過--pct-pinchzoom 參數(shù)設(shè)置的事件的百分比
// ? 3: 15.0% ?//可通過--pct-trackball 參數(shù)設(shè)置的事件的百分比
// ? 4: -0.0% ?
// ? 5: -0.0% ?
// ? 6: 25.0% ?//可通過--pct-nav 參數(shù)設(shè)置的事件的百分比
// ? 7: 15.0% ?//可通過--pct-majornav 參數(shù)設(shè)置的事件的百分比
// ? 8: 2.0% ? //可通過--pct-syskeys 參數(shù)設(shè)置的事件的百分比 常用
// ? 9: 2.0% ? //可通過--pct-appswitch 參數(shù)設(shè)置的事件的百分比?常用
// ? 10: 1.0% ?//可通過--pct-flip 參數(shù)設(shè)置的事件的百分比
// ? 11: 13.0% //可通過--pct-anyevent 參數(shù)設(shè)置的事件的百分比?
//啟動的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í)行點擊事件
: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 //軌跡球運動
:Sending Trackball (ACTION_MOVE): 0:(4.0,-5.0)//手機屏幕上的坐標
Events injected: 20 //monkey共執(zhí)行了20次事件
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
//測試過程中的網(wǎng)絡狀態(tài),花費了3064ms連接,既沒有連接上手機網(wǎng)絡,也沒有連接上wifi
## Network stats: elapsed time=3064ms (0ms mobile, 0ms wifi, 3064ms not connected)?
// Monkey finished //monkey測試結(jié)束
5.平時會使用比較復雜的參數(shù)去測試,如下
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.其實我們比較關(guān)注的是app在使用過程中出現(xiàn)的錯誤信息,像上面我們選擇忽略掉集中錯誤情況,這樣當monkey執(zhí)行結(jié)束后,相關(guān)的信息會被寫入到monkey文件中,但是錯誤信息比如crash,anr等信息會打印在dos窗口,這些錯誤信息會明確的指出哪里發(fā)生的錯誤;如果需要復現(xiàn),我們可以把忽略參數(shù)去掉,然后通過相同的seed值再次進行monkey測試,直到發(fā)生錯誤跳出monkey測試,我們再查看,如下
public class MainActivity2 extends AppCompatActivity {
? ? @Override
? ? protected void onCreate(@Nullable Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.act_main2);
? ? ? ? float s = 1/0;
? ? }
}
我這第二個activity的oncreate方法中寫這個會報錯的代碼,然后在第一個activity的一個按鈕中進行跳轉(zhuǎn)進入這個activity,接下來進行monkey測試來復現(xiàn)這個bug
adb shell monkey -p xxx.xxx.xxx -s 123456 -v -v 2000 ?> d:\monkey.txt
我們看這個文件
: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
這里可以看到是當打開MainActivity2的時候monkey發(fā)生錯誤退出,只執(zhí)行了190個事件。至于錯誤信息打印在了dos窗口。
這里我們也可以通過adb bugreport命令將手機運行日志導出來查看,這里面的信息更詳細,包括出錯信息。
Monkey腳本
monkeyscript是monkey的腳本語言,能夠被monkey識別的命令集合,可以實現(xiàn)一些固定的重復性動作。Monkey可以通過命令加載腳本來進行測試,簡單方便。
腳本格式如下:
type= raw events
count= 1
speed= 1.0 ??
start data >> ??
LaunchActivity(pkg_name, cl_name)??
第一句到第三局就使用默認值,不需要改,其實這里設(shè)置是無效的,最終會采用命令行里的值;
start data >> 表示開始執(zhí)行下面所有的命令行
LaunchActivity就是一個啟動應用的命令
腳本命令
LaunchActivity(pkg_name, cl_name) 打開應用,第一個參數(shù)是包名,第二個是啟動的activity名
DispatchPress(keyName) 按下物理按鍵,例如home鍵,back鍵;參數(shù)是按鍵值 ,按鍵值可查看keycode
Tap(x, y) 點擊屏幕,參數(shù)是點擊坐標
Drag(xStart, yStart, xEnd, yEnd) 滑動屏幕,坐標是從哪一點滑到哪一點
LongPress() 長按2s
ProfileWait 等待5s
PressAndHold(x, y, pressDuration) 模擬長按?
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) 選擇屏幕,第一個參數(shù)是旋轉(zhuǎn)角度,第二個是旋轉(zhuǎn)后是否停在當前位置
DispatchFlip(true/false) 打開或者關(guān)閉軟鍵盤
UserWait(sleepTime) 睡眠指定時間
DeviceWakeUp() 喚醒屏幕
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags) 向指定位置發(fā)送單個手勢
更多方法可查看Monkey源碼
現(xiàn)在來寫一個腳本:
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);
然后通過adb push d:\monkey.txt sdcard/monkey.txt 將文件推送到手機sd卡上,然后通過
adb shell monkey -f sdcard/monkey.txt -v -v 1 執(zhí)行腳本文件
---------------------
原文:https://blog.csdn.net/qq_30993595/article/details/80748559