本內容由以下幾部分組成:
iOS Monkey介紹
工具介紹
環境搭建
代碼實現
iOS Monkey介紹
一款系統或者軟體是否穩定,我們需要對其進行穩定性測試,業內用的比較多的工具就是Monkey工具。
1、Android Monkey介紹
Monkey,猴子,小淘氣。Monkey工具,可以解釋為像猴子或者小淘氣一樣任性的操作工具。
Android平臺自帶有monkey工具,所以日常我們可以很方便的使用命令來使用monkey工具。那麼android的monkey工具在運行當中究竟發生了什麼呢?
其實,它是向Android系統或裝在Android系統上的軟體發送偽隨機的用戶事件流,純坐標的,用以模仿用戶的動作(屏幕點擊、屏幕滑動和觸控螢幕輸入等)進行操作Android設備,對Android設備或者運行在Android上的軟體進行穩定性測試。
但是,相比純坐標式的點擊,解析控制項樹,從而從控制項的角度去隨機點擊,這樣可以提高測試效率。例如Maxim這款針對原生monkey工具的二次開發,就屬於解析控制項樹層面的monkey工具。
2、iOS Monkey介紹
ios平臺有沒有自帶的monkey工具呢,沒有!但是因為ios的使用用戶眾多,所以各大網際網路企業陸陸續續的開發出一些比較好的工具,如Apple的uiautomator框架和xctest框架,Facebook的webdriverAgent框架,淘寶的tidevice和Facebook的idb等,基於這些工具,聰明的工程師們開發了一些類monkey工具用以輔助對運行在iOS設備上的應用進行穩定性測試。
以下是幾款相對較好的ios端穩定性 Monkey測試工具:
基於上圖,就能發現,這些工具基本都是基於XCTest和WDA來實現的,但是普遍問題是更新維護不及時,甚至是已經停止維護很久。
3、Fastbot-ios
工具研發麵臨的首要問題是對ios新版兼容開發成本巨大,特別是涉及WDA(WebDriverAgent,提供了某些跨進程App調度和獲取控制項樹的能力)私有接口的兼容,往往面臨等待Facebook解決WDA的兼容後才能著手展開。但是如今Facebook已經放棄了對WDA的後續兼容,轉向idb研發(類似於安卓中的adb工具,但在真機上存在穩定性問題尚無法完全替代WDA,WDA目前已由Appium以社區形式接手繼續迭代。)
除了兼容性問題,ios獲取GUI頁面信息的能力也需要關注,上面多款Monkey工具都集成了解析GUITree控制項樹的能力,相比於純坐標點擊,其優勢在於基於控制項解析的操作效率上要高很多,例如多次點擊幾個坐標很可能都是在同一個控制項區域內反覆操作;另外擁有控制項解析能力後,就可以定製某些行為樹或控制項屏蔽的配置機制來豐富工具的能力;同時相對來說控制項解析速度實際上也是考量的一個重要指標,作為壓力測試工具,我們肯定不希望10秒鐘才點擊一次,相反希望其擁有控制項解析能力的同時,速度上接近基於坐標的事件產生的速度。
而選擇fastbot-ios,卻是因為這一款工具自從發布就引起了業內廣泛的關注。它是字節跳動Quality Lab這個部門開發的,其擁有Android和ios兩個版本。在Android端,被融合了機器學習和算法,大大的強化了穩定性測試,且其算法已被解耦,也就是ios端也可以使用機器學習和算法,而且持續在更新優化中,最可喜的是它可以輔助其他工具擺脫xcode運行,後續日誌等功能開發也在排期中。
工具介紹
工具的核心是字節跳動的fastbot-ios,幫助我們可以擺脫MAC從而在Windows上運行的是淘寶的tidevice,達到一鍵觸發測試的是自己使用python封裝的執行文件。
1、fastbot-ios的介紹
1.1、控制項解析
上一章有介紹,許多工具都放棄低效的純坐標點擊,轉而使用解析GUITree控制項樹,從而達到基於控制項的隨機操作。但是這些工具基本上使用的是XCUITest或者WDA dump GUITree遞歸解析GUITree控制項樹,這裡它有一個問題,在複雜的頁面下這樣的遞歸會引起資源佔用問題,這樣會引起比較高的概率中斷和手機發熱問題。在這裡,字節跳動放棄了常規的解析頁面的方式,轉而僅依賴一個XCUITest的截屏接口進行跨平臺的圖像結構化編碼技術,從而達到了頁面的解析。
1.2、算法
算法的融合是這款工具最強大的地方
A、基於狀態的探索與利用
遍歷時,選擇當前State下對應Value最大的Action,選擇能夠帶來最大Value加成的Action。比如下圖StateA狀態下,可以採取的Action有3個,但是Action2帶來的Value最大,所以最終Agent進入StateA狀態時,就會選擇Action2。(當然,在強化學習訓練開始時,Value值是不知道的,我們一般都默認為0。然後讓Agent不斷去嘗試各類Action,不斷與環境交互,最終Value值會趨向於一個穩定的數字,才能得出特定State下,選擇某個Action,會得到怎樣的Value)
B、獎勵稀疏問題
在遍歷過程中獎勵(reward)往往是十分稀疏的,選擇使用好奇心強化學習的方法,同時結合自然語言處理對頁面信息做特徵抽象,在原有的reward function基礎上增加了好奇心(Curiosity)的reward,這樣就可以隨著模型變得「博學」,最後達到工具對測試覆蓋達到比較明顯的效果,尤其是前期。如下圖:
reward計算不添加Curiosity、只提供Curiosity都比原reward疊加Curiosity效果略差。
C、測試經驗復用
考慮到每次遍歷時間並非固定,不同APP情況也不同,當遍歷時間較短時,訓練就可能存在不充分的情況。所以將每次訓練完的模型也進行持久化保存,在下次測試前會先加載上次的模型繼續訓練,這樣「地圖」也就越來越全了。
1.3、日誌
iOS設備的日誌收集一直是比較麻煩的事,但是Fastbot-ios已經把日誌相關內容提上日程。
1.4、可測性提升
以下功能暫時還未開放出來,後續會陸陸續續的給出配置方法:
A、場景限定
能夠將測試局限於APP的某一個場景下,可以進入到該場景的任意子頁面,如果
退出該場景Fastbot-ios會立即重新進入限定的場景頁面。
B、屏蔽跳轉
屏蔽QQ,微信,淘寶等其他所有第三方跳轉。
C、自動登錄
從帳號池中獲取指定類型帳號並自動完成登錄。
2、tidevice的介紹
Android有adb,其實ios也有一個類似的工具---idb,但是目前還不夠穩定,還沒有tidevice強大。tidevice是阿里淘寶團隊開源的一個內部使用的ios自動化工具,那麼tidevice可以做什麼:
a、設備信息獲取
b、應用安裝、卸載、啟動、停止、查看應用信息、已安裝應用列表
c、啟動WebDriverAgent(不依賴xcode)
d、運行XCTest
e、性能數據採集
f、設備截圖、設備日誌等
詳細如下圖:
3、使用python相關介紹
一直以來,ios自動化的實現和執行都依賴MAC,其主要原因是因為需要通過xcode編譯和安裝WDA到ios設備中,然後在xcode上通過WDA實現對被測應用進行操作。直到出現了tidevice,讓ios的自動化脫離MAC成為一種可能。
在這裡使用python的目的主要是借用tidevice,對相關數值的獲取,最終達到可以一鍵啟動Windows上的ios設備進行穩定性測試,與此同時收集當前ios設備日誌。
環境搭建
通過上文知道,要想在Windows上一鍵啟動對ios設備的穩定性測試,其需要fastbot-ios的支持,需要tidevice的支持。
使用tidevice啟動連接在Windows上的ios設備命令是:tidevice xctest -B bytedance.FastbotRunner.xctrunner -e BUNDLEID:com.lianjia.beike -e duration:99999 -e throttle:500
我們可以發現命令需要使用的有tidevice、xctest和fastbot-ios。
1、安裝tidevice
A、安裝python
tidevices是依賴python的,需要安裝python3.6以上的版本地址:
https://www.python.org/downloads/windows/
安裝好以後,在dos窗口輸入python -V
如果像上圖一樣,返回python的版本,即可確定python已經安裝好了。
B、安裝tidevice
安裝python的一個庫,可以使用pip安裝:
pip3 install -U "tidevice[openssl]"
如果安裝失敗,可以試試pip3 install -U tidevice
安裝好以後,在dos窗口輸入tidevice -v
如果像上圖一樣,返回tidevice的版本,即可證明tidevice已經安裝好了。
2、安裝驅動
此時在dos窗口輸入tidevice list,你會發現會報一個10061的錯:
ConnectionRefusedError:[WinError 10061] 由於目前計算機積極拒絕,無法連接。
這是因為什麼呢?因為電腦的ios驅動沒有安裝:Apple Mobile Device Support
我們安裝一個apple官方的工具iTunes就行,安裝好以後在dos窗口再次輸入tidevice
list,就會正常的返回如下圖所示的內容:
如果需要在win7上面安裝可以去雲盤裡下載老版本的iTunes: https://pan.baidu.com/s/1shwC0ZmAN2qG2A8J7ZtQMw 提取碼: 464n
3、安裝xctest
從前文知道,我們使用命令啟動穩定性測試是需要用到xctest的,而其核心是通過xctest裡面的截圖功能接口來獲取GUITree的。
建議使用appium維護的包,Facebook的包沒有繼續維護了,可能存在其他問題,appium維護的包的路徑:https://github.com/appium/WebDriverAgent/tree/v2.16.1
A、下載到本地以後,進入WebDriverAgent-master裡面,再雙擊「WebDriverAgent.xcodeproj」
B、連接好設備以後,點擊如下圖所示的開始按鈕
C、當手機桌面出現了如下圖所示的圖標,即代表打包安裝成功
詳情可以參考:https://www.jianshu.com/p/2645776367d3(關注《WebdriverAgent項目編譯》)
4、安裝fastbot-ios
Fastbot-ios下載地址:https://github.com/bytedance/Fastbot_iOS
A、下載到本地以後,進入Fastbot_iOS-master裡面,再雙擊「Fastbot-iOS.xcodeproj」
B、連接好設備以後,點擊如下圖所示的開始按鈕
C、當手機桌面出現了如下圖所示的圖標,即代表打包安裝成功
詳情請參考:
https://github.com/bytedance/Fastbot_iOS/blob/main/Doc/handbook-cn.md
代碼實現
我們的最終目的是Windows上一鍵啟動針對ios設備的穩定性測試,那麼代碼究竟要如何實現呢?
從上文知道使用tidevice組合的命令,即可啟動針對ios設備上的「貝殼找房」這款APP的穩定性測試:
1、獲取參數
2、執行穩定性測試
3、獲取日誌
這裡獲取日誌是通過tidevice syslog獲取到的手機系統log。
4、保存日誌
5、保活和停止
備註:這裡的fastbotRunner就與Android裡面的monkey.jar是類似的
6、多線程處理
一邊處理跑穩定性測試的業務,一邊處理獲取系統日誌的業務,還需要一邊處理保存系統日誌的業務,在這裡引入多線程。
當穩定性測試的時間到了(或者關停止穩定性測試),即可停止測試(子線程和主線程都銷毀)。
引用資料:
https://github.com/bytedance/Fastbot_iOS
https://github.com/alibaba/taobao-iphone-device