《Android App壓力測試》慕課網(wǎng)課程筆記

為什么要開展壓力測試?

? 提高產(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的測試類型柴信?

  1. 多設備控制
  2. 功能測試
  3. 回歸測試

壓力結果

  1. CRASH:即崩潰,應用程序在使用過程中宽气,非正常退出随常。
  2. ANR: Application Not Responding

一個App的壓測實踐

  1. 在手機開發(fā)者選項中,將USB調試選上(部分機型還需要打開可以通過USB安裝APP)
  2. 確認手機和電腦已經(jīng)成功連接萄涯,通過adb devices命令
  3. 安裝測試App绪氛,通過命令行adb install packageName.apk
  4. 發(fā)送壓力指令 adb shell monkey 1000 (1000個指令的意思,具體是什么)
  5. 獲取APP包名 adb logcat|grep START
    • logcat是輸入手機中一些app的log信息涝影;
    • | 代表管道的意思枣察,將前一個命令的輸出作為后一個命令的輸入
    • grep START 抓取包含有START的log信息輸出
    • 也可以輸入以下命令獲取設備安裝的所有包名:
      • adb shell pm list packages
  6. 給指定的包打壓力 adb shell monkey -p packageName 1000

Monkey 高級參數(shù)的應用

  1. throttle 參數(shù)

    指定事件之間的間隔

    ? adb shell monkey --throttle <millisenconds>

    例如: adb shell monkey -p com.android.calculator2 --throttle 1000 10

    • 1000: 代表的是事件
    • 10: 代表的是指令數(shù)
  1. seed參數(shù)

    ? 指定隨機生成數(shù)的seed值,Monkey的隨機操作都是基于seed值產(chǎn)生的,因此使用同一個seed值就會有統(tǒng)一的操作序列序目。操作指令如下:

    ? adb shell monkey -s <seed> <event-count>

    例如:adb shell monkey -s 100 50

  1. 觸摸事件

    設置觸摸事件百分比臂痕。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ù)
  1. 動作事件

    設置動作事件的百分比猿涨;即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%即可事镣。

  2. 軌跡球事件

    設定軌跡球事件百分比召调;

    adb shell monkey --pct-trackball <percent>

  3. 基本導航事件

    設定基本導航事件百分比,輸入設備的上蛮浑、下唠叛、左、右的導航

    adb shell monkey --pct-nav <percent>

  4. 主要導航事件

    設定主要導航事件百分比沮稚,兼容中間鍵艺沼、返回鍵、菜單鍵

    adb shell monkey --pct-majornav <percent>

  5. 系統(tǒng)導航事件

    設定系統(tǒng)導航事件百分比蕴掏,HOME障般、BACK、撥號及音量鍵

    adb shell monkey --pct-syskeys <percent>

  6. 啟動Activity事件

    設定啟動Activity的事件百分比盛杰,它會在已有的activity中切換挽荡,假設設置為30%,有4個Activity即供,則它會在這四個總隨機切換并且占總操作數(shù)的百分之30%

    adb shell monkey --pct-appswitch <percent>

  7. 不常用事件

    設定不常用事件的百分比定拟;跟以上的事件不是一類的事件

    adb shell monkey --pct-anyevent <percent>

  8. 崩潰事件

    忽略崩潰和異常,即在發(fā)生崩潰和異常情況下逗嫡,繼續(xù)進行壓力測試青自。

    adb shell monkey --ignore-crashes <event-count>

  9. 超時事件

    忽略超時事件,

    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結果析取

實踐過程:

  1. 安裝可以引起CRASH的App
  2. 執(zhí)行壓力命令
  3. 析取CRASH的Exception信息

ANR結果析取

  1. 安裝可以引起ANR的app

  2. 執(zhí)行壓力命令

  3. 析取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>

  1. 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:超出了屏幕的范圍
  2. 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ù)含義如上缎除。

  1. DispatchString命令

? 輸入字符串事件

? DispatchString(String text)

  1. LaunchActivity命令

    啟動應用

    LaunchActivity(package, Activity)

    1. UserWait命令

      等待事件

      UserWait(1000) // 毫秒

    2. DispatchPress命令

      按下鍵值

      DispatchPress(int keycode) # keycode 66 回車鍵

