Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps、C#, Asp .net Mvc、Azure、AI、Chatbot、Docker、Data Science

[iThome第8屆鐵人賽 15]OpenCover 介紹篇

OpenCover是一個.Net Open Source的測試涵蓋率檢測的工具,透過這個Library,可以檢測出,對於整個程式的測試涵蓋率到底有多少 (當然,要注意一個迷失就是,不一定都要100 %的涵蓋率)。

這篇將會先對如何使用OpenCover做一個初步的介紹,在下篇才會把OpenCover實際整合到build script裡面。

OpenCover是什麼?為什麼使用它

OpenCover小檔案

Github:
OpenCover
Nuget:
Install-Package OpenCover

OpenCover是一個支援.Net 2.0 以上的程式碼涵蓋率檢測的Library。基本上可以說是在.Net世界裡面Open Source程式碼涵蓋率Library用的最多的一個。而他的作用也很簡單,就是用來 檢測程式碼的測試涵蓋率有多少。

測試涵蓋率指的是什麼呢?詳細的在稍後的篇章會在提到,不過基本上來說,就是有沒有測試到程式碼的所有角度,舉例來說:

if(x == 3)

{

}

else

{

}

假設今天我的測試程式碼只有測試當x == 3的情況,那麼可以說,測試涵蓋率只有50%,因為else的階段沒有測試到

OpenCover就是一個這種讓我們檢測的Library。

除了OpenCover還有什麼測試涵蓋率的Library嗎?

在.Net世界裡面還有一些別的涵蓋率的Library,像是dotCover或者Visual Studio Ultimate版本裡面的Code Coverage功能。不過這些都是需要收費才能夠使用,所以如果沒有這個經費,或者 沒有這些Licence,那OpenCover就是歲好的替代方案。

像Visual Studio的Code Coverage有個好處是和VS整合在一起,對於開發要看結果比較方便,不過OpenCover也有對應的套件叫做OpenCover UI,也能夠達到類似的效果,不過這個部分就不在這個系列介紹了。

OpenCover的運作概念是什麼?

從頭到尾一直提到說它是一個測試涵蓋率的Library,但是他到底如何知道測試程式碼到底執行了什麼?甚至可以說有這麼多不同的Test Framework,怎麼讓OpenCover知道每一個Test Framework到底執行了那些測試?

舉例來說,在這個系列裡面用了3個Test Framework,雖然在正式系統應該只會使用一種,但是OpenCover到底如何把這些執行不同的測試的涵蓋率一起計算?

要了解這個,先回顧一下測試是怎麼運作開始:

image
呼叫Test Runner,執行測試dll,產生測試結果

這個時候如果把OpenCover加入進來,圖片變成是:

image
OpenCover呼叫測試Console,測試Console在執行測試dll,產生測試結果。OpenCover產生涵蓋率結果

這個時候,變成由OpenCover裡面的Profiler呼叫Test Runner,並且會記錄Test Runner執行什麼,最後除了測試結果有產生出來之外,涵蓋率結果也會產生出來。

(這邊有特別注意到OpenCover有個Profiler的概念,這也是為什麼他無法在mono環境運作的關係,和這個profiler有關。)

稍早有提到如果有不同的測試框架,是否涵蓋率都會一起算?OpenCover有考慮到這點,所以最後產生的結果能夠和其他OpenCover結果做合併。

OpenCover設定過濾條件

在程式裡面,很有可能有些class或者有些檔案不應該要被檢查涵蓋率,舉例來說,應該沒有人會對測試在寫測試,所以要把這些剔除在涵蓋率計算。

在OpenCover裡面有三個方式能夠做這些排除:

  1. 用Filter
  2. 用Attribute
  3. 用檔案

用Filter

基本上Filter能夠設定那些 Assembly和Namespace要加入或者不加入檢查,格式是:+-[Assembly]Namespace

  • + 代表包含
  • - 代表不包含
  • 框框裡面是dll名稱
  • 框框外面則是Namespace

如果有多個,就是每一個用空白區分。舉例來說:

+[Open*]* -[Open.Test]* - 包含所有dll是Open為開頭,但是排除掉所有dll是Open.Test。

用Attitude

在程式裡面可以給方法和Class特殊的Attribute,然後在設定的時候過濾有這些Attribute不要算在涵蓋率裡面。

之前提到VS裡面在高版本有內建Code Coverage,裡面有個Attribute叫做ExcludeFromCodeCoverage用來不算在涵蓋率裡面。在OpenCover也可以利用這個Attribute,讓有這個Attribute 的都不要算在裡面

用檔案

VS會產生一些cs檔案,方便開發者不用自己建立。舉例來說,Designer.cs的檔案在Asp .net Webform裡面會產生用到的Control,這些也不應該算在涵蓋率裡面。

所以,這種類型可以用檔案方式來過濾掉。

結語

在這篇對於OpenCover有了一個初步的介紹,了解了OpenCover透過Profiler執行Test Runner來了解那些有執行那些沒有,並且了解了如何設定過濾不要算在檢測涵蓋率裡面的方式。

在下篇,將會使用這篇了解的內容來調整我們的Build script。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付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