2017年1月14日 星期六

[iThome第8屆鐵人賽 17]OpenCover 結果 - 涵蓋率介紹篇

在上篇把OpenCover整合到測試之後,每當執行測試後會產生出一個涵蓋率的結果報告出來。

這個涵蓋率的結果是一個xml的檔案,這個xml其實有非常豐富的資訊,但是沒有一些基礎概念會不理解是什麼意思。

因此,在這篇,將會對於涵蓋率相關的資訊做一個介紹和說明。

涵蓋率到底怎麼計算

涵蓋率其實有非常多種算法,其中常見的有:

  • Class Coverage - 當一個class有被測試到,那麼就算1個測試點
  • Method Coverage - 當方法有被測試到,就算,不管是不是所有方法的執行路徑都有被測試到,都算一個測試點
  • Line Coverage - 每一行算1個測試點
  • Statement Coverage - 每一個statement算是1個測試點
  • Sequence Point Coverage - 每一個可以被中斷的地方都是1個測試點
  • Branch Coverage - 每一個分叉點(不管那個分叉多少程式碼)都算1點

以上就是常見的涵蓋率計算方式,其中1和2(class 和 method)比較算是一個總覽,更多在看的是3之後的方法。

不過,3之後的算法,只靠這幾個說明文字可能不容易理解,所以來看一下例子。

Line Coverage

Line Coverage 可以說是最基本的涵蓋率算法,概念很簡單,就是每一行算一個測試點,換句話說:

image
以這個例子來說,就是總共有4個測試點

可以發現,測試點比較粗糙,第3點和第4點都只個算1點而已。

Statement Coverage

Statement Coverage比Line Coverage好一點,它是以每一個statement算一個點,所以:

image
可以看到同樣一個程式碼,有5個測試點

Sequence Point Coverage

Statement Coverage不錯,但是畢竟一個statement不代表只有一種可能,因此又有了Sequence Point Coverage。這種coverage的概念是,只要能夠放中斷點的都算1點測試點:

image
同一個程式碼,變成了7個測試點

Branch Coverage

每一個分叉點算1個測試點,舉例來說:

image
總共3個分叉點,所以3個

為什麼要有Branch Coverage

或許會覺得為什麼需要Branch Coverage?原因很簡單,因為Branch Coverage是用來輔助呈現一個方法的分叉點是否都有測試到。

這個其實是用來輔助Sequence Point Coverage,可以想象一下,如果你在if裡面有兩行,在Sequence Point算兩點,如果有10行,會算10點,當if裡面行數越多,點數越多,會沖淡掉 最後百分比的數值。

這個時候Branch Coverage變得很方便,因為整個if只算1點,要嗎過,要嗎不過。

Open Cover支援的計算方式

上面介紹完了計算方法之後,可以看的出來,Line Coverage 和 Statement Coverage其實沒有那麼準確,Sequence Point反而是比較精準的計算方式。而Sequence point在看方法的路徑是不是都有涵蓋到 的時候不容易看,這個時候Branch Coverage就很適合。

因此,Open Cover的結果包含了:

  1. Class Coverage
  2. Method Coverage
  3. Sequence Point Coverage
  4. Branch Coverage

看Open Cover執行完的結果

有了上面的概念之後,再來看一下open cover產生的結果:

image
可以看到,上面提到的4個Coverage資訊都有

結語

了解了Coverage的算法之後,其實就可以parse這個xml結果並且把內容呈現出來(題外話:在Powershell裡面處理xml其實非常方便)。

甚至可以做到說,當某個Coverage的百分比數低於某個值的時候,不讓建制成功 - 不過這個部分在這邊不會做這個事情,有興趣可以利用Powershell處理xml的方法把內容parse出來在做判斷。

但是,最後要使用者來看這個xml來了解情況實在不方便,況且也沒有辦法容易看出到底是那裡沒有cover到。

因此,下篇將會介紹,有什麼方式可以讓結果更user friendly。


沒有留言 :

張貼留言