OpenCover是一個.Net Open Source的測試涵蓋率檢測的工具,透過這個Library,可以檢測出,對於整個程式的測試涵蓋率到底有多少 (當然,要注意一個迷失就是,不一定都要100 %的涵蓋率)。
這篇將會先對如何使用OpenCover做一個初步的介紹,在下篇才會把OpenCover實際整合到build script裡面。
同步發表於我的部落格:http://blog.alantsai.net/2017/01/devopsSeries-opencover-intro.html (部落格的格式會漂亮一些)
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。
在.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到底如何把這些執行不同的測試的涵蓋率一起計算?
要瞭解這個,先回顧一下測試是怎麼運作開始:
這個時候如果把OpenCover加入進來,圖片變成是:
這個時候,變成由OpenCover裡面的Profiler呼叫Test Runner,並且會記錄Test Runner執行什麼,最後除了測試結果有產生出來之外,涵蓋率結果也會產生出來。
(這邊有特別注意到OpenCover有個Profiler的概念,這也是為什麼他無法在mono環境運作的關係,和這個profiler有關。)
稍早有提到如果有不同的測試框架,是否涵蓋率都會一起算?OpenCover有考慮到這點,所以最後產生的結果能夠和其他OpenCover結果做合併。
在程式裡面,很有可能有些class或者有些檔案不應該要被檢查涵蓋率,舉例來說,應該沒有人會對測試在寫測試,所以要把這些剔除在涵蓋率計算。
在OpenCover裡面有三個方式能夠做這些排除:
基本上Filter能夠設定那些 Assembly和Namespace要加入或者不加入檢查,格式是:+-[Assembly]Namespace
+[Open*]* -[Open.Test]* - 包含所有dll是Open為開頭,但是排除掉所有dll是Open.Test。
在程式裡面可以給方法和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。