Bluepill:LinkedIn開源的iOS并行UI測(cè)試工具
前不久,LinkedIn在官方博客介紹了該公司的***開源項(xiàng)目Bluepill。Bluepill使得開發(fā)人員可以在單一機(jī)器上同時(shí)用多種模擬器運(yùn)行iOS UI測(cè)試,目標(biāo)在于提供穩(wěn)定的測(cè)試工具和可擴(kuò)展的測(cè)試。
它的牛逼之處在于:
在一臺(tái)機(jī)器上同時(shí)啟動(dòng)多個(gè)iOS模擬器,自動(dòng)化運(yùn)行多個(gè)UI測(cè)試并給出每一個(gè)測(cè)試的測(cè)試報(bào)告。
更直觀點(diǎn),可以看官方的Demo截圖:
可以看到圖中足足同時(shí)運(yùn)行了12個(gè)模擬器,可以覆蓋目前幾乎所有主流iOS版本了。
為何研發(fā)Bluepill
LinkedIn的移動(dòng)團(tuán)隊(duì)在研發(fā)中提出過一個(gè)叫“3x3哲學(xué)”的理念,它意為設(shè)定目標(biāo)每天發(fā)布三次,在代碼提交到對(duì)團(tuán)隊(duì)成員可用之間不超過三個(gè)小時(shí)。這對(duì)持續(xù)交付提出了很大的挑戰(zhàn)。
UI測(cè)試作為持續(xù)交付的一部分,是非常耗時(shí)的,你通常需要測(cè)試所有主流系統(tǒng)版本之后才能發(fā)布。Bluepill就是為了解決這個(gè)問題而誕生的。
為了達(dá)成3x3的目標(biāo),Bluepill給出了兩個(gè)特性:
測(cè)試平臺(tái)的穩(wěn)定性,主要針對(duì)Xcode iOS模擬器的“古怪問題”,有時(shí)候測(cè)試失敗不是因?yàn)榇a有問題,而是模擬器不給力,跑不起來或卡住了。據(jù)LinkedIn統(tǒng)計(jì),他們所運(yùn)行的測(cè)試中有2%就屬于這種情況。
測(cè)試的可擴(kuò)展性。測(cè)試的并行運(yùn)行可同時(shí)覆蓋多種模擬環(huán)境,可擴(kuò)展性從根本上提供了這種能力。
Bluepill的黑魔法
之前,LinkedIn團(tuán)隊(duì)嘗試在Facebook開源的xctool的基礎(chǔ)上開發(fā)并行測(cè)試工具,結(jié)果xctool停止開發(fā)和維護(hù)了,LinkedIn的工程師在一番調(diào)研后忍痛放棄開始自研。
Bluepill借助于CoreSimulator解決穩(wěn)定性和可擴(kuò)展性問題。CoreSimulator是Apple的一個(gè)未公開的框架,它具有創(chuàng)建不同類型的設(shè)備模擬器、選擇運(yùn)行時(shí)版本、處理模擬器提供的通知等功能。在文章中作者提到,LinkedIn使用CoreSimulator實(shí)現(xiàn)了將Bluepill從Xcode模擬器中隔離出來,并使Bluepill可并行使用多種模擬器運(yùn)行測(cè)試。這里無需關(guān)心Xcode模擬器版本,因?yàn)閄code模擬器是一種隨每次Xcode的更新而不斷進(jìn)化的黑盒。
如何使用Bluepill
使用Bluepill非常簡(jiǎn)單,最簡(jiǎn)單的用例中,你在Xcode中將工程Build之后,可使用如下命令運(yùn)行Bluepill:
./bluepill -a ./Sample.app -s ./SampleAppTestScheme.xcscheme -o ./output/
這個(gè)命令將會(huì)啟動(dòng)四個(gè)模擬器,此外還有一些可以用來定制測(cè)試環(huán)境的選項(xiàng),包括使用模擬器的數(shù)量、運(yùn)行時(shí)環(huán)境、失敗測(cè)試時(shí)允許重試的次數(shù)、測(cè)試被卡住時(shí)的等待時(shí)間等。
Bluepill采用BSD-2許可在GitHub上開源提供。對(duì)于不打算自己從源代碼構(gòu)建的開發(fā)人員,Bluepill也提供了二進(jìn)制版本。
擴(kuò)展閱讀
LinkedIn為了研發(fā)Bluepill,在持續(xù)交付、UI測(cè)試上花了很大的功夫,你可以在他們的官方博客上閱讀相關(guān)文章:
- 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