實例:在搜索框輸如查詢詞

  1. 啟動App
  2. 點擊輸入框
  3. 輸入查詢詞
  4. 點擊鍵盤上的回車
  5. 點擊搜索按鈕
  6. 等待結果的輸出
  7. 點擊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)
  1. 保存文件為mook.script,以.script結尾的后綴名

  2. 將桌面的腳本傳輸?shù)绞謾C里轰坊,通過命令:adb push mook.script /data/local/tmp/

  3. 輸入adb shell 然后cd到/data/local/tmp/這個文件夾铸董;

  4. 輸入 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來解決了菱魔。


  1. 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


  1. MonkeyRunner API - waitForConnection

等待設備連接,有多個device id澜倦, 需要指明具體哪個設備存谎。使用指令為:

? waitForConnection(float timeout, string deviceid)


  1. MonkeyRunner API - drag

拖動。在頁面實現(xiàn)拖動的這樣的一個操作肥隆,其使用指令如下:

? drag(tuple start, tuple end, float duration, integer steps)

start:拖動的起始點

end:拖動的結束位置

duration:手勢持續(xù)的時間

steps:插值點的步數(shù)既荚,默認10


  1. MonkeyRunner API - press

按鍵。使用操作如下:

? press(string keycode, dictionary type)

? keycode:名栋艳,Down恰聘,Up,DOWN_AND_UP


  1. MonkeyRunner API - startActivity

啟動應用。使用指令如下:

? startActivity(packageName+'/'+activity)


  1. MonkeyRunner API - touch

? 點擊晴叨。使用指令如下:

? touch(integer x, integer y, integer type)

? x,y: 坐標值

? type: DOWN, UP, DOWN_UP


  1. MonkeyRunner API - type

    輸入凿宾。使用指令如下:

    ? type(string message)


  1. MonkeyRunner API - takeSnapshot

    截屏,這是MonkeyRunner提供的一個強大的操作兼蕊,其使用指令如下:

    ? MonkeyImage takeSnapshot() 它會返回一個MonkeyImage類型的數(shù)據(jù)


  1. MonkeyRunner API - sameAs

    圖像對比初厚。如果需要對比兩幅圖像,其使用指令如下:

    ? boolean sameAs(MonkeyImage other, float percent)


  1. 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)

?

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末牵啦,一起剝皮案震驚了整個濱河市亚情,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哈雏,老刑警劉巖楞件,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裳瘪,居然都是意外死亡土浸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進店門彭羹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栅迄,“玉大人,你說我怎么就攤上這事皆怕∫阌撸” “怎么了?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵愈腾,是天一觀的道長憋活。 經(jīng)常有香客問我,道長虱黄,這世上最難降的妖魔是什么悦即? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮橱乱,結果婚禮上辜梳,老公的妹妹穿的比我還像新娘。我一直安慰自己泳叠,他們只是感情好作瞄,可當我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著危纫,像睡著了一般宗挥。 火紅的嫁衣襯著肌膚如雪乌庶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天契耿,我揣著相機與錄音瞒大,去河邊找鬼。 笑死搪桂,一個胖子當著我的面吹牛透敌,可吹牛的內容都是我干的。 我是一名探鬼主播踢械,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼酗电,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裸燎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤泼疑,失蹤者是張志新(化名)和其女友劉穎德绿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體退渗,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡移稳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了会油。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片个粱。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翻翩,靈堂內的尸體忽然破棺而出都许,到底是詐尸還是另有隱情,我是刑警寧澤嫂冻,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布胶征,位于F島的核電站,受9級特大地震影響桨仿,放射性物質發(fā)生泄漏睛低。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一服傍、第九天 我趴在偏房一處隱蔽的房頂上張望钱雷。 院中可真熱鬧,春花似錦吹零、人聲如沸罩抗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澄暮。三九已至名段,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泣懊,已是汗流浹背伸辟。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馍刮,地道東北人信夫。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像卡啰,于是被迫代替她去往敵國和親静稻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,500評論 2 348