Monkey工具之fastbot-iOS實踐

蟲師發表於2021-12-27

Monkey工具之fastbot-iOS實踐

背景

目前移動端App上線後 crash 率比較高, 尤其在iOS端。我們需要一款Monkey工具測試App的穩定性,更早的發現crash問題並修復。

去年移動開發者大會上有參加 fastbot 的分享,所以很自然的就想到Fastbot工具。

Fastbot-iOS安裝配置

準備工具

  • XCode: iOS開發IDE。
  • CocoaPads: 用來管理XCode依賴庫的專案。
  • Fastbot_iOS: github專案。
  • tidevice: iOS 自動化工具。
  1. 通過macOS應用商店下載XCode。

  1. 安裝cocoapods
> sudo gem install cocoapods -v=1.8.1
  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是專案下面的子目錄。

  1. 通過Xcode 開啟專案Fastbo-iOS專案。

https://github.com/bytedance/Fastbot_iOS

具體配置檢視github專案中的《中文手冊》,操作步驟非常詳細。

執行測試(XCode)

  1. 點選頂部FastbotRunner 彈出選單,選擇Edit Scheme... 選項。

Scheme中設定引數,參考表格:

欄位 說明 示例
BUNDLEID 被測試App的 Bundle ID com.apple.Pages
duration 測試時長,單位分鐘 240
throttle 操作間隔,單位毫秒 300
launchenv 啟動測試App的環境變數,一般為空,或者以 ':'分割的key=value形式 isAutoTestUI=1:=AutoTest
  1. 執行測試

點選testFastbot 按鈕,開始執行Monkey測試。你可以在手機端看到被測試App以及啟動,並開始自動執行操作。

執行測試(tidevice)

tidevice是阿里開源的iOS自動化測試工具,其實叫自動化工具有點不準確。他本質上有點像android 的 adb 工具,可以理解為PC與iOS之間的通訊工具。提供了一些非常有用的功能,檢視裝置資訊、安裝解除安裝應用,當然,最主要的是可以執行XCTest

github: https://github.com/alibaba/taobao-iphone-device

  1. 安裝tidevices
> pip install -U tidevice
  1. 使用tidevice檢查連線的裝置udid
> tidevice list
List of apple devices attached
xxxx-xxxxxxxxxxx iPhone USB
  1. 檢查是否安裝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。這一步極為重要。

  1. 通過tidevices 執行測試
> tidevice xctest -B bytedance.FastbotRunner.name.xctrunner -e BUNDLEID:com.apple.Pages -e duration:480 -e throttle:300  --debug

參考前面,Scheme引數說明。

遇到的問題

  1. fastbot是如何遍歷的?

這是我們想搞懂的一個問題,以便於看看是否有可配置的選項。

fastbot- 演算法原理

我們將頁面的 GUI 資訊抽象成模型中的 State,將執行的動作抽象成模型中的 Action,通過 State 作為圖的節點,Action 作為圖的邊,連線形成有向有環圖模型。遍歷決策想法上源於 Alphago 的蒙特卡洛搜尋樹的思想,此基礎上我們也使用了其他強化學習的方法,設計了 N 步 Q-Learning 演算法和基於頁面變化程度的 reward function,為頁面下每個 Action 計算出相應的 Q 值,基於 Q 值選取最優動作。
...
我們選擇使用好奇心強化學習的方法來解決獎勵稀疏問題,同時結合自然語言處理對頁面資訊做特徵抽象,在原有 reward function 基礎上增加好奇心(Curiosity)的 reward

上面摘自《奔跑吧!智慧Monkey之Fastbot跨平臺》 一文,所以不用做過多的人工配置或干預。隨著不斷執行App 的遍歷,也是不斷強化遍歷的工具的學習的過程。

  1. fastbot不識別元素或無法解析DOM tree怎辦?

這一點對我們尤為重要,因為我們的App中大量頁面是用flutter實現的,做傳統的UI自動化是非常麻煩。

在 Fastbot 低能耗、低耗時、高效能前提要求下,我們優先選用最基礎的影像處理技術來識別 GUI 介面資訊,可以在毫秒級完成構建一個頁面的資訊。

上面摘自《奔跑吧!智慧Monkey之Fastbot跨平臺》 一文, 強烈建議閱讀原文,多讀幾遍,受益匪淺。

  1. 如何同時執行多個裝置?

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
  1. 測出了崩潰怎麼辦?

我一開始想當然的以為測出了崩潰工具就停止唄,以至於我跑了兩天都以為工具沒發現崩潰。後來,在官方的微信群裡問過才知道,崩潰後重新啟動App繼續執行。直到設定的執行時間結束。

  1. 如何獲取崩潰報告?

這一步也很重要,總不能崩潰就崩潰了吧!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,帶走我~!

相關文章