App穩定性測試


https://www.notion.so/App-0d9ed025434348d68700a8c30ac704f4

現在App普遍可以運行在后台,在用戶切換到的時候喚醒到前台,一方面可以避免不必要的冷啟動時間,另一方面可以持續接收服務端的推送。前后台運行時間加起來可以長達幾十小時,甚至幾百小時,所以對於App長時間使用的穩定性有了更高的要求,需要App穩定性測試來避免長時間運行下的偶發閃退、內存泄露、性能變差等等。通常App穩定性測試采用Monkey類的工具來長時間全自動遍歷App,並捕獲期間發生的穩定性問題。綜合各個Monkey方案的穩定性、可配置性、執行效率等多方面考慮,首選Maxim作為Monkey遍歷工具,通過Appetizer管理和配置Maxim提高方案試錯效率。穩定性測試方案有以下重點,本文將一一解答:

  • 如何配置Maxim提高遍歷效率
  • 如何評估自動遍歷的覆蓋率以及遍歷時間
  • 穩定性測試要捕獲什么,可以捕獲什么
  • 如何復現捕獲的問題/提穩定性Issue
  • 如何拓展穩定性測試,讓同樣的測試時間產出更大

基礎知識

Google 原生Monkey 是一個命令行工具,可以全自動隨機點擊屏幕,用來測試App穩定性等。Maxim 是 @zhangzhao_lenovo 修改自 monkey的高級版本,支持 Android 5.0-9.0、操作非常高速 (10-15事件/秒),穩定性高,可配置。 AppetizerIO提供了對Maxim的深度集成,使得配置更方便,配置管理更簡單。從Appetizer導航 -> 自動化測試 -> Maxim,最基本配置選好測試設備和測試APK即可開始測試。Maxim提供的配置有:

  • Maxim的遍歷模式,如圖

    https://testerhome.com/uploads/photo/2019/60e027f7-ac15-4303-8fbd-74e48cae6fba.png!large

  • Activity黑白名單,選擇待測APK后會出現選擇,下文有截圖

  • 測試時長,可以根據時間(分鍾)或者自動產生的事件數

  • max.xpath.actions 指定界面確定性步驟,例如登錄

  • max.widget.black 屏蔽某些界面的某些控件或者區域,例如屏蔽廣告區域

  • max.config 開啟定時截圖;調整啟動等待時間

  • 事件間延遲:兩次事件間隔的時間

  • Maxim事件日志

  • 數據采集和輸出路徑:Appetizer可以在測試過程中收集額外數據,例如Maxim日志、logcat,Battery Historian數據等等

如何配置Maxim提高遍歷效率

