2017年1月23日 星期一

Visual Studio 2015 Professional 測試的程式碼涵蓋範圍 - 使用 OpenCover 和 OpenCover UI

相信很多人都會直覺認為在 Visual Studio 裡能夠使用到「程式碼涵蓋範圍」這個功能是很正常也不會覺得有任何異常的狀況,不管是之前的 VS2012, VS2013 或 VS2015,有寫測試的開發人員都會對於使用「程式碼涵蓋範圍」是日常開發工作理會經常去使用到的,但你們可知道正在使用的 Visual Studio 授權版本為何呢?

一開始會這麼問各位,這是因為 Visual Studio 裡的「分析程式碼涵蓋範圍」功能是只有在 Ultimate 與 Enterprise 版本才有的,而如果使用的是 Professional 或 Community 版本則是沒有的,那麼使用 Professional 版本的開發者在寫測試時要如何知道測試程式的涵蓋範圍呢?

 


這邊還是要先做個說明,Visual Studio 除了 Community 之外的版本都是要花錢買授權的,而且各種版本的功能都有所差異,當然每個人都想使用最高的版本來開發專案,所以有很多人會想方設法的去取得「快樂版」,或是公司只有買一套 Enterprise 授權卻大量發放給所有工程師使用,這都不是正確的做法,而且就長久以來的觀察,真的會使用到 Enterprise 功能的開發者是寥寥可數,而且使用 Professional 就可以應付大部分的開發工作了,所以各位開發人員對於自己所使用的 Visual Studio 版本與授權是否合法就要好好地去做瞭解(想要用到 Enterprise 版本通常都是為了爽度而已)

 

回到正題,先來看看 Visual Studio 2015 各個版本所提供的測試功能之比較

比較 Visual Studio 2015 產品

由比較表裡可以清楚看到「程式碼涵蓋範圍」是只有 Enterprise 版本才有提供的

image

下圖是 Visual Studio 2015 Enterprise 的測試功能選單以及測試總管的執行選單

image

image

下圖是 Visual Studio 2015 Professional 的測試功能選單以及測試總管的執行選單

image

image

 

這邊再一次的強調,寫單元測試絕對不能夠以「測試涵蓋率」的數字做為專案的 KPI 評核項目,也不能夠做為任何評核的數字量化依據,而是要去看涵蓋範圍,哪些程式是還沒有被單元測試給覆蓋,如果太過於看重涵蓋率數字,就會混淆了寫測試的目的和真正所帶來的效益。

 

測試涵蓋範圍的色塊表示,可以清楚知道給覆蓋而哪些是沒有,這個功能對於開發人員是有很大的幫助,可以在自己的開發環境裡能夠在短時間裡就知道涵蓋結果

image

 

MSDN - 使用程式碼涵蓋範圍來決定所測試的程式碼數量
https://msdn.microsoft.com/zh-tw/library/dd537628.aspx

 

而使用 Visual Studio Professional 並沒有提供程式碼涵蓋範圍功能,所以開發人員就無法在自己的開發環境裡就知道測試的程式涵蓋範圍,雖然可以在 TFS 或其他 CI 建置環境裡去產生涵蓋結果的報告,但是就不具立即性也不夠直覺和方便,所以就要找替代方案,這邊要介紹的就是 OpenCover。

 

OpenCover

https://github.com/OpenCover/opencover

image

OpenCover 並不是 Visual Studio 的擴充功能而是需要另外安裝,安裝程式要到 Github Repository 的 Release 裡下載

https://github.com/opencover/opencover/releases

image

下載完成後就可以直接安裝

image

安裝後的程式預設目錄路徑為「C:\Users\ 使用者名稱 \AppData\Local\Apps\OpenCover

image

OpenCover 是可以獨立執行的,在 Console 模式下使用指令就可以去分析計算指定專案的程式碼涵蓋範圍,不過這邊我並不會介紹,這篇還是會以介紹如何在 Visual Studio 整合使用為主,有興趣的朋友可以瀏覽 Wiki 裡面的說明,以及查看網路上的其他文章。

https://github.com/OpenCover/opencover/wiki

 

OpenCover UI

安裝完 OpenCover 之後還必須要在 Visual Studio 裡安裝擴充功能「OpenCover UI」,要先說明的是 OpenCover 與 OpenCover UI 並不是同一套工具,而是分開的,OpenCover UI 是在 Visual Studio 執行 OpenCover 的 UI 介面。

