покрытие кода в 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.