Bluepill:LinkedIn開源的iOS并行UI測試工具
前不久,LinkedIn在官方博客介紹了該公司的***開源項目Bluepill。Bluepill使得開發人員可以在單一機器上同時用多種模擬器運行iOS UI測試,目標在于提供穩定的測試工具和可擴展的測試。
它的牛逼之處在于:
在一臺機器上同時啟動多個iOS模擬器,自動化運行多個UI測試并給出每一個測試的測試報告。
更直觀點,可以看官方的Demo截圖:
可以看到圖中足足同時運行了12個模擬器,可以覆蓋目前幾乎所有主流iOS版本了。
為何研發Bluepill
LinkedIn的移動團隊在研發中提出過一個叫“3x3哲學”的理念,它意為設定目標每天發布三次,在代碼提交到對團隊成員可用之間不超過三個小時。這對持續交付提出了很大的挑戰。
UI測試作為持續交付的一部分,是非常耗時的,你通常需要測試所有主流系統版本之后才能發布。Bluepill就是為了解決這個問題而誕生的。
為了達成3x3的目標,Bluepill給出了兩個特性:
測試平臺的穩定性,主要針對Xcode iOS模擬器的“古怪問題”,有時候測試失敗不是因為代碼有問題,而是模擬器不給力,跑不起來或卡住了。據LinkedIn統計,他們所運行的測試中有2%就屬于這種情況。
測試的可擴展性。測試的并行運行可同時覆蓋多種模擬環境,可擴展性從根本上提供了這種能力。
Bluepill的黑魔法
之前,LinkedIn團隊嘗試在Facebook開源的xctool的基礎上開發并行測試工具,結果xctool停止開發和維護了,LinkedIn的工程師在一番調研后忍痛放棄開始自研。
Bluepill借助于CoreSimulator解決穩定性和可擴展性問題。CoreSimulator是Apple的一個未公開的框架,它具有創建不同類型的設備模擬器、選擇運行時版本、處理模擬器提供的通知等功能。在文章中作者提到,LinkedIn使用CoreSimulator實現了將Bluepill從Xcode模擬器中隔離出來,并使Bluepill可并行使用多種模擬器運行測試。這里無需關心Xcode模擬器版本,因為Xcode模擬器是一種隨每次Xcode的更新而不斷進化的黑盒。
如何使用Bluepill
使用Bluepill非常簡單,最簡單的用例中,你在Xcode中將工程Build之后,可使用如下命令運行Bluepill:
./bluepill -a ./Sample.app -s ./SampleAppTestScheme.xcscheme -o ./output/
這個命令將會啟動四個模擬器,此外還有一些可以用來定制測試環境的選項,包括使用模擬器的數量、運行時環境、失敗測試時允許重試的次數、測試被卡住時的等待時間等。
Bluepill采用BSD-2許可在GitHub上開源提供。對于不打算自己從源代碼構建的開發人員,Bluepill也提供了二進制版本。
擴展閱讀
LinkedIn為了研發Bluepill,在持續交付、UI測試上花了很大的功夫,你可以在他們的官方博客上閱讀相關文章:
- https://engineering.linkedin.com/blog/2017/01/open-sourcing-bluepill--run-ios-tests-in-multiple-simulators
- https://engineering.linkedin.com/blog/2015/12/managing-ios-continuous-integration-at-enterprise-scale
- https://engineering.linkedin.com/blog/2016/04/3x3--ios-build-speed-and-stability
- https://engineering.linkedin.com/blog/2015/12/test-stability---how-we-make-ui-tests-stable