這段時間在團隊里一直在負責對單元測試的探索和落地腥例,感覺有必要總結(jié)下自己這段時間的探索成果和大家分享。加之已經(jīng)忙的很久沒寫博客了,感覺沒有沉淀原朝,這樣不好。iOS單元測試系列會一直更新镶苞,按主題將我在單元測試探索和落地過程中的技術(shù)積累沉淀下來喳坠,也算是對自己這段時間的總結(jié)。部分觀點是我個人觀點茂蚓,歡迎大家討論壕鹉。
一開始接到的不是單元測試的任務(wù),而是與測試同學共建完成iOS上持續(xù)集成能跑測試用例的平臺聋涨。然后我就吭哧吭哧的區(qū)研究Jenkins晾浴,后來發(fā)現(xiàn)不對,就算我把平臺搭建好了沒有測試用例也只是個空殼子牍白,而應(yīng)該合理分工脊凰,測試同學負責搭建平臺,開發(fā)負責寫測試用例茂腥。
XCTest Or GHUnit
寫測試用例總得有個框架吧狸涌,現(xiàn)在比較流行的就屬Apple自帶的XCTest和第三方的GHUnit切省。我們來看看他兩之間的區(qū)別。 XCTest:與Xcode深度集成帕胆。而且可以享受Apple后續(xù)對XCTest升級的福利朝捆。 GHUnit:集成度不如XCTest,安裝麻煩懒豹。但是有自己的GUI界面芙盘。 貌似都各有所長,那么我們來看看Github上的一些知名的開源庫都用的是什么測試框架吧歼捐。
可以看到清一色的被XCTest刷屏了何陆。也的確,GHUnit的GUI界面對我們來說沒有什么特別大的意義豹储。而XCTest血統(tǒng)純正贷盲,背后站著東家Apple。而對于我們的選擇也應(yīng)該是XCTest剥扣,應(yīng)該既然Github上又這么多XCTest的case例子可以參考巩剖,對我們的幫助肯定不言而喻。
OCMock Or OCMockito
這兩個都是用來mock對象钠怯,stub方法的佳魔。OCMock和OCMockito個人感覺功能區(qū)別不大。他們之間的區(qū)別在于使用OCMock的庫比OCMockito的庫多晦炊,而且文檔和教程更加豐富鞠鲜。大家可以打開OCMock官網(wǎng)看一下。所以個人選擇我選了OCMock作為我們的測試mock工具断国。
Expecta Or OCHamcrest
Expecta和OCHamcrest這兩個都是斷言的擴展框架贤姆。一開始我選擇了Expecta,因為我后來有一段時間將測試文件用BDD框架Specta來寫(當然這是后話)稳衬,而Expecta 和Specta都出自同一個人之手霞捡,不論是教程文檔都更加豐富。但是后來我廢棄了BDD框架薄疚,還是用原生的XCTest碧信,Expecta在使用中也遇到了一些問題,我就把我們的斷言框架由Expecta切換到了OCHamcrest街夭。
原因有兩點:
1.Expecta不成熟砰碴,至筆者切換的時候才0.3.1版本,遇到很多框架自身的問題板丽。case跑著跑著驗證通不過了衣式,再跑一次又過了,是不是還爆出個Expecta框架內(nèi)部的crash。
2.OCHamcrest更加成熟碴卧,而且可擴展性高弱卡,可以自定義自己的斷言,更靈活住册。
比如OCHamcrest不支持superClass驗證婶博,我們必須自己去比較,返回一個bool值荧飞,然后去判斷bool是否為真凡人。很麻煩。自己自定義個superClass的驗證叹阔,就不需要每次都這么麻煩的寫這么多代碼了挠轴。而如果Expecta不支持的斷言,那就永遠不能支持了耳幢。 我們可以通過OCHamcrest這個特性岸晦,做一些符合自己app場景的特有斷言。
BDD Or Not
BDD的全稱是Behavior Driven Development睛藻。也就是行為驅(qū)動開發(fā)启上。BDD確實讓我眼前一亮。他能將測試語言寫成類似自然語言店印。BDD的理念是你不是在寫代碼冈在,而是在講故事。而整個故事是由Given…When…Then組成按摘。我們可以來看看BDD框架Kiwi的一段測試代碼:
12345678910111213
describe(@"Team",^{context(@"when newly created",^{it(@"has a name",^{idteam=[Teamteam];[[team.nameshould]equal:@"Black Hawks"];});it(@"has 11 players",^{idteam=[Teamteam];[[[teamshould]have:11]players];});});});
這個測試用例就是在說Given a Team,When newly created,it should have a name, and should have 11 players包券。 的確很清晰,基本不需要注釋就能知道在干嘛了炫贤。 既然BDD這么好溅固,那么我們比較下BDD框架Kiwi和XCTest + OCMock組合的優(yōu)劣吧。為什么是XCTest + OCMock而不是XCTest照激,因為Kiwi自帶mock功能,而XCTest沒有mock功能盹牧。
可以看出Kiwi還是蠻誘人的俩垃。但是Kiwi的mock功能api遠沒有OCMock設(shè)計的好,尤其是OCMock3推出后汰寓,所以筆者想把Kiwi和OCMock一起用口柳,結(jié)果這兩個庫存在不兼容性。一跑就掛有滑。后來遷移到BDD另一個框架Specta跃闹,BDD的理念相同,所以語法也大同小異。Specta和Kiwi的區(qū)別就是Kiwi包含了Specta和OCmock以及Expeata所有的功能望艺。換句話說Specta就是沒有mock和驗證功能的kiwi苛秕。但是想對來說,specta的API設(shè)計更加合理找默。
但是艇劫,高潮來了!后續(xù)我還是廢棄了BDD惩激,切換回XCTest店煞,原因有很多。主要的原因是BDD框架hold不住業(yè)務(wù)的發(fā)展风钻,BDD的講故事理念在業(yè)務(wù)面前就是老太太的裹腳布顷蟀,又臭又長!而且BDD需要一定的學習成本骡技,不像XCTest這種類JUnit的對開發(fā)者更友好的代碼鸣个。而且BDD的框架包裝過深,可擴展性不高哮兰。還有就是BDD的框架普遍太年輕毛萌,bug相對較多,版本迭代太快喝滞。最最致命的是BDD的框架不能單個case單個跑阁将,一跑所有的case全部跑一邊這在平時寫case 的時候是非常拖沓的!
總結(jié)
也沒啥好總結(jié)的右遭。一個個坑踩下來做盅,最后的選擇是XCTest + OCMock + OCHamcrest是我認為最好的框架方案。