2017年1月1日 星期日

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


沒有留言 :

張貼留言