[iOS單元測試系列]單元測試框架選型

這段時間在團隊里一直在負責對單元測試的探索和落地腥例,感覺有必要總結(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方法的佳魔。OCMockOCMockito個人感覺功能區(qū)別不大。他們之間的區(qū)別在于使用OCMock的庫比OCMockito的庫多晦炊,而且文檔和教程更加豐富鞠鲜。大家可以打開OCMock官網(wǎng)看一下。所以個人選擇我選了OCMock作為我們的測試mock工具断国。

Expecta Or OCHamcrest

ExpectaOCHamcrest這兩個都是斷言的擴展框架贤姆。一開始我選擇了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是我認為最好的框架方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窘哈,一起剝皮案震驚了整個濱河市吹榴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滚婉,老刑警劉巖图筹,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異让腹,居然都是意外死亡远剩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門骇窍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓜晤,“玉大人,你說我怎么就攤上這事腹纳×÷樱” “怎么了驱犹?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長足画。 經(jīng)常有香客問我雄驹,道長,這世上最難降的妖魔是什么锌云? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任荠医,我火速辦了婚禮,結(jié)果婚禮上桑涎,老公的妹妹穿的比我還像新娘彬向。我一直安慰自己,他們只是感情好攻冷,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布娃胆。 她就那樣靜靜地躺著,像睡著了一般等曼。 火紅的嫁衣襯著肌膚如雪里烦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天禁谦,我揣著相機與錄音胁黑,去河邊找鬼。 笑死州泊,一個胖子當著我的面吹牛丧蘸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遥皂,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼力喷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了演训?” 一聲冷哼從身側(cè)響起弟孟,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎样悟,沒想到半個月后拂募,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窟她,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年陈症,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片礁苗。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬凑,死狀恐怖徙缴,靈堂內(nèi)的尸體忽然破棺而出试伙,到底是詐尸還是另有隱情嘁信,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布疏叨,位于F島的核電站潘靖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚤蔓。R本人自食惡果不足惜卦溢,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秀又。 院中可真熱鬧单寂,春花似錦、人聲如沸吐辙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昏苏。三九已至尊沸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贤惯,已是汗流浹背洼专。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孵构,地道東北人屁商。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像浦译,于是被迫代替她去往敵國和親棒假。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容