我正在 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>
MSBuild 扫描程序使用许多标准来确定项目是否是测试项目。
如果您引用测试框架,那么扫描程序将确定整个项目是测试项目,而不对其进行分析。
您可以尝试在相关项目的*.csproj的
PropertyGroup部分下添加
<SonarQubeTestProject>false</SonarQubeTestProject>
。(Setup.csproj和Services.csproj)
<PropertyGroup>
<SonarQubeTestProject>false</SonarQubeTestProject>
</PropertyGroup>