Android 自動化測試及效能資料採集的 Python 指令碼

Charming本尊發表於2018-05-29

寫在前面

本文主要介紹一個基於 uiautomator2 封裝的一個 Pythonandroid-catcher,該庫的功能主要有對 Android 裝置進行 UI 自動化測試採集手機效能資料,適用於如列表滑動、錄製視訊等各種測試場景下 CPU、記憶體、幀率等資訊的捕獲,方便後續分析。 Github地址:https://github.com/CharmingW/android-catcher

安裝

安裝 Python

自動化測試的指令碼是用 Python 3 寫的,要執行指令碼需要先安裝 Python 3 環境
下載地址: Python 3.6.5

安裝 android-catcher 依賴

開啟指令碼目錄執行以下命令,安裝依賴

pip install -r requirements.txt
複製程式碼

Usage

uiautomator2 的使用方式

安裝完 uiautomator2 之後,一般只需要執行以下命令對裝置進行初始化,在裝置上安裝 uiautomator2 服務

python -m uiautomator2 init
複製程式碼

出現以下提示則表示安裝成功

uiautomator初始化成功

更多的 uiautomator2 的使用方式可參考:https://github.com/openatx/uiautomator2

指令碼檔案說明

這個指令碼庫根目錄下主要的檔案有

  • info.py:手機效能資訊採集的指令碼,其中定義了父類 Info,已實現的子類有 CPUInfo(CPU資訊)、MemInfo(記憶體資訊)、FPSInfo(幀率資訊)、NetInfo(網路流量資訊),使用者可以從 Info 派生子類來實現自己的採集需求
  • task.py:測試場景的指令碼,其中定義了父類 Task,因為沒有固定的測試場景,因此使用者需要從 Task 派生子類並重寫 Task#execute 方法來自定義的測試場景,自定義方式可參考:https://github.com/openatx/uiautomator2
  • info_task.py:測試場景和採集資訊靈活結合的指令碼,使用者不需要用到
  • utils.py:工具方法指令碼
  • _main_.py:任務執行的入口指令碼,當沒有具體的測試場景,只是想採集指定時間段的資訊,直接執行該指令碼

引數說明

  • -s:必選引數,指定裝置號,可通過 adb devices 獲取
  • -a:必選引數,要測試程式的 applicationId
  • -f:可選引數,取樣間隔,單位為秒,不建議設定太短,最好是大於 0.1s,預設是 1s
  • -d:可選引數,取樣持續時間,預設為10s
  • -i:可選引數,需要採集的資訊,可以設定多個,目前可選的有四個,分別為 cpu、mem、fps、net,用 "," 隔開,如 -i cpu,mem,fps,net
  • -o:可選引數,採集到的資訊的輸出目錄,如 "." 表示當前指令碼所在的目錄,預設為 "."

生成檔案說明

採集到的資訊根據資訊型別分別存放在指定輸出目錄的 cpu_stats、mem_stats、fps_stats、net_stats 四個子目錄下,檔名為 資訊型別_裝置號_applicationId_版本號_測試場景名_時間戳,如 cpu_d3c2edaa_video.like_RecordVideo_1.9.9_1524122928.csv.csv,實際效果大致如下圖

image

輸出檔案為 csv 檔案,直接開啟和用 Excel 開啟的效果分別如下圖

image

image
另外可以為測試的每個階段新增一個節點說明

task.period = "idle"
複製程式碼

生成類似如下的圖

image

無自定義測試場景的使用方式

適用於沒有具體測試場景,在指令碼執行之後一段時間內都處於採集狀態的情況,持續時間可以通過配置引數指定,過程中使用者可以隨意操作手機。通過命令列直接執行 _main_.py 指令碼檔案,並指定相關引數 比方說我要採集 applicationId 為 video.like 這個應用 10s 內的 cpu 資訊和記憶體資訊,取樣間隔為 200ms,輸出目錄為當前目錄,那麼可以在指令碼所在的目錄執行以下命令

python _main_.py -s 裝置號-a video.like -f 0.2 -d 10 -i mem,cpu -o .
複製程式碼

指令碼執行結束之後可以在根目錄下看到如下圖所示的檔案生成

image

注:要帶 -d 引數,指定採集的持續時間,否則指令碼預設執行 10s,並且無需 -t 引數,預設測試場景名為 Random

自定義測試場景的使用方式

自定義測試場景不能直接呼叫 _main_.py 指令碼,需要建立新的指令碼,繼承 task.py#Task 並重寫 Task#execute 方法,在 Task#execute 中實現自定義測試場景的邏輯,如下圖所示:

image

這裡建立了名為 start_app.py 的指令碼,執行命令:

python start_app.py -s 裝置號-a 程式名 -f 0.1 -i cpu,mem -o .
複製程式碼

就可以啟動對應的 APP,並採集 CPU 資訊和記憶體資訊,取樣間隔為 100ms,輸出到當前目錄。注意這裡沒有了 -d 引數,因為採集的持續時間以測試任務的持續時間的持續時間為準,設定的引數一定要按照說明來,否則不能採集到資料 如果想採集自定義的資訊,可以繼承 info.py#Info 並重寫 Info#get_start_infoInfo#get_end_info 方法,可參考已實現的四種資訊採集的寫法,最後通過 Task#add_info 方法新增。

自定義好測試場景之後,呼叫 _main_#main 方法,傳入測試場景例項,測試場景的名稱會作為輸出檔案命名的一部分,這裡最好取能準確表達測試場景的名稱,如某個 APP 錄製視訊測試場景的名稱為 RecordVideo 採集到的資訊可通過 Excel 製成圖表,以下是完整錄製視訊這個測試場景的 CPU 佔比和記憶體的變化

image
image
通過圖表可以直觀分析應用不同版本和不同場景下的效能狀況

寫在最後

以上就是該庫的一些使用介紹。由於工作經驗尚淺,Python 也是現學現用,在寫這個庫時,可能會有許多考慮不周或不完善的地方,有能力的小夥伴可以直接修改該庫,以實現更多自定義功能,另外也希望大家能多用,多發現問題,歡迎 issue,歡迎 star,有新的使用需求和想法也歡迎提出,後續會不斷完善,感謝!
Github地址:github.com/CharmingW/a…

相關文章