.net 应用程序的 gitlab ci/cd 中的代码覆盖率?

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

我最近开始使用

C#
,我正在开发我们拥有的遗留系统之一。我试图弄清楚这个遗留系统的代码覆盖率是多少。这是我的
Sample.UnitTests.csproj
文件:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="AutoFixture.AutoMoq" Version="4.2.1" />
    <PackageReference Include="AutoFixture.NUnit3" Version="4.2.1" />
    <PackageReference Include="coverlet.msbuild" Version="2.9.0">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Moq" Version="4.8.2" />
    <PackageReference Include="nunit" Version="3.9.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.9.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
    <PackageReference Include="WireMock.Net" Version="1.0.4.17" />
    <PackageReference Include="Utf8Json" Version="1.3.7" />
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="System.Buffers" Version="4.5.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="../Sample/Sample.csproj" />
  </ItemGroup>

<ItemGroup>
  <DotNetCliToolReference Include="dotnet-reportgenerator-cli" Version="4.2.10" />
</ItemGroup>

</Project>

我做了一些研究,发现我们可以使用

coverlet
来生成
cobertura
风格的报告。我完全按照我的 mac 盒子上提到的here进行操作,一切正常,我可以看到在我的控制台上正确生成了报告,并且它还生成了
index.html
文件,我们也可以使用该文件进行可视化。

dotnet add package coverlet.msbuild
dotnet restore
dotnet build
dotnet test /p:CollectCoverage=true
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:Exclude="[xunit*]\*" /p:CoverletOutput="./TestResults/"
dotnet reportgenerator "-reports:TestResults/coverage.cobertura.xml" "-targetdir:TestResults/html" -reporttypes:HTML;

现在,由于我们在项目中使用了

gitlab ci/cd
管道 - 有什么方法可以将这部分作为我的
.gitlab-ci.yml
文件的一部分,以便每当构建发生时它就可以自动为我生成报告,并且我团队中的每个人都可以成功地看到它。因为到目前为止,这都是手动的,因为我需要在本地 Mac 上运行上述命令,并且只需单击
index.html
文件即可从控制台看到它。

这些是我的

.gitlab-ci.yml
文件阶段,如下所示。如果需要,我也可以提供我的
yml
文件,但任何可以演示我如何做到这一点的简单示例都会有很大帮助。我尝试了很多搜索,但根本找不到如何通过 gitlab 管道来做到这一点,该管道使用
coverlet
cobertura
样式报告用于 .net 应用程序..

stages:
  - test
  - publish
  - increment
  - deploy
  - integrationTests
  - release

如果需要的话也可以通过 webhook 来完成吗?

c# asp.net-core code-coverage gitlab-ci coverlet
3个回答
5
投票

由于文件夹混乱,另一个答案对我不起作用。 Coverlet 将测试结果放在与各个单元测试项目相关的文件夹中。所以

  • 要么你必须告诉gitlab通过通配符到处搜索
    TestResults
    文件夹,通过将
    path
    设置为
    ./**/TestResults/**/coverage.cobertura.xml
    之类的东西。
  • 或者您提供
    --results-directory
    选项来告诉
    dotnet test
    首先将这些文件放在哪里。

我选择了第二个选项,将所有结果收集在存储库根目录中的

cobertura
文件夹中。这是一个完整、有效的
.gitlab-ci.yml
,用于运行合并请求测试:

image : mcr.microsoft.com/dotnet/sdk:6.0

stages:
  - test

test:
  stage: test
  only:
    - merge_requests
  script:
    - 'dotnet test DotNetSolution 
        --collect:"XPlat Code Coverage"
        --results-directory cobertura'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: cobertura/*/coverage.cobertura.xml


5
投票

我们已经为具有代码覆盖率的 .NET 应用程序设置了 GitLab CI/CD 管道。以下是配置中每个部分的简要说明:

before_script:
  - 'export DOTNET_CLI_TELEMETRY_OPTOUT=1'
  - 'export PATH=$PATH:$HOME/.dotnet/tools'
  - 'dotnet tool install dotnet-reportgenerator-globaltool --global || echo "DRG already installed."'

test:
  stage: test
  needs: 
    - build
  coverage: '/TOTAL_COVERAGE=(\d+.\d+)/'
  script:
    - dotnet test *.sln --collect:"XPlat Code Coverage" --logger "junit;MethodFormat=Class;FailureBodyFormat=Verbose"
    - reportgenerator -reports:"**/coverage.cobertura.xml" -targetdir:"." -reporttypes:"cobertura"
    - COVERAGE_VALUE=$(grep -oPm 1 'line-rate="\K([0-9.]+)' "./Cobertura.xml")
    - COVERAGE=$(echo "scale=2; $COVERAGE_VALUE * 100" | bc)
    - 'echo "TOTAL_COVERAGE=$COVERAGE%"'
  artifacts:
    when: always
    expire_in: 1 day
    paths:
      - ./**/TestResults.xml
      - ./Cobertura.xml
    reports:
      junit:
        - ./**/TestResults.xml
      coverage_report:
        coverage_format: cobertura
        path: ./Cobertura.xml

我们使用 XPlat 代码覆盖率收集器和 JUnit 记录器运行 dotnet 测试。

我们所有的

.csproj
都有依赖项:


  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.2">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="JunitXml.TestLogger" Version="4.1.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
    <PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
    <PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
  </ItemGroup>

这些将输出覆盖率报告为

TestResults/*/coverage.cobertura.xml

我们使用

reportgenerator
将这些结果合并为一个文件来计算总覆盖率,并回显结果。工件(包括测试结果和覆盖率报告)将被保存并设置为在一天内过期。

Code coverage with .NET project


0
投票

可能需要使用实际的 GUID 而不是

*

stages:
  - test
  - publish
  - increment
  - deploy
  - integrationTests
  - release

build-and-test:
  stage: test
  image: mcr.microsoft.com/dotnet/sdk:6.0
  script:
  - dotnet add package coverlet.msbuild
  - dotnet restore
  - dotnet build
  - 'dotnet test --collect:"XPlat Code Coverage"'
  artifacts:
    reports:
      cobertura: TestResults/*/coverage.cobertura.xml

GitLab 可以与之前的 Cobertura 报告进行比较。

如果您想要 HTML,只需将其包含在工件中即可。也可以将其发布到 GitLab Pages。

© www.soinside.com 2019 - 2024. All rights reserved.