OpenCover UI - Visual Studio Marketplace

image

Github – OpenCover UI

https://github.com/OpenCoverUI/OpenCover.UI

 

在 Visual Studio 的擴充功能裡安裝 OpenCover UI

image

安裝完成後會在上面功能選單增加「OpenCover」的功能項目

image

 

設定 OpenCover.Console.exe 路徑位置

這個很重要,一定要做設定。開啟 Visual Studio 的「工具 >選項」,然後在「OpenCover.UI Options」項目裡,將 OpenCover Path 填上「C:\Users\ 使用者名稱 \AppData\Local\Apps\OpenCover」( 那個 使用者名稱 麻煩要改呀,不要真的填上使用者名稱,之後不能用還來問我呀… )

image

P.S. 如果是用 NUnit 寫單元測試,就必須要在 NUnit Path 填上 nunit.console.exe 的路徑

 

選擇開啟「OpenCover Test Explorer」,這邊並不是整合在原本的測試總管裡,而是有自己的 OpenCover 測試總管,重新整理或重新建置專案就可已在 Test Explorer 顯示單元測試,

image

OpenCover Test Explorer 的功能比較陽春,所以要全選或是部分選擇單元測試是比較不那麼順手,

image

點選「Cover with OpenCover」之後就會重新建置專案並執行測試、分析程式碼涵蓋範圍,在下方會開啟 OpenCover Result 視窗顯示

image

不過我在使用的過程中如果一開始是選擇全部單元測試執行 Cover with OpenCover 的時候,常常都會遇到以下的狀況

image

出現找不到路徑的錯誤訊息,我去找訊息所提及的路徑位置,卻發現路徑位置一直到最後的 TestResults 前都是存在的,而是 OpenCover UI 指錯了位置,這個問題有在 OpenCover UI 的 Github Issues 裡看到,但是卻沒有得到解決。

這邊的解決方式是一開始先執行一個測試,先執行一個完成後,接著再去執行全部就不會再出現錯誤。

先選擇一個單元測試執行 Cover with OpenCover

image

執行一個測試的覆蓋分析後,接著就可以選擇全部或是多個測試做 Cover with OpenCover

image

選擇 OpenCover Results 視窗左上方的圖示「Show Code Coverage Coloring」,就可以使用色塊的方式顯示覆蓋範圍

image

如果要修改覆蓋色塊的顯示顏色,請參考 Wiki 裡的說明

https://github.com/OpenCoverUI/OpenCover.UI/wiki/OpenCover.UI-Configuration

另外如果不想要以色塊顯示覆蓋範圍的話,也可以選擇「Show Code Coverage glyphs」方式,會在程式碼行數顯示區域的左方以不同顏色的圖示做顯示,橘色為部分覆蓋,紅色為沒有覆蓋,綠色為全部有覆蓋

image

當然如果你想要的話,也可以兩種顯示方式都使用

image

 

以上就是介紹安裝 OpenCover 以及在 Visual Studio 2015 Professional 版本裡使用 OpenCover UI 執行程式碼涵蓋範圍的功能。

 


如果真的要說的話,還是原本在 Visual Studio 2015 Enterprise 測試總管的「分析程式碼覆蓋範圍」功能比較好用,因為功能已經整合在測試總管裡,不論是使用、執行分析速度或結果的顯示來說,OpenCover UI 的完整度還是無法與 Visual Studio 既有的功能來做相比,但因為使用的 VS2015 版本的限制,OpenCover UI 還算是可用。

不過 OpenCover UI 的功能真的太過於陽春與不好用,而且那個路徑位置的問題也一直遲遲未被解決,所以我會在下一篇文章裡介紹另一套 UI 擴充功能,功能與操作上會比 OpenCover UI 好很多。

最後再強調千萬不要拿測試涵蓋率做任何評分或績效、專案品質的依據,請使用正式且合法授權的 Visual Studio 和開發工具。

 

相關連結

比較 Visual Studio 2015 產品

MSDN - 使用程式碼涵蓋範圍來決定所測試的程式碼數量
https://msdn.microsoft.com/zh-tw/library/dd537628.aspx

OpenCover
https://github.com/OpenCover/opencover
https://github.com/opencover/opencover/releases

OpenCover UI
OpenCover UI - Visual Studio Marketplace
https://github.com/OpenCoverUI/OpenCover.UI

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。