Sonarqube 和 ADO 上报告的 Sonarqube 覆盖范围问题

问题描述 投票:0回答:1

我正在 Azure Pipelines 中的 .net core 项目上运行声纳分析。

虽然我在 Azure DevOps 中获得了正确的代码覆盖率分析报告,但在 Sonarqube 上获得的代码覆盖率要少得多。

在调查时,我发现对于项目中的 2 个文件夹,在 sonarqube 上,即使我在代码中看到它们,它也不会生成代码覆盖率。

我的管道:

trigger:
- sonar-analysis

pool:
  vmImage: 'ubuntu-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:

- checkout: self
  persistCredentials: true
  submodules: true

- task: SonarQubePrepare@5
  inputs:
    SonarQube: 'sonar-connection'
    scannerMode: 'MSBuild'
    projectKey: 'proj'
    projectName: 'proj'
    extraProperties: |
      sonar.cs.opencover.reportsPaths=$(Agent.TempDirectory)/**/coverage.opencover.xml
      sonar.verbose=true
      sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/**/*.trx

- task: UseDotNet@2
  inputs:
    version: '6.x'

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: '**/**/*.csproj'
    arguments: '--verbosity n'

- task: DotNetCoreCLI@2
  displayName: 'dotnet test'
  inputs:
    command: 'test'
    projects: '**/*Tests/*.csproj'
    arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura,opencover'
  
- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage report'
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'

- task: SonarQubeAnalyze@5
  inputs:
    jdkversion: 'JAVA_HOME_11_X64'

- task: SonarQubePublish@5
  inputs:
    pollingTimeoutSec: '300'

如果我选择 独立扫描仪 选项,那么我会在 Sonarqube 上获得正确的代码覆盖率报告,但是使用 MsBuild 时,它报告的覆盖范围较小,其中 2 个文件夹被排除在覆盖范围之外。

我没有明确提到任何包含/排除模式。

这可能是什么原因以及如何解决?

编辑

在此处提供我的 Test.csproj 文件,因为似乎提到的 2 个 ProjectReferences 被排除在 Sonarqube 的覆盖范围之外。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <IsPackable>false</IsPackable>


  <ItemGroup>
    <PackageReference Include="AutoMapper" Version="12.0.1" />
    <PackageReference Include="coverlet.msbuild" Version="6.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
    <PackageReference Include="Moq" Version="4.18.2" />
    <PackageReference Include="xunit" Version="2.4.2" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="coverlet.collector" Version="3.2.0">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\Core\Setup\Setup.csproj" />
    <ProjectReference Include="..\..\Infrastructure\Services\Services.csproj" />
  </ItemGroup>

</Project> 
.net .net-core azure-devops msbuild sonarqube
1个回答
0
投票

MSBuild 扫描程序使用许多标准来确定项目是否是测试项目。

如果您引用测试框架,那么扫描程序将确定整个项目是测试项目,而不对其进行分析。

您可以尝试在相关项目的*.csproj的

PropertyGroup
部分下添加<SonarQubeTestProject>false</SonarQubeTestProject>。(Setup.csprojServices.csproj

<PropertyGroup>
  <SonarQubeTestProject>false</SonarQubeTestProject>
</PropertyGroup>
© www.soinside.com 2019 - 2024. All rights reserved.