由於Monkey本質上是無腦交互,在實際使用中,很容易由於進入了一些App場景后在里面轉悠幾十分鍾都出不來,大大影響了遍歷效率。以下經驗和大家分享:

  1. 不要從全新安裝的App安裝開始遍歷 很多人的方案開頭就是自動adb安裝App,其實這樣效果很差,因為全新安裝后會出現大量的低頻新手教程、登錄、權限彈框等影響Maxim。而穩定性測試本質上是模擬老用戶長時間使用App的情況,所以應當已經完全登錄,新手流程已經全部過掉的情況下再開始Maxim。具體實施的時候有幾種選擇:a. 手工安裝app,登錄,過掉已知的新手教程 b. 始終不清除穩定性測試設備上app的數據,較新的開發版App可以更新安裝保持數據 c. 如果b不容易實現,可以試試 adb backup 和 adb restore 保存和復原 App數據

  2. 避免動態權限彈框 動態權限彈框也是影響Maxim執行的很大因素,各個廠商彈框不同,很難適配。因此在開始Maxim遍歷前,應當賦予App所有需要的權限,這步可以手工,也可以用adb pm grant <包名> <權限名>來自動實現。

  3. 關掉輸入法 遍歷過程中無可避免會點擊到各種輸入框,輸入法會彈起,一旦Maxim點擊到輸入法,例如某狗,某度輸入法,會導致非常多不可預料的情況,比如輸入法廣告彈框,錄音彈框等等。而且Maxim遍歷時如果要輸入內容,也是直接輸入並非通過輸入法,所以輸入法是一個純干擾,最簡單的方式就是在開始遍歷前關掉輸入法,結束后再開啟。具體實現時,安裝Appium Keyboard(也就是啥也沒有),然后 通過adb shell ime 來設置輸入法

  4. 黑名單屏蔽Activity和控件Maxim提供了兩個級別的禁止遍歷黑名單,可以通過配置直接禁止進入某些Activity,也可以通過配置屏蔽指定Activity上的區域(xpath或者坐標范圍)。Activity黑名單原理是截獲切換的Intent直接不發,Appetizer提供的圖形化方案可以非常簡單地設置Activity黑名單:屏蔽的規則很簡單,一般屏蔽一切非App業務的第三方推送、第三方支付、第三方登錄、分享、掃碼、人臉識別、圖片/文件選擇器、人工客服。而區域屏蔽則更為精細,應當屏蔽三方登錄按鈕區域、付費選擇、廣告、分享按鈕等一切能夠切出App或者需要人工/攝像頭的功能點。登錄和支付業務不應該在穩定性測試中出現,應該是登錄專項和支付業務用例里。max.widget.black配置項是一個數組,每一項一條屏蔽規則,規則很容易懂,指定某個Activity以及需要屏蔽的控件的xpath,或者屏幕像素區域bounds或者有多個符合xpath條件的控件條件下增加index表示第幾項

    https://testerhome.com/uploads/photo/2019/f85e864e-ea64-4ad5-8031-07121cee0a99.png!large

    https://testerhome.com/uploads/photo/2019/7fb4d171-2725-4beb-883c-ab081a10c08c.png!large

  5. 調整事件比例Maxim MIX模式下默認會有30%完全隨機事件(屏幕任意位置亂點、滑動、任意物理按鍵) + 70%界面元素解析后的元素級交互,在用於App穩定性測試過程中,比例應當根據App特性進行調整。Maximw從Google原生Monkey改來,完全兼容Monkey的參數,如下:

    • --pct-touch <percent> 為單擊事件百分比

    • --pct-motion <percent> 為滑動事件百分比(方向、長度和速度隨機)

    • --pct-trackball <percent> 隨機滾動后點擊事件百分比

    • --pct-nav <percent> 上下左右滑動事件

    • --pct-majornav <percent> 回退、home、最近三鍵

    • --pct-syskeys <percent> 系統按鍵,標准三鍵+音量等

    • --pct-appswitch <percent> 切換App 實際使用中,非0項目應該為 --pct-touch --pct-motion --pct-majornav,其中touch可以低一些,因為畢竟有元素級別touch亂點沒有特別大的意義;motion可以高一點,彌補Maxim不會滑動的缺陷;majornav中等,保證有一定量的回退;推薦使用5,20,10;

      https://testerhome.com/uploads/photo/2019/0b9993cf-7ca1-40d8-97ce-c9c43956b26a.png!large

  6. 多個配置結合配置不可能一蹴而就,也不用糾結在單個配置上。可以分幾次跑,每次入口的Activity不一樣,然后參數不一樣來達到綜合做好的情況。例如主界面有多個主業務入口,可以每個主業務入口Activity用一套配置,每套配置里面把主界面黑名單掉,這樣就不會回退回來。Appetizer存取多個配置:

    https://testerhome.com/uploads/photo/2019/56a56a81-58d5-496f-9fa1-cb0a17959c62.png!large

  7. 處理表單類界面表單類界面即有多個輸入框,然后按鈕,而按鈕成功要求多個輸入框滿足一個驗證條件,例如都要有內容。表單類界面是Maxim和Monkey類工具非常不適合的一種界面,隨機能夠滿足驗證條件的概率極低,基本沒有探索價值。可以直接黑名單,或者通過 max.xpath.actions 配置項直接填寫。

    https://testerhome.com/uploads/photo/2019/d0ff280f-eb71-4e7d-a5d6-f67146bf485d.png!large

