[TFS 2015] 實作 Build vNext 自動部署 dotCover 測試涵蓋率網頁

dotCover 在 Jetbrains 旗下,是用來產生測試涵蓋率報表的工具,授權方式已經和 ReSharper Ultimate 綑綁在一塊,它有免費試用;若你需要使用網頁來呈現報表, 或許你可以考慮 dotCover,官方連結:https://www.jetbrains.com/dotcover/?fromMenu

dotCover 提供 Command Line 的支援,整合自動化建置這一關是沒問題的,不過我在實作的時候仍然有碰到一些問題,不用怕 dotCover 也有技術支援,回應速度算蠻快,問題很快就解掉了。

續上篇:https://dotblogs.com.tw/yc421206/2016/04/30/tfs2015_build_vnext_deploy_specflow_pickles_report

伺服器環境:

  • Windows 2012 Datacenter x64 中文版
  • TFS 2015 Update 2 中文版

開發環境:

  • WIndows 10 x64 中文版
  • VS 2015 Update 2 英文版
  • dotCover 2016.1

安裝 dotCover

它的安裝要注意一下,要選 All Users 才會安裝在 %ProgramFiles(x86)%,如下圖:
dotCover installe. Custom settings

若你安裝在 %LOCALAPPDATA%\JetBrains\Installations,那你的 CI Server Build 的使用帳號就要想辦法安裝軟體,否則沒有權限可以使用

安裝步驟請參考:https://www.jetbrains.com/help/dotcover/10.0/Installation_Guide.html?origin=old_help

心得:預設情況安裝很快,一旦要裝到 %ProgramFiles(x86)% 安裝介面就變得不太友善了,我弄了好久...>"<
若在安裝過程中 All Users 不能選,先移除 dotCover,然後把 %LOCALAPPDATA%\JetBrains\Installations 把相關的檔案清掉 ,重啟安裝程式再按下Restart。
安裝完成後要啟用,試用版也要。

 

成功選擇All Users,如下圖:

 

或者是從 Nuget 上安裝 dotCover Command Tool,如下圖:

 

dotCover Command Line

參考資源:
https://www.jetbrains.com/help/dotcover/10.0/dotCover__Console_Runner_Configuration.html?origin=old_help
https://www.jetbrains.com/help/dotcover/10.0/dotCover__Console_Runner_Commands.html?origin=old_help

有兩種方式,透過 XML 或是Command Line 的參數,如下圖

analyse 及所有功能於一身,我接下來的範例用 cover 參數產生 *.dcvr,然後再用 report 產生 html,

TargetExecutable 是必填,你可以用 msTest 或是 vsTest,如下圖:

CoreInstructionSet

這個參數用於 TFS ,官方文件並沒有為他寫文件,若你要整合 TFS 就要下這個參數,不然會像我一樣跑不起來,

請求技術支援的回覆,如下圖:

CoreInstructionSet 很重要,如下圖:

實作

有了這些 Command Line 的基礎認識,就可以來使用它了,操作步驟跟前面幾篇都一樣。

在測試專案加入 runCoverageReport.bat

runCoverageReport.bat 內容如下:

@echo off
:start
setlocal enabledelayedexpansion

set solutionFolder=%1
echo solutionFolder=%solutionFolder%

set buildConfiguration=%2
echo buildConfiguration=%buildConfiguration%

set testProjectName=%3
echo testProjectName=%testProjectName%

set excludeModule=%4
echo excludeModule=%excludeModule%

set testProjectFolder=%solutionFolder%\%testProjectName%
echo testProjectFolder=%testProjectFolder%

set binFolder=%testProjectFolder%\bin\%buildConfiguration%
echo binFolder=%binFolder%

set dll="%binFolder%\%testProjectName%.dll"
echo dll=%dll%

if "%AGENT_BUILDDIRECTORY%"=="" (
set outRootFolder=%binFolder%
) else (
set outRootFolder=%AGENT_BUILDDIRECTORY%
)
echo AGENT_BUILDDIRECTORY=%AGENT_BUILDDIRECTORY%
echo outRootFolder=%outRootFolder%

set outputFolder=%outRootFolder%\CodeCoverageReport\%testProjectName%
echo outputFolder=%outputFolder%

