未从 Azure Devops .NET 核心构建获得 SonarCloud 中的代码覆盖率

Posted

技术标签:

【中文标题】未从 Azure Devops .NET 核心构建获得 SonarCloud 中的代码覆盖率【英文标题】:Not getting code coverage in SonarCloud from an Azure Devops .NET core build 【发布时间】:2019-10-21 20:40:01 【问题描述】:

我已经使用“.NET Core with SonarCloud”模板在 Azure Devops 中为我的 .NET Core 项目设置了一个管道。当我构建时,分析会在 SonarCloud 中运行,但代码覆盖率为 0%(我的解决方案中有测试)。

无论我对构建进行什么配置调整,我都无法使代码覆盖工作正常。

我错过了什么?

我看到了这篇文章,https://dejanstojanovic.net/aspnet/2019/may/publishing-code-analysis-to-sonarcloud-from-azure-build-pipeline/ 实现了其中描述的 powershell 脚本,但我仍然没有在 SonarCloud 中得到任何代码覆盖

我尝试使用此处描述的床单,但仍然没有乐趣 https://gunnarpeipman.com/aspnet/azure-devops-code-coverage/

我的管道包含以下任务

.NET Core - 恢复 准备分析配置 .NET Core - 构建 .NET Core - 测试 运行代码分析 发布质量门结果

我的测试任务已配置:

参数:--configuration $(BuildConfiguration)

发布测试结果和代码覆盖率 - 已检查

在运行代码分析任务的控制台中,我得到:

10:43:54.7  Fetching code coverage report information from TFS...
10:43:54.702  Attempting to locate a test results (.trx) file...
10:43:54.753  Looking for TRX files in: C:\\TFSBuilds\\TJPYHG04-GHJ01\\_work\\475\\TestResults
10:43:54.755  No test results files found
10:43:54.81  Did not find any binary coverage files in the expected location.
10:43:54.811  Falling back on locating coverage files in the agent temp directory.
10:43:54.812  Searching for coverage files in C:\\TFSBuilds\\TJPYHG04-GHJ01\\_work\\_temp
10:43:54.814  No coverage files found in the agent temp directory.

【问题讨论】:

你能在当地用被单覆盖吗?如果是这样,我会尝试放置一个覆盖步骤并生成一个 lcov 文件以供 Sonar 收集。此外,如果您构建项目而不是整个解决方案,Sonar 在 csproj 中需要一个 ProjectGuid 标签,如您在此处看到的:docs.sonarqube.org/display/SCAN/… 我确实设置了 ProjectsGuids。当我在测试任务中实现 Coverlet 时,我确实在测试任务的控制台中显示了覆盖结果,并说它发布了这些结果,但我无法让 SonarCloud 获取它们(在控制台中它说它找不到他们)。无论我设置什么配置,它们都会发布到 temp 文件夹,SonarCloud 总是在 testresults 文件夹中查找。 【参考方案1】:

希望这个答案仍然与您相关。

最近我遇到了和你类似的问题,我也在使用 Azure DevOps。

我就是这样解决的。

第 1 步 - 将目录更改为您的单元测试子文件夹(与单元测试 .csproj 文件相同)并运行以下 dotnet 命令。

dotnet add package coverlet.msbuild

第 2 步 - 在 SonarCloudPrepare 任务附加属性中添加以下内容或直接附加到 yml 文件中(如果您使用的是 yml 而不是经典编辑器)

    extraProperties: |
      sonar.exclusions=**/obj/**,**/*.dll
      sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/**/coverage.opencover.xml
      sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/*.trx

目录由您选择配置。

或者您也可以在您的存储库中创建一个名为 sonar-project.properties 的文件,并将所有相关的 SonarCloud 属性存储在其中。

第 3 步 - 将以下内容添加到您的 dotnet 测试任务中

- task: DotNetCoreCLI@2
  inputs:
    command: 'test'
    arguments: '--configuration $(BuildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=opencover --logger trx'
    testRunTitle: 'dotnet test'

您可能会注意到“发布测试结果和代码覆盖率”有一个复选框,但我仍然更喜欢使用 /p:CollectCoverage=true

您也可以在本地测试以运行dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover --logger trx 命令,coverage.opencover.xml 将在您的单元测试文件夹中生成。

有关更多参数及其说明,请参阅参考 2 和 3。

旁注:如果您正在执行任何 Sonar 测试包含属性,请注意 Sonar.Tests 和 Sonar.Test.Inclusions 它们的测试是不同的。哈哈

参考资料:

    Using SonarCloud in Azure pipelines Analysis Parameters (official docs) Test Coverage & Execution (official docs)

希望这会有所帮助:)

【讨论】:

为声纳添加报告路径对我有用。对于测试命令DotNetCoreCLI@2,不需要添加--logger trx,因为它已经在天蓝色管道中添加了(实际上会抛出一个错误,说不能测试超过1个项目)【参考方案2】:

没有从 Azure Devops .NET 核心构建获得 SonarCloud 中的代码覆盖率

这个问题可能是由vstest output path changed recently引起的:

vstest 覆盖文件的输出路径从 D:\a\1\s\TestResults\...D:\a\_temp\...

这破坏了管道中的后续脚本(例如,codecoverage.exe 转换为 xml,然后导入到 sonarqube)。

Microsoft 建议使用其余 API 检查测试工件并将其重新下载到构建代理。

关于这个问题的更多调查,您可以查看线程Azure DevOps (VSTS) extension no longer import coverage and unit tests automatically进行问题跟踪。

幸运的是,SonarSourcer 团队刚刚发布了新版本的 SonarQube (v4.6.3) 和 SonarCloud (v1.6.3) 扩展,以解决覆盖问题和回归问题。

希望这会有所帮助。

【讨论】:

谢谢 Leo,是的,我遇到了那个帖子,希望这是问题所在,但我们在 DevOps 中安装了最新版本的 SonarCloud 扩展,所以我不认为这是不幸的 @TraceyPenberthy,对不起。再次阅读文档dejanstojanovic.net/aspnet/2019/may/… 后,我发现管道中有一个额外的步骤来准备您的测试结果以上传到 SonarCloud,如果可能,您可以检查它是否有帮助。 感谢 Leo,我确实尝试实现了该文章中描述的附加 powershell 脚本任务“分析 CodeCoverage 报告”,但它对我不起作用:( 我也有同样的问题,有什么解决办法吗?

以上是关于未从 Azure Devops .NET 核心构建获得 SonarCloud 中的代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

构建 .NET 5.0 项目 Azure DevOps 管道

Azure DevOps 中项目的 Sonarqube 扫描问题

如何在 Azure DevOps Server 2020 中为 C#10 / .NET 6.0 项目创建构建任务

Service Fabric Guest .Net Core 3.1 API exe 的 Azure DevOps 构建管道在创建包时失败

.NET Core WebJob 控制台应用程序 CI/CD 使用 Azure DevOps Pipelines

如何在 Azure DevOps 中安装 net6 的 iOS 工作负载?