Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[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。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus