Monkey工具之fastbot-iOS實踐


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,帶走我~!


免責聲明!

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



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