1. 程式人生 > >【Azure DevOps系列】Azure DevOps生成程式碼覆蓋率

【Azure DevOps系列】Azure DevOps生成程式碼覆蓋率

## 前言 在做單元測試時,程式碼覆蓋率可以作為我們衡量程式碼質量的一個指標,本章我們將使用Azure DevOps幫助我們生成程式碼覆蓋率的結果.Azure DevOps構建管道還是具有程式碼覆蓋率選項的,在Visual Studio測試平臺在已經集成了Coverlet格式的資料收集器,它其實並不難,它是可以開箱即用的。獲取Coverlet格式報告幾乎都是可以拿命令列引數去解決的。 在單元測試專案中需要引入nuget包coverlet.collector,當然只需要在單元測試專案中引用他,下面這個程式碼片段是單元測試模板自動生成的,我只是引入了一個我自己的類庫。 ``` netcoreapp3.1 false runtime; build; native; contentfiles; analyzers; buildtransitive all runtime; build; native; contentfiles; analyzers; buildtransitive all ``` ## 如何在Azure DevOps中使用? 第一步是在構建之前對專案進行還原nuget包,這會將所有的包拉到構建代理的本地資料夾中. **還原專案包(dotnet restore)** ``` - task: DotNetCoreCLI@2 displayName: 'dotnet restore' inputs: command: restore ``` **構建專案(dotnet build)** ``` - task: DotNetCoreCLI@2 displayName: 'dotnet build' inputs: command: build ``` 執行單元測試,其實上面的管道任務都是非常簡單的,但是對於單元測試,我們需要設定dotnet cli將測試結果進行收集,蒐集為cobertura格式,這是通過命令列引數來完成的。 正如下所示: **執行單元測試** ``` - task: DotNetCoreCLI@2 displayName: 'dotnet test' inputs: command: test projects: '**/XUnitTestProject1.csproj' arguments: '--configuration $(BuildConfiguration) --collect "XPlat Code coverage" -- RunConfiguration.DisableAppDomain=true' ``` 當然我們可以在coverlet中瞭解更多的資訊`https://discoverdot.net/projects/coverlet` **安裝報告生成工具** ``` - task: DotNetCoreCLI@2 displayName: Install ReportGenerator Global Tool inputs: command: custom custom: tool arguments: install dotnet-reportgenerator-globaltool -g ``` **使用reportgenerator工具生成報告** ``` - script: 'reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverlet/reports -reporttypes:"Cobertura"' displayName: 'Create reports' ``` **程式碼報告發布到Azure DevOps** 最後這一步做的是將剛才生成的所有資訊上傳到Azure DevOps管道,這樣我們就可以在Azure DevOps Ui中檢視覆蓋率的相關資訊了。 ``` - task: PublishCodeCoverageResults@1 displayName: 'Publish code coverage' inputs: codeCoverageTool: Cobertura summaryFileLocation: '$(Build.SourcesDirectory)/coverlet/reports/Cobertura.xml' ``` 檢視報告 執行構建管道後,結果將在構建的“程式碼覆蓋率報告”選項卡中可見。 ![file](https://blog.stackable.cn/uploads/img-7428ae1d-2121-4ce0-9946-499843d1fc35.png) ![file](https://blog.stackable.cn/uploads/img-008ea0c2-89ff-446d-ad31-a991017c9639.png) ## 常見問題 1.如果在Azure DevOps Linux映象系統中是不可以的,可能會出現`No executable found matching command "dotnet-reportgenerator" `,這個問題很頭疼,我們在安裝生成報告工具的時候並沒有將全域性命令安裝成功,安裝後並沒有更新PATH,要解決這個問題要在呼叫`reportgenerator`另外執行一個CommandLine指令碼: ``` - task: CmdLine@2 inputs: script: 'echo "##vso[task.prependpath]$HOME/.dotnet/tools"' ``` 2.如何生成覆蓋率圖示? - 覆蓋率圖示:`https://img.shields.io/azure-devops/coverage/{組織名稱}/{專案名稱}/2/{分支}` ![Azure DevOps coverage (branch)](https://img.shields.io/azure-devops/coverage/695979933/02DevOpsProject/2/demo2) - 單元測試個數:`https://img.shields.io/azure-devops/tests/{組織名稱}/{專案名稱}/2/{分支}`![Azure DevOps tests (demo2)](https://img.shields.io/azure-devops/tests/695979933/02DevOpsProject/2/demo2) ## Reference https://github.com/microsoft/azure-pipelines-tasks/issues/9472 https://github.com/hueifeng/AzureDevOpsDemo/tree/demo2