if exist %outputFolder% (
echo delete %outputFolder%
del %outputFolder%\*.* /s /q 
rmdir %outputFolder% /s /q )
mkdir %outputFolder%
set dotCover="%ProgramFiles(x86)%\JetBrains\Installations\ReSharperPlatformVs14\dotCover.exe"
echo dotCover=%dotCover%

set msTest="%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\MsTest.exe"
echo msTest=%msTest%

set vsTest="%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"
echo vsTest=%vsTest%

set coverageFile="%outputFolder%\TestCoverageReport.dcvr"
echo coverageFile=%coverageFile%

set coverageReportFile="%outputFolder%\TestCoverageReport.html"
echo coverageReportFile=%coverageReportFile%

set coverageLogFile="%outputFolder%\TestCoverageReport.log"
echo coverageLogFile=%coverageLogFile%

set tempFolder="%outputFolder%\temp"
echo tempFolder=%tempFolder%

if exist %tempFolder% (
del %tempFolder%\*.* /s /q
rmdir %tempFolder% /s /q )
mkdir %tempFolder%

::if exist "%targetWorkingDir%" (rd "%targetWorkingDir%" /s /q )
::mkdir "%targetWorkingDir%"


::set mstestArguments=/resultsfile:"%binFolder%\Results.trx" /testcontainer:%dll% /publish:"http://nttp3vs30:8080/tfs/" /publishresultsfile:"mstest.trx" /teamproject="THS.ComponentModel"

set vstestArguments=%dll% /logger:TfsPublisher /Collection=http://nttp3vs30:8080/tfs/DefaultCollection /TeamProject=THS.ComponentModel /Flavor=Release /RunTitle=$Env:TF_BUILD_BUILDNUMBER

set vstestArguments=%dll% /logger:trx
echo vstestArguments=%vstestArguments%

set filters=+:module=*;type=*;function=*;module=%excludeModule%
echo filters=%filters%

REM echo run mstest...
REM %msTest% %mstestArguments%
REM echo run vstest...
REM %vsTest% %vstestArguments%

if exist %tempFolder% (
del %tempFolder%\*.* /s /q 
rmdir %tempFolder% /s /q )
mkdir %tempFolder%

echo run cover command by vsTest...

::%dotCover% analyse /TargetExecutable=%vsTest% /TargetArguments=%vstestArguments% /Output=%coverageFile% /TargetWorkingDir=%outputFolder% /LogFile=%coverageLogFile% /Filters=%filters% /TempDir=%tempFolder% /CoreInstructionSet=x86 /ReportType="HTML" /Output=%coverageReportFile%

%dotCover% cover /TargetExecutable=%vsTest% /TargetArguments=%vstestArguments% /Output=%coverageFile% /TargetWorkingDir=%outputFolder% /LogFile=%coverageLogFile% /Filters=%filters% /TempDir=%tempFolder% /CoreInstructionSet=x86

echo run report command...
%dotCover% report /Source=%coverageFile% /Output=%coverageReportFile% /ReportType="HTML"


:end
if exist %tempFolder% (rmdir %tempFolder% /s /q )


EndLocal
pause
exit

 

加入一個 runCoverReport.bat,我用它在本機測試,沒問題後再丟到 TFS 上跑,如下圖:

runCoverReport.bat 調用 CI\runCoverReport.bat 傳入本機路徑,如下圖:

在 TFS Build vNext 的命令列調用 CI\runCoverage.bat,如下圖:

參數定義如下圖:

產生出來的報表網頁如下圖:

最後,排定 Daily Build or CI Build,自動化建置、測試、文件、部署,輕鬆完成。

若你對 Build vNext 還不熟,你可以參考以下連結:
https://dotblogs.com.tw/yc421206/2016/04/30/tfs2015_build_vnext_deploy_specflow_pickles_report
https://dotblogs.com.tw/yc421206/2016/04/27/tfs2015_build_vnext_release_deploy_internal_nuget_server
https://dotblogs.com.tw/yc421206/2016/04/22/tfs2015_build_vnext_release_deploy_internal_webapp
https://dotblogs.com.tw/yc421206/2016/04/20/tfs2015_build_vnext_webdeploy

對 Pickles 不熟,可以參考以下連結:
https://dotblogs.com.tw/yc421206/2016/04/25/specflow_pickles_live_document
https://dotblogs.com.tw/yc421206/2016/04/26/specflow_pickles_live_document_command_line

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo