關於 sonarQube 裡面的測試覆蓋率是需要先建立測試報告,並指定路徑提供給 sonarQube 進行分析,這樣才會顯示正確的數據,這一篇文章將會介紹一下個人的使用經驗
關於 sonarQube 的部分,請參考:SonarQube 程式碼分析工具 - 2022
導入 .net 測試報告
如果要導入.net 的測試報告,必須經由下列的四個步驟來完成
- 執行
SonarScanner.MSBuild.exe begin
指令開始分析專案 - 執行
msbuild
開始建構專案 - 執行測試工具,並將報告產生於步驟 1 的指定路徑
- 執行
SonarScanner.MSBuild.exe end
指令結束分析
之所以會有第三個步驟,原因是SonarScanner
其實並不會針對專案執行測試,或者是產生報告,它只是引用報告的數據而已
SonarScanner
針對不同的語言有不同的報告導入參數需要設定,完整的清單可以到官網查看Test Coverage & Execution
官網可能改版連結也會失效,但是它們的文件的確是越寫越好,直接進官網文件搜尋關鍵字也是不錯的方式
SonarScanner for MSBuild
msbuild 有自己的 scanner,可以到這邊查看詳細資訊
若採用 dotnet framework,直接下載他們的.NET framework 4.6+ 工具下載解壓縮後就可執行SonarScanner.MSBuild.exe
;若採用 dotnet core,可以考慮直接使用 dotnet tool比較方便
# 安裝 dotnet tool
dotnet tool install --global dotnet-sonarscanner --version 4.10.0
Test Coverage
Language | Property | Remarks |
---|---|---|
Any | sonar.coverageReportPaths |
通用的報告格式 |
c# | sonar.cs.vscoveragexml.reportsPaths |
針對 Visual Studio Code Coverage Report 格式的報告。多個報告以逗號分隔;也可採用萬用字元 |
c# | sonar.cs.dotcover.reportsPaths |
針對 dotCover 產生的報告所使用的參數 |
c# | sonar.cs.opencover.reportsPaths |
針對 openCover 產生的報告所使用的參數 |
javaScript TypeScript |
sonar.javascript.lcov.reportPaths |
LCOV coverage report,支援以逗號分隔的絕對/虛擬路徑 |
Test Execution
Language | Property | Remarks |
---|---|---|
Any | sonar.testExecutionReportPaths |
通用的報告格式 |
c# | sonar.cs.vstest.reportsPaths |
VSTest reports,多個報告以逗號分隔;也可採用萬用字元 |
c# | sonar.cs.nunit.reportsPaths |
NUnit execution reports,同上 |
c# | sonar.cs.xunit.reportsPaths |
xUnit execution reports,同上 |
javaScript TypeScript |
– | 透過jest-sonar-reporter或是karma-sonarqube-unit-reporter產生通用的報告格式 |
實際範例
所以重點就在於如何產生報告放在指定路徑,並透過參數告知sonarScanner
.net framework
下面這個範例專案採用的是.net framework,所以測試針對 dll 執行,產生多個 dcvr 後合併並轉為 html 報告,指定給 sonarScanner
# 開始分析
SonarScanner.MSBuild.exe begin
/k:"myTestProject"
/d:sonar.host.url="http://127.0.0.1:9090"
/d:sonar.login="32aafa7ac56a55dae90d0891487e7af98506ed33"
/d:sonar.cs.dotcover.reportsPaths="report.html"
/d:sonar.cs.vstest.reportsPaths="TestResults/*.trx"
/d:sonar.exclusions=myTestProject/Scripts/Plugins/**,myTestProject/Content/**
/d:sonar.verbose=true
# 建置專案
msbuild myTestProject.Web\\myTestProject.Web.csproj /p:OutputPath="D:\\MSBuildOut\\myTestProject.Web" /p:Configuration=Debug /t:Rebuild
# 產生多個測試報告並合併結果
"D:\art\programs\JetBrains.dotCover.CommandLineTools.2019.3.1\dotCover.exe" cover /TargetExecutable="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" /TargetArguments="myTestProject.Adapter.Test.dll" /TargetWorkingDir="myTestProject.Adapter.Test\bin\debug" /Output="myTestProject.Adapter.Test.dcvr" /Filters=-:module=Dapper;-:module=myTestProject.Adapter.Test
"D:\art\programs\JetBrains.dotCover.CommandLineTools.2019.3.1\dotCover.exe" cover /TargetExecutable="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" /TargetArguments="myTestProject.Core.Test.dll" /TargetWorkingDir="myTestProject.Core.Test\bin\debug" /Output="myTestProject.Core.Test.dcvr" /Filters=-:module=Dapper;-:module=myTestProject.Core.Test;-:module=StackExchange.Redis
"D:\art\programs\JetBrains.dotCover.CommandLineTools.2019.3.1\dotCover.exe" cover /TargetExecutable="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" /TargetArguments="myTestProject.DataService.Test.dll" /TargetWorkingDir="myTestProject.DataService.Test\bin\debug" /Output="myTestProject.DataService.Test.dcvr" /Filters=-:module=Dapper;-:module=myTestProject.DataService.Test
"D:\art\programs\JetBrains.dotCover.CommandLineTools.2019.3.1\dotCover.exe" merge --Source=myTestProject.Adapter.Test.dcvr;myTestProject.Core.Test.dcvr;myTestProject.DataService.Test.dcvr --Output=Merged.dcvr
"D:\art\programs\JetBrains.dotCover.CommandLineTools.2019.3.1\dotCover.exe" report --source=merged.dcvr --output=report.html --reportType=html
vstest.console.exe /Logger:trx;LogFileName=myTestProject.Adapter.trx "myTestProject.Adapter.Test\bin\Debug\myTestProject.Adapter.Test.dll"
vstest.console.exe /Logger:trx;LogFileName=myTestProject.Core.trx "myTestProject.Core.Test\bin\Debug\myTestProject.Core.Test.dll"
vstest.console.exe /Logger:trx;LogFileName=myTestProject.DataService.trx "myTestProject.DataService.Test\bin\Debug\myTestProject.DataService.Test.dll"
# 結束分析
SonarScanner.MSBuild.exe end /d:sonar.login="32aafa7ac56a55dae90d0891487e7af98506ed33"
.netCore 2
這個範例是 .netCore,scanner 就不一樣了
# 開始分析
dotnet sonarscanner begin
/k:"TestProject"
/d:sonar.host.url="http://127.0.0.1:9090"
/d:sonar.login="2c244539263ac8b5c4b4414b2b8c190a8ca873d9"
/d:sonar.cs.dotcover.reportsPaths="AppCoverageReport.html"
# 建置專案
dotnet build TestProject.sln
# 產生報告
dotCover cover
--TargetExecutable="C:\Program Files\dotnet\dotnet.exe"
--TargetWorkingDir="TestProject.Tests"
--TargetArguments="test \"TestProject.Tests.csproj\""
--Filters=-:TestProject.Tests
--output=AppCoverageReport.html
--reportType=HTML
# 結束分析
dotnet sonarscanner end /d:sonar.login="2c244539263ac8b5c4b4414b2b8c190a8ca873d9"
參考連結
[Coverage & Test Data] Generate Reports for C#, VB.net
這一篇文章提供了產生報告的範例指令
官網文件
結論
這邊的測試報告我都採用 dotCover 來做,但是它並不是免費使用的;但仍舊有替代方案可選擇,不過我就不另外贅述了 關於測試報告的部分我覺得對於 sonarQube 是很重要的一個環節,因為主打的是軟體品質管理,少了測試報告的部分就差很多
2022-06-15:上述是有錯誤的,其實 dotCover Cli Command 是可以免費使用的,需要購買使用的是 dotCover GUI 版本