iOS9 每日學習第5天:Xcode Code Coverage Tools

發表於2015-10-30

Code coverage 是一個計算你的單元測試覆蓋率的工具。高水平的覆蓋給你的單元測試帶來信心,也表明你的應用被徹底的測試過了。你可能寫了幾千個單元測試,但如果覆蓋率不高,那麼你寫的這套測試可能價值也不大。

這裡並沒有一個確切的百分比,要求你必須到達這個覆蓋率。這很大程度上取決於你的專案(的具體情況)。譬如說,如果你的專案中有很多不能寫單元測試的視覺元件,那麼覆蓋率就會比單純處理資料的框架要低的多。

Code Coverage in Xcode

在過去,如果你想要製作一個測試的程式碼覆蓋報告出來,需要設定很多[選項]。非常複雜,還有許多需要手動設定。在 iOS 9中,蘋果提供了智慧的程式碼覆蓋工具,他是和 LLVM 一體的,每次執行測試都會被呼叫和計算。

Using the Code Coverage Tools

現在我們用一個例子來展示,如何使用新的 code coverage 工具和怎樣提升現在的測試用例。完成後的程式碼放在了 Github 上,你可以跟著做。

第一件事是建立一個新專案,並確認你選上了Unit tests選項。這會按要求建立一個預設專案,現我們需要測試點什麼。這個測試可能是你的任意需求,這裡我新增一個空的 swift 檔案,裡面寫好了一個全域性的方法。這個方法檢測兩個字母串是否是僅排序不同的相同字母組成的詞。寫成全域性的方法,可能不是好的設計,但這裡我們僅演示一下。

這是一個相對簡單的方法,所以我們可能會得到一個沒有任何問題的,100%覆蓋的測試覆蓋率。


check word

一旦你寫好了演算法,就該寫個測試了。開啟專案建立時已經建立好了的預設的XCTestCase,新增一個下面的簡單的測試方法。他看起來是這樣子的。


tests

在執行測試之前,我們必須先確認 code coverage 是否被開啟了,寫程式碼時,預設是關閉的。所以你需要編輯一下你的測試 scheme,把它開啟。


turn on coverage

確保”Gather coverage data”是被選中的,然後點選關閉按鈕,執行測試的 target. 我們希望剛剛建立的測試用例能夠順利通過。

The Coverage Tab

一旦這個測試通過了,你就能知道 checkWord 這個方法,至少有一條路徑是對的。但你不知道的是,還多多少沒有被測試到。這就是code coverage這個工具的好處。當你開啟code coverage tab後,你可以清楚的看到測試的覆蓋情況。他們按找 target, file, function 進行了自動分組。

開啟Xcode左邊視窗的Report Navigator皮膚,選中你剛執行的測試。然後在tab中選中 Coverage。


test coverage panel

這會展示一個你的類、方法的列表,並標示出每個的測試覆蓋率。如果你將滑鼠懸停在checkWord這個方法上,你可以看到測試的覆蓋率是28%。不能接受啊!我們需要找到,那些程式碼分支是能夠被測試執行,那些是不能的,進而改善他們。雙擊方法的名字,Xcode會開啟類的程式碼,並且看到code coverage的情況。


coverage result

白色的區域表示這些程式碼時測試覆蓋過的。灰色區域時測試無法覆蓋的,我們需要新增更多的測試用例來覆蓋灰色部分的程式碼。在右手邊的數字,表明這些程式碼塊,在這次測試中被執行的次數。

Improving Coverage

很顯然,28%的覆蓋率不是我們的目標。這裡沒有 UI,看起來是個完美的編寫測試用例的候選function。所以,我們新增一個測試用例。理想情況下,我們希望每個分支都能被測試到。這樣就能達到完整的覆蓋。新增下面的測試用例到你的測試類中。


test cases

這些測試用例應該能夠完全覆蓋我們的程式碼了。執行一下單元,然後開啟最後一個測試報告。


the final coverage result

我們成功了,100%的覆蓋率。你可以看到整個程式碼都變成了白色,右面的數字也展示了每個程式碼段至少被執行了一次。

使用code coverage是一個非常棒的方式,幫你建立真正有價值的測試組合。遠好於你寫了很多測試用例,但沒有真正測試到程式碼。Xcode 7 讓這種方式變的非常簡單,我推薦你在專案中開啟 Code Coverage。即使你已經寫好了測試,也可以幫你知道到底測試寫的怎麼樣。

延伸閱讀

更多關於Xcode 7 中 Code Coverage 工具的內容,我推薦你觀看 WWDC 2015 的session 410 Continuous Integration and Code Coverage in Xcode.最後,別忘了如果你想要試試我們上面的例子,可以在 Github 中找到他。

相關文章