Monkey工具之fastbot-iOS實踐
背景
目前移動端App上線後 crash 率比較高, 尤其在iOS端。我們需要一款Monkey工具測試App的穩定性,更早的發現crash問題並修復。
去年移動開發者大會上有參加 fastbot 的分享,所以很自然的就想到Fastbot工具。
Fastbot-iOS安裝配置
準備工具
- XCode: iOS開發IDE。
- CocoaPads: 用來管理XCode依賴庫的專案。
- Fastbot_iOS: github專案。
- tidevice: iOS 自動化工具。
- 通過macOS應用商店下載XCode。
- 安裝cocoapods
> sudo gem install cocoapods -v=1.8.1
- 克隆
fastbot_iOS
專案,並初始化
> git clone https://github.com/bytedance/Fastbot_iOS
> cd Fastbot_iOS
> cd Fastbot-iOS && pod install --repo-update
Fastbot_iOS
是克隆的專案目錄,Fastbot-iOS
是專案下面的子目錄。
- 通過Xcode 開啟專案
Fastbo-iOS
專案。
https://github.com/bytedance/Fastbot_iOS
具體配置檢視github專案中的《中文手冊》,操作步驟非常詳細。
執行測試(XCode)
- 點選頂部
FastbotRunner
彈出選單,選擇Edit Scheme...
選項。
在Scheme
中設定引數,參考表格:
欄位 | 說明 | 示例 |
---|---|---|
BUNDLEID | 被測試App的 Bundle ID | com.apple.Pages |
duration | 測試時長,單位分鐘 | 240 |
throttle | 操作間隔,單位毫秒 | 300 |
launchenv | 啟動測試App的環境變數,一般為空,或者以 ':'分割的key=value形式 | isAutoTestUI=1:=AutoTest |
- 執行測試
點選testFastbot
按鈕,開始執行Monkey測試。你可以在手機端看到被測試App以及啟動,並開始自動執行操作。
執行測試(tidevice)
tidevice是阿里開源的iOS自動化測試工具,其實叫自動化工具有點不準確。他本質上有點像android 的 adb
工具,可以理解為PC與iOS之間的通訊工具。提供了一些非常有用的功能,檢視裝置資訊、安裝解除安裝應用,當然,最主要的是可以執行XCTest
。
github: https://github.com/alibaba/taobao-iphone-device
- 安裝tidevices
> pip install -U tidevice
- 使用tidevice檢查連線的裝置udid
> tidevice list
List of apple devices attached
xxxx-xxxxxxxxxxx iPhone USB
- 檢查是否安裝
FastbotRunner-Runner
App。
> tidevice ps --json
[
{
"pid": 11549,
"name": "FastbotRunner-Runner",
"bundle_id": "bytedance.FastbotRunner.name.xctrunner",
"display_name": "FastbotRunner-Runner"
},
]
前參考前面fastbot-iOS《中文手冊》,他會詳細說明如何在手機上安裝
FastbotRunner-Runner
APP。這一步極為重要。
- 通過
tidevices
執行測試
> tidevice xctest -B bytedance.FastbotRunner.name.xctrunner -e BUNDLEID:com.apple.Pages -e duration:480 -e throttle:300 --debug
參考前面,Scheme引數說明。
遇到的問題
- fastbot是如何遍歷的?
這是我們想搞懂的一個問題,以便於看看是否有可配置的選項。
fastbot- 演算法原理
我們將頁面的 GUI 資訊抽象成模型中的 State,將執行的動作抽象成模型中的 Action,通過 State 作為圖的節點,Action 作為圖的邊,連線形成有向有環圖模型。遍歷決策想法上源於 Alphago 的蒙特卡洛搜尋樹的思想,此基礎上我們也使用了其他強化學習的方法,設計了 N 步 Q-Learning 演算法和基於頁面變化程度的 reward function,為頁面下每個 Action 計算出相應的 Q 值,基於 Q 值選取最優動作。
...
我們選擇使用好奇心強化學習的方法來解決獎勵稀疏問題,同時結合自然語言處理對頁面資訊做特徵抽象,在原有 reward function 基礎上增加好奇心(Curiosity)的 reward
上面摘自《奔跑吧!智慧Monkey之Fastbot跨平臺》 一文,所以不用做過多的人工配置或干預。隨著不斷執行App 的遍歷,也是不斷強化遍歷的工具的學習的過程。
- fastbot不識別元素或無法解析DOM tree怎辦?
這一點對我們尤為重要,因為我們的App中大量頁面是用flutter實現的,做傳統的UI自動化是非常麻煩。
在 Fastbot 低能耗、低耗時、高效能前提要求下,我們優先選用最基礎的影像處理技術來識別 GUI 介面資訊,可以在毫秒級完成構建一個頁面的資訊。
上面摘自《奔跑吧!智慧Monkey之Fastbot跨平臺》 一文, 強烈建議閱讀原文,多讀幾遍,受益匪淺。
- 如何同時執行多個裝置?
tidevice的作者給了答案,通過裝置的udid
號區分就可以了。當你的PC連線多個手機時。
> tidevice list
List of apple devices attached
xxxx-xxxxxxxxxxx iPhone USB
yyyy-yyyyyyyyyyy iPhone USB
- 啟動x裝置
> tidevice -u xxxx-xxxxxxxxxxx xctest -B bytedance.FastbotRunner.name.xctrunner -e BUNDLEID:com.apple.Pages -e duration:480 -e throttle:300 --debug
- 啟動y裝置
> tidevice -u yyyy-yyyyyyyyyyy xctest -B bytedance.FastbotRunner.name.xctrunner -e BUNDLEID:com.apple.Pages -e duration:480 -e throttle:300 --debug
- 測出了崩潰怎麼辦?
我一開始想當然的以為測出了崩潰工具就停止唄,以至於我跑了兩天都以為工具沒發現崩潰。後來,在官方的微信群裡問過才知道,崩潰後重新啟動App繼續執行。直到設定的執行時間結束。
- 如何獲取崩潰報告?
這一步也很重要,總不能崩潰就崩潰了吧!monkey的執行過程我們又無法復現。我一開始以為日誌藏在tidevice
中,因為他執行的過程(加--debug
引數)中會列印大量的日誌。我又沒辦法把這個日誌寫到檔案中(命令結尾加 > log.txt
無用),花了半天時間改 tidevice
的程式碼,在logger的地方寫檔案。
後來,發現這麼做沒有卵用!tidevice/fastbot
相當於是指令的發出者,他只會說:“我傳送了一條指令哦!” 這樣的廢話,至於 App 接收到指令後是否執行,是否引起崩潰,無法給到 tidevice/fastbot
工具。
但是,作者說fastbot
工具可以整合報告。
https://github.com/bytedance/Fastbot_iOS/issues/2
我覺得,他也只是說說,因為這是8月份的問題,當然這麼好用的工具願意開源就很好了,不要不知好歹。可能他又有別的KPI要忙~!
那麼,我們的App是有整合firebase
的SDK,如果App崩潰,那麼會上報日誌到firebase
平臺,可以在firebase
平臺上統計分析。
這是我最近一週的實踐經驗,希望能幫到你!我是蟲師,關注
測試圈TC
,帶走我~!