為什么要開展壓力測試?
? 提高產(chǎn)品的穩(wěn)定性。
什么時候開展壓力測試嚷炉?
? 首輪功能測試通過后十厢。
? 下班后的夜間進行等太。
什么是Monkey?
? Monkey是發(fā)送偽隨機用戶事件的工具。
Monkey在哪里蛮放?
? 在手機系統(tǒng)里缩抡。
什么是MonkeyScript?
? MonkeyScript是一組可以被Monkey識別的命令集合包颁。
? MonkeyScript可以完成重復固定的操作瞻想。
MonkeyRunner是什么?
? MonkeyRunner提供了一系列的API
? MonkeyRunner可以完成模擬事件以及截圖操作娩嚼。
Monkey和MonkeyRunner的區(qū)別蘑险?
? Monkey: 在adb shell中,生成用戶或系統(tǒng)的偽隨機事件岳悟。
? MonkeyRunner: 通過API定義特定命令和事件控制設備佃迄。
MonkeyRunner APIs包含什么?
? MonkeyRunner:用來連接設備或模擬器竿音。
? MonkeyDevices: 提供安裝和屎、卸載應用,發(fā)送模擬事件
? MonkeyImage: 完成圖像保存春瞬,及對比的操作
MonkeyRunner的測試類型柴信?
- 多設備控制
- 功能測試
- 回歸測試
壓力結果
- CRASH:即崩潰,應用程序在使用過程中宽气,非正常退出随常。
- ANR: Application Not Responding
一個App的壓測實踐
- 在手機開發(fā)者選項中,將USB調試選上(部分機型還需要打開可以通過USB安裝APP)
- 確認手機和電腦已經(jīng)成功連接萄涯,通過adb devices命令
- 安裝測試App绪氛,通過命令行adb install packageName.apk
- 發(fā)送壓力指令 adb shell monkey 1000 (1000個指令的意思,具體是什么)
- 獲取APP包名 adb logcat|grep START
- logcat是輸入手機中一些app的log信息涝影;
- | 代表管道的意思枣察,將前一個命令的輸出作為后一個命令的輸入
- grep START 抓取包含有START的log信息輸出
- 也可以輸入以下命令獲取設備安裝的所有包名:
- adb shell pm list packages
- 給指定的包打壓力 adb shell monkey -p packageName 1000
Monkey 高級參數(shù)的應用
-
throttle 參數(shù)
指定事件之間的間隔
? adb shell monkey --throttle <millisenconds>
例如: adb shell monkey -p com.android.calculator2 --throttle 1000 10
- 1000: 代表的是事件
- 10: 代表的是指令數(shù)
-
seed參數(shù)
? 指定隨機生成數(shù)的seed值,Monkey的隨機操作都是基于seed值產(chǎn)生的,因此使用同一個seed值就會有統(tǒng)一的操作序列序目。操作指令如下:
? adb shell monkey -s <seed> <event-count>
例如:adb shell monkey -s 100 50
-
觸摸事件
設置觸摸事件百分比臂痕。Monkey只需要完成點擊事件的時候可以用本參數(shù)來設置。操作指令為:
? adb shell monkey -pct-touch <percent>
例如:adb shell monkey -v -p com.android.calculator2 --pct-touch 100 10
- -v 參數(shù)可以顯示執(zhí)行的操作
- -p 允許添加包名作為參數(shù)
-
動作事件
設置動作事件的百分比猿涨;即monkey在手機上點擊一些按鈕然后松起握童。如果百分比為60,則剩余的會用隨機操作叛赚。操作指令為:
? adb shell monkey --pct-motion <percent>
例如: adb shell monkey -v -p com.android.calculator2 --pct-touch 50 --pct-motion 30 100
? 上述中完成50%的點擊事件澡绩,然后30%的動作事件,剩余的都是隨機俺附,總共操作指令100次肥卡;
? 如果想只做兩種操作,那么這兩種操作的占比要剛好100%即可事镣。
-
軌跡球事件
設定軌跡球事件百分比召调;
adb shell monkey --pct-trackball <percent>
-
基本導航事件
設定基本導航事件百分比,輸入設備的上蛮浑、下唠叛、左、右的導航
adb shell monkey --pct-nav <percent>
-
主要導航事件
設定主要導航事件百分比沮稚,兼容中間鍵艺沼、返回鍵、菜單鍵
adb shell monkey --pct-majornav <percent>
-
系統(tǒng)導航事件
設定系統(tǒng)導航事件百分比蕴掏,HOME障般、BACK、撥號及音量鍵
adb shell monkey --pct-syskeys <percent>
-
啟動Activity事件
設定啟動Activity的事件百分比盛杰,它會在已有的activity中切換挽荡,假設設置為30%,有4個Activity即供,則它會在這四個總隨機切換并且占總操作數(shù)的百分之30%
adb shell monkey --pct-appswitch <percent>
-
不常用事件
設定不常用事件的百分比定拟;跟以上的事件不是一類的事件
adb shell monkey --pct-anyevent <percent>
-
崩潰事件
忽略崩潰和異常,即在發(fā)生崩潰和異常情況下逗嫡,繼續(xù)進行壓力測試青自。
adb shell monkey --ignore-crashes <event-count>
-
超時事件
忽略超時事件,
adb shell monkey --ignore-timeouts <event-count>
綜合實例:adb shell monkey -v -p com.android.calculator2 --pct-touch 50 --pct-motion 50 --ignore-crashes --ignore-timeouts 100(指定數(shù))
CRASH結果析取
實踐過程:
- 安裝可以引起CRASH的App
- 執(zhí)行壓力命令
- 析取CRASH的Exception信息
ANR結果析取
安裝可以引起ANR的app
執(zhí)行壓力命令
-
析取ANR的Exception信息
如果是手動的觸發(fā)的ANR信息驱证,可以先輸入adb shell進入手機延窜,然后cd /data/anr文件夾下面有日志記錄,找到該ANR即可抹锄。自動化的可以直接在命令后面加 > log.log 即可輸出到文件逆瑞。
Monkey Script
? 重復操作序列100次的需求時荠藤,通過MonkeyScript可以實現(xiàn)。執(zhí)行MonkeyScript的命令是:
? adb shell monkey -f <scriptfile> <event-count>
-
DispatchTrackball
命令(軌跡球命令)DispatchTrackball(long downtime, long eventide, int action, float x, float y, float pressure, float size, int metastate, float xprecision, float yprecision, int device, int edgeflags)
- downtime: 鍵最初被按下的事件
- eventide:指的事件获高,發(fā)生的事件
- <u>action :某個操作商源,具體的是按下還是彈起的過程</u>(重點)
- 0 代表按下
- 1 代表彈起
- 因此一條點擊事件需要兩條指令,一個按下谋减,一個彈起
- <u>x,y: 坐標點</u>(重點)
- 代表坐標點,通過UiAutomator工具來獲取點擊的坐標值
- pressure:當前壓力事件的大小扫沼,范圍是0-1
- size:觸摸的一個既是值出爹,范圍也是0-1
- metastate:當前按下meta鍵的標識
- xprecision/yprecision:x/y坐標的精確值
- device: 事件的來源,范圍0-x, 0表示不來自物理設備
- edgeflags:超出了屏幕的范圍
-
DispatchPointer
命令點擊事件
DispatchPointer(long downtime, long eventide, int action, float x, float y, float pressure, float size, int metastate, float xprecision, float yprecision, int device, int edgeflags)
? 參數(shù)含義如上缎除。
-
DispatchString
命令
? 輸入字符串事件
? DispatchString(String text)
-
LaunchActivity
命令啟動應用
LaunchActivity(package, Activity)
-
UserWait
命令等待事件
UserWait(1000) // 毫秒
-
DispatchPress
命令按下鍵值
DispatchPress(int keycode)
# keycode 66 回車鍵
-
實例:在搜索框輸如查詢詞
- 啟動App
- 點擊輸入框
- 輸入查詢詞
- 點擊鍵盤上的回車
- 點擊搜索按鈕
- 等待結果的輸出
- 點擊clear按鈕严就,保證重復的時候不會還有詞在
typ=user
count=10
speed=1.0
start data >>
LaunchActivity(com.example.zhangjian.mibirowser2, com.example.zhangjian.mibirowser2.MainAcitivity) //1
UserWait(2000)
DispatchPointer(10,10,0,100,100,1,1,-1,1,1,0,0) //2 按下,100器罐,100是xy坐標值梢为,通過UiautomatorView測試得出
DispatchPointer(10,10,1,100,100,1,1,-1,1,1,0,0) //2 彈起
DispatchString(test) // 3
UserWait(1000)
DispatchPree(66) // 4
UserWait(1000)
DispatchPointer(10,10,0,400,100,1,1,-1,1,1,0,0) //5 按下
DispatchPointer(10,10,1,400,100,1,1,-1,1,1,0,0) //5 彈起
UserWait(6000) // 6
DispatchPointer(10,10,0,300,100,1,1,-1,1,1,0,0) //7 按下
DispatchPointer(10,10,1,300,100,1,1,-1,1,1,0,0) //7 彈起
UserWait(3000)
保存文件為mook.script,以.script結尾的后綴名
將桌面的腳本傳輸?shù)绞謾C里轰坊,通過命令:adb push mook.script /data/local/tmp/
輸入adb shell 然后cd到/data/local/tmp/這個文件夾铸董;
輸入 monkey -f mook.script 2(次數(shù))
完成上述后會發(fā)現(xiàn)啟動的并不是我們想要啟動的app,而是一個超級用戶肴沫,這是為什么呢粟害?
? 因為app的本身AndroidManifest.xml文件中,主activity缺少一個android:exproted=“true”的屬性颤芬,沒有這個屬性那么app本身是不允許在外部被調起悲幅,也就是無法通過命令行來調起該activity.
MonkeyRunner
? MonkeyScript也存在缺點,它在執(zhí)行過程中無法實現(xiàn)截屏操作站蝠,有時候在進行自動化測試的過程中需要進行截屏汰具,這個時候MonkeyScript就無法滿足了。此時可以用MonkeyRunner來解決了菱魔。
- MonkeyRunner API - alert (python類型的腳本)
警告框留荔,用法:
? void alert(string message, string title, string okTitle)
實例:demo.py
from com.android.monkeyrunner import MonkeyRunner
MonkeyRunner.alert("Hello mook friends","this is title", "OK")
運行: monkeyrunner demo.py
- MonkeyRunner API - waitForConnection
等待設備連接,有多個device id澜倦, 需要指明具體哪個設備存谎。使用指令為:
? waitForConnection(float timeout, string deviceid)
- MonkeyRunner API - drag
拖動。在頁面實現(xiàn)拖動的這樣的一個操作肥隆,其使用指令如下:
? drag(tuple start, tuple end, float duration, integer steps)
start:拖動的起始點
end:拖動的結束位置
duration:手勢持續(xù)的時間
steps:插值點的步數(shù)既荚,默認10
- MonkeyRunner API - press
按鍵。使用操作如下:
? press(string keycode, dictionary type)
? keycode:名栋艳,Down恰聘,Up,DOWN_AND_UP
- MonkeyRunner API - startActivity
啟動應用。使用指令如下:
? startActivity(packageName+'/'+activity)
- MonkeyRunner API - touch
? 點擊晴叨。使用指令如下:
? touch(integer x, integer y, integer type)
? x,y: 坐標值
? type: DOWN, UP, DOWN_UP
-
MonkeyRunner API - type
輸入凿宾。使用指令如下:
?
type(string message)
-
MonkeyRunner API - takeSnapshot
截屏,這是MonkeyRunner提供的一個強大的操作兼蕊,其使用指令如下:
?
MonkeyImage takeSnapshot()
它會返回一個MonkeyImage類型的數(shù)據(jù)
-
MonkeyRunner API - sameAs
圖像對比初厚。如果需要對比兩幅圖像,其使用指令如下:
?
boolean sameAs(MonkeyImage other, float percent)
- MonkeyRunner API - writetoFile
保存圖像文件孙技,使用指令為:
? void writeToFile(string path, string format)
實例: 實現(xiàn)在搜索框中輸入查詢詞产禾,并截圖
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
# 連接設備
device = MonkeyRunner.waitForConnection(3,"192.168.56.101:5555") #"192.168.56.101:5555"為手機名稱,3代表操作時間3秒
# 啟動app
device.startAcitivyt("com.example.zhangjian.minibrowser2/com.example.zhangjian.minibrowser2.myapplication.MainActivity")
MonkeyRunner.sleep(2) #單位為秒
# 點擊搜索框
device.touch(100,100,"DOWN_AND_UP")
MonkeyRunner.sleep(1)
# 輸入查詢詞
device.type("test")
MonkeyRunner.sleep(1)
# 點擊回車鍵
device.press("KEYCODE_ENTER","DOWN_AND_UP")
MonkeyRunner.sleep(1)
# 點擊搜索按鈕
device.touch(400,100,"DOWN_AND_UP")
MonkeyRunner.sleep(6)
# 截圖
image = MonkeyImage.takeSnapshot()
image.writeToFile("./test.png","png")
# 點擊清除按鈕
device.touch(300,100,"DOWN_AND_UP")
MonkeyRunner.sleep(3)
?
?