iOS9每天多了解一點(diǎn)5:Xcode Code Coverage Tools
Code coverage 是一個(gè)計(jì)算你的單元測(cè)試覆蓋率的工具。高水平的覆蓋給你的單元測(cè)試帶來(lái)信心,也表明你的應(yīng)用被徹底的測(cè)試過(guò)了。你可能寫(xiě)了幾千個(gè)單元測(cè)試,但如果覆蓋率不高,那么你寫(xiě)的這套測(cè)試可能價(jià)值也不大。
這里并沒(méi)有一個(gè)確切的百分比,要求你必須到達(dá)這個(gè)覆蓋率。這很大程度上取決于你的項(xiàng)目(的具體情況)。譬如說(shuō),如果你的項(xiàng)目中有很多不能寫(xiě)單元測(cè)試的視覺(jué)組件,那么覆蓋率就會(huì)比單純處理數(shù)據(jù)的框架要低的多。
Code Coverage in Xcode
在過(guò)去,如果你想要制作一個(gè)測(cè)試的代碼覆蓋報(bào)告出來(lái),需要設(shè)置很多[選項(xiàng)]。非常復(fù)雜,還有許多需要手動(dòng)設(shè)置。在 iOS 9中,蘋(píng)果提供了智能的代碼覆蓋工具,他是和 LLVM 一體的,每次運(yùn)行測(cè)試都會(huì)被調(diào)用和計(jì)算。
Using the Code Coverage Tools
現(xiàn)在我們用一個(gè)例子來(lái)展示,如何使用新的 code coverage 工具和怎樣提升現(xiàn)在的測(cè)試用例。完成后的代碼放在了 Github 上,你可以跟著做。
***件事是創(chuàng)建一個(gè)新項(xiàng)目,并確認(rèn)你選上了Unit tests選項(xiàng)。這會(huì)按要求創(chuàng)建一個(gè)默認(rèn)項(xiàng)目,現(xiàn)我們需要測(cè)試點(diǎn)什么。這個(gè)測(cè)試可能是你的任意需求,這里我添加一個(gè)空的 swift 文件,里面寫(xiě)好了一個(gè)全局的方法。這個(gè)方法檢測(cè)兩個(gè)字母串是否是僅排序不同的相同字母組成的詞。寫(xiě)成全局的方法,可能不是好的設(shè)計(jì),但這里我們僅演示一下。
這是一個(gè)相對(duì)簡(jiǎn)單的方法,所以我們可能會(huì)得到一個(gè)沒(méi)有任何問(wèn)題的,100%覆蓋的測(cè)試覆蓋率。

check word
一旦你寫(xiě)好了算法,就該寫(xiě)個(gè)測(cè)試了。打開(kāi)項(xiàng)目創(chuàng)建時(shí)已經(jīng)創(chuàng)建好了的默認(rèn)的XCTestCase,添加一個(gè)下面的簡(jiǎn)單的測(cè)試方法。他看起來(lái)是這樣子的。

tests
在運(yùn)行測(cè)試之前,我們必須先確認(rèn) code coverage 是否被打開(kāi)了,寫(xiě)代碼時(shí),默認(rèn)是關(guān)閉的。所以你需要編輯一下你的測(cè)試 scheme,把它打開(kāi)。

turn on coverage
確保"Gather coverage data"是被選中的,然后點(diǎn)擊關(guān)閉按鈕,運(yùn)行測(cè)試的 target. 我們希望剛剛創(chuàng)建的測(cè)試用例能夠順利通過(guò)。
The Coverage Tab
一旦這個(gè)測(cè)試通過(guò)了,你就能知道 checkWord 這個(gè)方法,至少有一條路徑是對(duì)的。但你不知道的是,還多多少?zèng)]有被測(cè)試到。這就是code coverage這個(gè)工具的好處。當(dāng)你打開(kāi)code coverage tab后,你可以清楚的看到測(cè)試的覆蓋情況。他們按找 target, file, function 進(jìn)行了自動(dòng)分組。
打開(kāi)Xcode左邊窗口的Report Navigator面板,選中你剛運(yùn)行的測(cè)試。然后在tab中選中 Coverage。

test coverage panel
這會(huì)展示一個(gè)你的類(lèi)、方法的列表,并標(biāo)示出每個(gè)的測(cè)試覆蓋率。如果你將鼠標(biāo)懸停在checkWord這個(gè)方法上,你可以看到測(cè)試的覆蓋率是28%。不能接受啊!我們需要找到,那些代碼分支是能夠被測(cè)試執(zhí)行,那些是不能的,進(jìn)而改善他們。雙擊方法的名字,Xcode會(huì)打開(kāi)類(lèi)的代碼,并且看到code coverage的情況。

coverage result
白色的區(qū)域表示這些代碼時(shí)測(cè)試覆蓋過(guò)的。灰色區(qū)域時(shí)測(cè)試無(wú)法覆蓋的,我們需要添加更多的測(cè)試用例來(lái)覆蓋灰色部分的代碼。在右手邊的數(shù)字,表明這些代碼塊,在這次測(cè)試中被執(zhí)行的次數(shù)。
Improving Coverage
很顯然,28%的覆蓋率不是我們的目標(biāo)。這里沒(méi)有 UI,看起來(lái)是個(gè)***的編寫(xiě)測(cè)試用例的候選function。所以,我們添加一個(gè)測(cè)試用例。理想情況下,我們希望每個(gè)分支都能被測(cè)試到。這樣就能達(dá)到完整的覆蓋。添加下面的測(cè)試用例到你的測(cè)試類(lèi)中。

test cases
這些測(cè)試用例應(yīng)該能夠完全覆蓋我們的代碼了。運(yùn)行一下單元,然后打開(kāi)***一個(gè)測(cè)試報(bào)告。

the final coverage result
我們成功了,100%的覆蓋率。你可以看到整個(gè)代碼都變成了白色,右面的數(shù)字也展示了每個(gè)代碼段至少被執(zhí)行了一次。
使用code coverage是一個(gè)非常棒的方式,幫你建立真正有價(jià)值的測(cè)試組合。遠(yuǎn)好于你寫(xiě)了很多測(cè)試用例,但沒(méi)有真正測(cè)試到代碼。Xcode 7 讓這種方式變的非常簡(jiǎn)單,我推薦你在項(xiàng)目中開(kāi)啟 Code Coverage。即使你已經(jīng)寫(xiě)好了測(cè)試,也可以幫你知道到底測(cè)試寫(xiě)的怎么樣。
延伸閱讀
更多關(guān)于Xcode 7 中 Code Coverage 工具的內(nèi)容,我推薦你觀看 WWDC 2015 的session 410 Continuous Integration and Code Coverage in Xcode.***,別忘了如果你想要試試我們上面的例子,可以在 Github 中找到他。






















