iOS開源:Bluepill - Linkedin 的藍色藥丸
測試是3x3 策略里面的關鍵組成。隨著我們提高 iOS 持續交付流水線,我們面臨兩大難題:測試工具的穩定性和可擴展性。我們需要一個工具來把 iOS UI 測試跑的又快又可靠。因此,我們創建了一個項目,叫藍色藥丸,今天我們開源了這個項目。藍色藥丸是一個穩定的 iOS 測試工具,它可以在同一臺機器上的多個模擬器上運行 UI 測試。藍色藥丸為 Linkedin 節省了數以千計的小時。我們相信,它可以極大地幫助任何大規模運行 iOS UI 測試的人。
現有的限制
通常開箱即用的 iOS 測試工具主要有兩個限制:穩定性和擴展性。
穩定性
如同其他公司做大規模 iOS 開發和測試一樣,在處理 iOS 模擬器穩定性上,我們面臨了很多挑戰。我們在去年的一篇博文里闡述了我們是如何處理模擬器的碎片化,為了找出最優的解決方案,我們試驗了不同的環境配置。然而,由于 iOS 模擬器是一個黑盒,而且會隨著 Xcode 的升級而升級。我們逐漸意識到并只能接受,即使在某個版本,無論環境多健壯,仍舊無法避免模擬器升級之后帶來的變化和反復無常。
可擴展性
Xcode 一次只能運行一個模擬器。所以我們只能串行運行測試用例。我們有 2000 多的 UI 測試用例,串行運行需要花大概 15 小時。如果想在三小時內完成提交就發布的節奏,我們必須并行運行。
現有的解決方案
為了解決這些問題,我們找到了兩個現有方案,但是沒有一個能非常好的滿足我們的需求。
-
分發測試
我們先嘗試了把我們的 iOS UI 測試拆分成多個子集,然后分發給多個機器。在以前的文章 iOS Build Speed and Stability 中,我們提到過這個方案。但是這個方案有兩個問題:
- 穩定性: 我們 Mac 設備池的穩定性大約 98%。如果我們把測試分發給 10 臺設備,只有所有這 10 臺機器上的測試都通過,這個版本才算測試通過。由于每加一臺設備,遇到不確定失敗的場景就會指數級增加,所以工具的不確定性急劇惡化。當有10臺設備在跑用例的時候,可靠性就掉到了 98%*98%...(10次)約等于 82%。
- 容量需求: 使用硬件并行測試的第二個問題就是容量。在高峰期間(比如,午飯或者晚飯時候),我們有大約 80 個并發的持續集成的任務。要跑起來,就需要 800 臺機器。我們遇到這個問題時候,我們只有200臺機器。那么其他的任務只能排隊了。這個時候如果有開發提交代碼,那么他只能等幾個小時才能測試到。
-
九頭蛇項目(Hydra):一個多模擬器運行的 python 的封裝
后來有人建議在多個模擬器上并行運行用例來解決上面說的分發測試問題。非死book 的 xctool 和 Johannes 的 在多個模擬器運行 iOS 用例的概念 的給了我們靈感,我們搞了一個基于 xctool 的 python 封裝來在多個模擬器上運行用例。這個方案幫助我們搞定了持續交互的環境問題。但是我們還遇到了幾個問題:
- 基于 xctool :作為 iOS 測試工具,xctool 是非常棒的。然后 xctool 停止開發了,沒人維護了。我們只有兩個選擇:要么 fork 一個自己重構,要么做我們自己的測試工具。在做了一番調研之后,我們發現做一個在多個模擬器上運行測試工具并不難。
- 這僅僅是一個 xctool python 封裝 :基于 xctool 的 python 封裝無法訪問 CoreSimulator 的 API。如果不能直接和模擬器對話,就很難操控模擬器。
Introducing Bluepill
既然現有方案無法滿足我們的需求,我們決定自己搞。這個工具基于蘋果的 CoreSimulator 框架使用 Objective-C 寫的,我們叫他藍色藥丸,名字出自黑客帝國里的藍色藥丸,原來不是偉哥。。
藍色藥丸可以在多個模擬器上并行運行測試,主要特點如下:
- 在多個模擬器上并行運行測試
- 自動把差不多時間完成的測試打包成組
- 使用 headless 模式運行測試,減少內存消耗
- 生成 junit 的報告
- 實時報告測試狀態,包括測試速度和環境健康度
- 模擬器掛掉重試機制
看下我們的演示:
如何使用藍色藥丸,難道不是口服?
和口服一樣簡單迅速,我們就可以用起來了。最簡單的方法就是你只要運行下面的命令,就可以啟動4個模擬器來并行運行你的測試用例。運行結束之后,你就會在 ./output 目錄里找到測試報告:
./bluepill -a ./Sample.app -s ./SampleAppTestScheme.xcscheme -o ./output/
另外,你可以寫一個配置文件,使用命令: ./bluepill -c config.json 就可以跑起來了。具體就看這里吧—— https://github.com/linkedin/bluepill
開源
我們很高興的宣布,藍色藥丸開源了。開源證書是 BSD-2 clause。大家想來貢獻或者提建議的直接來我們的github,地址是: https://github.com/linkedin/bluepill 。歡迎大家來玩。
Acknowledgements
Bluepill was created by Ashit Gandhi , Jarek Rudzinski , Keqiu Hu , and Oscar Bonilla . It was inspired by parallel iOS test and 非死book’s xctool . The Bluepill icon was created by Maria Iu .
來自:https://testerhome.com/topics/7229