如何評估自動遍歷的覆蓋率以及遍歷時間

覆蓋率大致方向有兩個,Jacoco(代碼行覆蓋)和Activity覆蓋率,Jacoco需要 源代碼接入,完全落地需要一定時間。在配置初期,並不用太強調代碼行覆蓋率,畢竟Maxim有一定的隨機性,多次跑可能導致不同的結果。在配置初期,可以以Activity覆蓋率作為主要參考,力求盡量覆蓋到可以自動化遍歷的業務Activity。Activity覆蓋率獲取方式有兩種:如果APK經過Appetizer插樁,每次Maxim運行后都會有Appetizer插樁數據報告,里面有Activity覆蓋率以未覆蓋的Activity名單;如果沒有插樁,可以用Appetizer保存Maxim運行產生的stdout,然后自行parse進入過的Activity。

https://testerhome.com/uploads/photo/2019/e96a1123-d91c-4877-9439-242f2804a502.png!large

當配置優化后,同時Jacoco方案已經成熟的情況下,可以評估一次完整的穩定性測試的代碼行覆蓋情況。一般來說行覆蓋率不會很高,原因有幾個部分 1. Jacoco統計分母是所有的class,有很多三方代碼和庫代碼是dead code實際不會執行,除非Jacoco分析的時候就去掉的這些 2. 畢竟Maxim遍歷沒有邏輯性,很多和數據相關的代碼塊並不能有效進入 3. 單機型運行的話,有些安卓版本特殊的代碼也會遺漏;總體來說,行覆蓋僅僅做參考,配置優化能增加就是好事,不必苛求一個具體百分比目標。

遍歷時間並不是越長越好,因為執行初期對覆蓋率提升非常有效,而后期大量的時間對兩種覆蓋率的提升都是非常有限。另一方面來說,遍歷時長太久大大增加了收集到的數據量,影響分析效率,也會引入不必要穩定性坑。應當多花費時間優化配置,幫助Maxim省去非常多的不可控性和徒勞遍歷,一般一套優化過的配置,只需要20分鍾到1個小時即可。

穩定性測試要捕獲什么,可以捕獲什么

  1. crash, ANR

    • Maxim會自動log疑似App crash的情況,結果將保存在 /sdcard/maxim-output/crash.log,注意這些只是疑似情況
    • Appetizer插樁后的App會捕獲crash ANR,在報告中
  2. 主線程卡頓

  3. http 請求4xx 5xx,以及高延遲的情況

  4. 截圖Maxim支持每次執行事件后截圖,還支持保存頁面控件結構(XML),截圖上會有事件點擊的紅點標注,方便發現問題后回溯到具體場景,具體字max.config里開啟,如下圖。注意,截圖保存在 /sdcard/max-output 目錄,長時間運行會占據大量的存儲控件,確保每次運行前用Appetizer下載上次的截圖結果,並刪除

    https://testerhome.com/uploads/photo/2019/e26cc137-3ba8-44f0-9299-a2829b73a743.png!large

如何拓展穩定性測試,讓同樣的測試時間產出更大

很多時候第一次引入穩定性測試后會發現一些問題,積極性會比較高,隨着時間推移,問題會發現越來越少,換個方面考慮是App低級錯誤越來越少,這時候會面臨繼續投入穩定性測試的質疑,這方面有幾點:

  1. 穩定性測試和回歸是一樣的,是守門員,非前鋒,目標是攔截不是預言,
  2. 自動遍歷其實會高速發出UI事件,對App性能也是一個考驗,所以自然可以收集並分析性能數據,在穩定性測試的框架上分析性能瓶頸。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM