Unit Test 教學:覆蓋率

David Wu
4 min readApr 19, 2019

--

喬巴,你覆蓋率太低了…

什麼是覆蓋率 (Code Coverage)?就是你寫的測試究竟涵蓋的主程式多少的百分比。看覆蓋率的目的主要是「檢視自己有沒有值得寫而尚未寫的測試。」

我們延續上一篇 Unit Test 教學:非同步測試 API 的 Weather App 來做示範。現在的 commit 是:

啟用覆蓋率的順序就如下圖:Edit Scheme → Test → Code Coverage 打勾 → 跑測試 → Report Navigator 底下就會有 Coverage。

如下圖,可以發現我目前 Weather App 的總覆蓋率是 45.3%。請往下看到 AppDelegate 的部分,覆蓋率僅有 33%;把滑鼠移到這些沒有被測到的部分會出現➡️,按下去就會帶你到該程式碼。

若是我把其他系統自動產生的 function 刪掉,再跑一次測試…

就會發現 AppDelegate 的覆蓋率變成了 100%!

可見,覆蓋率只是一個參考,不用真的非要做到 100%,它的作用是「檢視自己哪裡有測試未寫」。

如果先看 APIManager,有兩個 closure 的覆蓋率是 85.7%。

點擊進去看的話,就可以看到:

  1. 紅色那一橫槓代表這測試的程式碼沒有來過,在最右邊還會標明進來的次數。若我想要把 APIManager 的覆蓋率做好做滿的話,就要再寫個 Failure Test。
  2. //Swift 5 下面那一區是因為前一篇教學方便,所以沒有帶 headers 的 getData(from:completion:) ,它上面我後來寫了一個帶有 headers 的版本,所以可以先註解掉、跑看看測試…測試成功!所以就可以乾脆地把那多餘的程式碼安心刪掉。你看,若是沒有寫測試,我根本不敢輕易刪除程式碼。

切到 APIManager 來寫個 Failure Test

結過會發現…無論如何跑測試都是 Fail,下斷點就會發現是因為 Bad URL 會直接 return。APIManager 少做了 Error Handling。

所以,請加上框起來的程式碼,把 Error Handing 補上

這樣再跑一次測試就會發現,APIManager 的覆蓋率提升了!

總結

覆蓋率並不需要非做到 100%。尤其像是 UI 的部分,單元測試是測不到的。看覆蓋率的目的是「檢視自己有沒有值得寫而尚未寫的測試」,掌握到這個概念,就可以慢慢地把自己的程式碼變得更加完善嚕!

--

--