покрытие кода в gitlab ci/cd для приложений .net?

Я недавно начал работать с 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, и все работает нормально, и я вижу, что отчет создается правильно на моей консоли, а также он генерирует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

Можно ли это сделать и через веб-перехватчик, если нужно?

3 ответа

Другой ответ не сработал для меня из-за путаницы в папках. 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"
        -r cobertura'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: cobertura/*/coverage.cobertura.xml

Мы настроили конвейер GitLab CI/CD для приложения .NET с покрытием кода. Вот краткое объяснение каждого раздела конфигурации:

      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

Мы запускаем dotnet-тест со сборщиком XPlat Code Coverage и регистратором JUnit.

Все наше.csprojимеет зависимости:

      
  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="3.2.0">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="JunitXml.TestLogger" Version="3.0.124" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
    <PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
    <PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
  </ItemGroup>

Они будут выводить отчеты о покрытии в видеTestResults/*/coverage.cobertura.xml.

И мы использовалиreportgeneratorобъединить эти результаты в один файл, чтобы рассчитать общий процент покрытия и повторить результат. Артефакты, включая результаты тестов и отчеты о покрытии, сохраняются, и срок их действия истекает через один день.

Возможно, потребуется использовать фактический 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.

Другие вопросы по тегам