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)%,如下圖:
安裝步驟請參考:https://www.jetbrains.com/help/dotcover/10.0/Installation_Guide.html?origin=old_help
若在安裝過程中 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