你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> [iOS單元測試系列]單元測試框架選型

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

編輯:IOS開發基礎

0.jpg

這段時間在團隊裡一直在負責對單元測試的探索和落地,感覺有必要總結下自己這段時間的探索成果和大家分享。加之已經忙的很久沒寫博客了,感覺沒有沉澱,這樣不好。iOS單元測試系列會一直更新,按主題將我在單元測試探索和落地過程中的技術積累沉澱下來,也算是對自己這段時間的總結。部分觀點是我個人觀點,歡迎大家討論。

一開始接到的不是單元測試的任務,而是與測試同學共建完成iOS上持續集成能跑測試用例的平台。然後我就吭哧吭哧的區研究Jenkins,後來發現不對,就算我把平台搭建好了沒有測試用例也只是個空殼子,而應該合理分工,測試同學負責搭建平台,開發負責寫測試用例。

XCTest Or GHUnit

寫測試用例總得有個框架吧,現在比較流行的就屬Apple自帶的XCTest和第三方的GHUnit。我們來看看他兩之間的區別。 XCTest:與Xcode深度集成。而且可以享受Apple後續對XCTest升級的福利。 GHUnit:集成度不如XCTest,安裝麻煩。但是有自己的GUI界面。 貌似都各有所長,那麼我們來看看Github上的一些知名的開源庫都用的是什麼測試框架吧。

1430897407541113.png

可以看到清一色的被XCTest刷屏了。也的確,GHUnit的GUI界面對我們來說沒有什麼特別大的意義。而XCTest血統純正,背後站著東家Apple。而對於我們的選擇也應該是XCTest,應該既然Github上又這麼多XCTest的case例子可以參考,對我們的幫助肯定不言而喻。

OCMock Or OCMockito

這兩個都是用來mock對象,stub方法的。OCMock 和 OCMockito個人感覺功能區別不大。他們之間的區別在於使用OCMock的庫比OCMockito的庫多,而且文檔和教程更加豐富。大家可以打開OCMock官網看一下。所以個人選擇我選了OCMock作為我們的測試mock工具。

Expecta Or OCHamcrest

Expecta和OCHamcrest這兩個都是斷言的擴展框架。一開始我選擇了Expecta,因為我後來有一段時間將測試文件用BDD框架Specta來寫(當然這是後話),而Expecta 和Specta都出自同一個人之手,不論是教程文檔都更加豐富。但是後來我廢棄了BDD框架,還是用原生的XCTest,Expecta在使用中也遇到了一些問題,我就把我們的斷言框架由Expecta切換到了OCHamcrest。

原因有兩點:

1.Expecta不成熟,至筆者切換的時候才0.3.1版本,遇到很多框架自身的問題。case跑著跑著驗證通不過了,再跑一次又過了,是不是還爆出個Expecta框架內部的crash。

2.OCHamcrest更加成熟,而且可擴展性高,可以自定義自己的斷言,更靈活。

比如OCHamcrest不支持superClass驗證,我們必須自己去比較,返回一個bool值,然後去判斷bool是否為真。很麻煩。自己自定義個superClass的驗證,就不需要每次都這麼麻煩的寫這麼多代碼了。而如果Expecta不支持的斷言,那就永遠不能支持了。 我們可以通過OCHamcrest這個特性,做一些符合自己app場景的特有斷言。

BDD Or Not

BDD的全稱是Behavior Driven Development。也就是行為驅動開發。BDD確實讓我眼前一亮。他能將測試語言寫成類似自然語言。BDD的理念是你不是在寫代碼,而是在講故事。而整個故事是由Given…When…Then組成。我們可以來看看BDD框架Kiwi的一段測試代碼:

describe(@"Team", ^{
    context(@"when newly created", ^{
        it(@"has a name", ^{
            id team = [Team team];
            [[team.name should] equal:@"Black Hawks"];
        });
        it(@"has 11 players", ^{
            id team = [Team team];
            [[[team should] have:11] players];
        });
    });
});

這個測試用例就是在說Given a Team,When newly created,it should have a name, and should have 11 players。 的確很清晰,基本不需要注釋就能知道在干嘛了。 既然BDD這麼好,那麼我們比較下BDD框架Kiwi和XCTest + OCMock組合的優劣吧。為什麼是XCTest + OCMock而不是XCTest,因為Kiwi自帶mock功能,而XCTest沒有mock功能。

1430897491256397.png

可以看出Kiwi還是蠻誘人的。但是Kiwi的mock功能api遠沒有OCMock設計的好,尤其是OCMock3推出後,所以筆者想把Kiwi和OCMock一起用,結果這兩個庫存在不兼容性。一跑就掛。後來遷移到BDD另一個框架Specta,BDD的理念相同,所以語法也大同小異。Specta和Kiwi的區別就是Kiwi包含了Specta和OCmock以及Expeata所有的功能。換句話說Specta就是沒有mock和驗證功能的kiwi。但是想對來說,specta的API設計更加合理。

但是,高潮來了!後續我還是廢棄了BDD,切換回XCTest,原因有很多。主要的原因是BDD框架hold不住業務的發展,BDD的講故事理念在業務面前就是老太太的裹腳布,又臭又長!而且BDD需要一定的學習成本,不像XCTest這種類JUnit的對開發者更友好的代碼。而且BDD的框架包裝過深,可擴展性不高。還有就是BDD的框架普遍太年輕,bug相對較多,版本迭代太快。最最致命的是BDD的框架不能單個case單個跑,一跑所有的case全部跑一邊這在平時寫case 的時候是非常拖沓的!

總結

也沒啥好總結的。一個個坑踩下來,最後的選擇是XCTest + OCMock + OCHamcrest是我認為最好的框架方案。當然,這是我的個人觀點~

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved