《Android App壓力測試》慕課網課程筆記

為什么要開展壓力測試?

? 提高產品的穩定性。

什么時候開展壓力測試?

? 首輪功能測試通過后。

? 下班后的夜間進行。

什么是Monkey?

? Monkey是發送偽隨機用戶事件的工具。

Monkey在哪里?

? 在手機系統里。

什么是MonkeyScript?

? MonkeyScript是一組可以被Monkey識別的命令集合。

? MonkeyScript可以完成重復固定的操作。

MonkeyRunner是什么?

? MonkeyRunner提供了一系列的API

? MonkeyRunner可以完成模擬事件以及截圖操作。

Monkey和MonkeyRunner的區別?

? Monkey: 在adb shell中,生成用戶或系統的偽隨機事件。

? MonkeyRunner: 通過API定義特定命令和事件控制設備。

MonkeyRunner APIs包含什么?

? MonkeyRunner:用來連接設備或模擬器。

? MonkeyDevices: 提供安裝、卸載應用,發送模擬事件

? MonkeyImage: 完成圖像保存,及對比的操作

MonkeyRunner的測試類型?

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

壓力結果

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

一個App的壓測實踐

  1. 在手機開發者選項中,將USB調試選上(部分機型還需要打開可以通過USB安裝APP)
  2. 確認手機和電腦已經成功連接,通過adb devices命令
  3. 安裝測試App,通過命令行adb install packageName.apk
  4. 發送壓力指令 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 高級參數的應用

  1. throttle 參數

    指定事件之間的間隔

    ? adb shell monkey --throttle <millisenconds>

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

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

    ? 指定隨機生成數的seed值,Monkey的隨機操作都是基于seed值產生的,因此使用同一個seed值就會有統一的操作序列。操作指令如下:

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

    例如:adb shell monkey -s 100 50

  1. 觸摸事件

    設置觸摸事件百分比。Monkey只需要完成點擊事件的時候可以用本參數來設置。操作指令為:

    ? adb shell monkey -pct-touch <percent>

    例如:adb shell monkey -v -p com.android.calculator2 --pct-touch 100 10

    • -v 參數可以顯示執行的操作
    • -p 允許添加包名作為參數
  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. 系統導航事件

    設定系統導航事件百分比,HOME、BACK、撥號及音量鍵

    adb shell monkey --pct-syskeys <percent>

  6. 啟動Activity事件

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

    adb shell monkey --pct-appswitch <percent>

  7. 不常用事件

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

    adb shell monkey --pct-anyevent <percent>

  8. 崩潰事件

    忽略崩潰和異常,即在發生崩潰和異常情況下,繼續進行壓力測試。

    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(指定數)

CRASH結果析取

實踐過程:

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

ANR結果析取

  1. 安裝可以引起ANR的app

  2. 執行壓力命令

  3. 析取ANR的Exception信息

    如果是手動的觸發的ANR信息,可以先輸入adb shell進入手機,然后cd /data/anr文件夾下面有日志記錄,找到該ANR即可。自動化的可以直接在命令后面加 > log.log 即可輸出到文件。

Monkey Script

? 重復操作序列100次的需求時,通過MonkeyScript可以實現。執行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:指的事件,發生的事件
    • <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)

? 參數含義如上。

  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. 將桌面的腳本傳輸到手機里,通過命令:adb push mook.script /data/local/tmp/

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

  4. 輸入 monkey -f mook.script 2(次數)

完成上述后會發現啟動的并不是我們想要啟動的app,而是一個超級用戶,這是為什么呢?

? 因為app的本身AndroidManifest.xml文件中,主activity缺少一個android:exproted=“true”的屬性,沒有這個屬性那么app本身是不允許在外部被調起,也就是無法通過命令行來調起該activity.

MonkeyRunner

? MonkeyScript也存在缺點,它在執行過程中無法實現截屏操作,有時候在進行自動化測試的過程中需要進行截屏,這個時候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

拖動。在頁面實現拖動的這樣的一個操作,其使用指令如下:

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

start:拖動的起始點

end:拖動的結束位置

duration:手勢持續的時間

steps:插值點的步數,默認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類型的數據


  1. MonkeyRunner API - sameAs

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

    ? boolean sameAs(MonkeyImage other, float percent)


  1. MonkeyRunner API - writetoFile

保存圖像文件,使用指令為:

? void writeToFile(string path, string format)


實例: 實現在搜索框中輸入查詢詞,并截圖

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)

?

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374