Как измерить охват кода в проектах ASP.NET Core в Visual Studio?

Я хочу измерить охват кода моих XUnit-тестов в приложении ASP.NET Core. Инструмент для .NET Core в Visual Studio 2015 - это предварительный просмотр 2, а охват кода пока не работает.

Сообщение в блоге http://dotnetthoughts.net/measuring-code-coverage-of-aspnet-core-applications-using-opencover/ в феврале показывает обходной путь с помощью командной строки открытой обложки. Я ищу более интегрированный способ внутри Visual Studio.

Кто-нибудь слышал о более/более интегрированном способе измерения покрытия кода в сочетании с XUnit?

Ответ 1

Я только что попробовал версию ReSharper 2016.3 EAP 4 (предварительный предварительный просмотр). Помимо выполнения unit test выполнения теперь dotCover возвращает информацию о покрытии кода для моих основных тестовых проектов .net.

Ответ 2

Добавьте пакет NuGet Microsoft.CodeCoverage 1.0.1 на ваш project.json.

Я работаю над Template для Asp.NET, и сейчас я работаю над Unit Tests, поэтому я видел ваше сообщение. Вы можете увидеть проект/конфигурацию здесь.

Ответ 3

Отказ от ответственности. Эти шаги были сделаны из Измерение охвата ядра ASP.NET с помощью OpenCover - DotNetThoughts.

Несмотря на то, что плакат говорит об этом сайте, я думал, что было бы лучше, если бы здесь были эти шаги для процветания.

ПРИМЕЧАНИЕ. Эти инструкции, ориентированные на операционную систему Windows, должны легко работать для любого O/S, поддерживаемого OpenCover и ReportGenerator.

  • Создайте свой веб-сайт ASP.NET Core MVC.
  • Убедитесь, что global.json имеет "тест" в проектах
  • Щелкните правой кнопкой мыши тестовую папку в решении и добавьте новый проект
  • Убедитесь, что тип проекта - это библиотека .NET Core Class
  • Добавьте в ваши зависимости project.json следующее: node:
    • "dotnet-test-xunit": "2.2.0-preview2-build1029",
    • "xunit": "2.2.0-beta3-build3402"
    • "Microsoft.CodeCoverage": "1.0.2"
  • Добавьте в свой проект project.json следующее:
    • "testRunner": "xunit",
  • Напишите свои модульные тесты
  • Загрузите OpenCover и Генератор отчетов
  • Установить OpenCover
  • Извлечь генератор отчетов в каталог установки OpenCover в папке "Генератор отчетов"
  • Создайте BAT файл в своем проекте и назовите его cover.bat
  • Добавьте следующее содержимое:
@echo off

SET dotnet="C:\Program Files\dotnet\dotnet.exe"  
SET opencover="C:\Program Files (x86)\OpenCover\OpenCover.Console.exe"
SET reportgenerator="C:\Program Files (x86)\OpenCover\ReportGenerator\ReportGenerator.exe"

SET targetargs="test"  
SET filter="+[*]NAMESPACE.* -[*.Test]* -[xunit.*]* -[FluentValidation]*"  
SET coveragefile=Coverage.xml  
SET coveragedir=Coverage

REM Run code coverage analysis  
%opencover% -oldStyle -register:user -target:%dotnet% -output:%coveragefile% -targetargs:%targetargs% -filter:%filter% -skipautoprops -hideskipped:All

REM Generate the report  
%reportgenerator% -targetdir:%coveragedir% -reporttypes:Html;Badges -reports:%coveragefile% -verbosity:Error

REM Open the report  
start "report" "%coveragedir%\index.htm"
  1. Замените NAMESPACE на пространство имен проектов.
  2. Если несколько проектов дублируют регулярное выражение +[*]NAMESPACE.* столько раз, сколько необходимо для каждого пространства имен
  3. Сохранить файл
  4. Откройте командную строку и убедитесь, что в тестовом проекте
  5. Типовой обложка для запуска ваших модульных тестов и результатов вашего покрытия в формате HTML или в любом виде, который вы назвали вашим файлом bat на шаге 11.

Ответ 4

Кодировка работает для меня, для .Net Core с использованием Microsoft.CodeCoverage, как указано выше.

Убедитесь, что в тестовый проект добавлен Microsoft.CodeCoverage nuget

Также проверьте файл project.json на вашем основном проекте, атрибут debugType должен быть "полным", а не "переносимым"

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "debugType": "full"
  },

Это исправлено для меня

Ответ 5

Coverlet (https://github.com/tonerdo/coverlet) - это новый проект, который недавно появился. Он работает вместе с msbuild и дает прямое решение для покрытия

Ответ 6

У меня все работает с некоторыми URL-подсказками. (URL внизу)

Это "бедняга", но он запустит htm файл в вашем браузере по умолчанию с некоторыми хорошими отчетами о htm. И намного дешевле, чем версия VS 2017 ENTERPRISE!

Очевидно, вам нужно установить правильное значение __unitTestProject.

REM I call this file zzzCoverageRun.bat , or whatever name you want, but is a .bat file
REM PREREQUISITES
REM In Visual Studio, go to Tools / Nuget Package Manager / Package Manager Console
REM and run below line
REM dotnet tool install --global dotnet-reportgenerator-globaltool --version 4.0.15 


set __currentDirectory=%cd%

set __sln=%__currentDirectory%\..\Solutions\My.Solution.sln
set __unitTestProject=%__currentDirectory%\..\UnitTests\My.UnitTests.csproj


For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set __mydate=%%c-%%a-%%b)
For /f "tokens=1-3 delims=/:" %%a in ('time /t') do (set __mytime=%%a%%b%%c)
echo %__mydate%_%__mytime%


set __thisRunTag=%__localRepositoryName%%__mydate%_%__mytime%

set __coverageShortFileName=coverage.cobertura.xml
set __Common_TestResultsFileName=%TMP%\Zzz.TestResultsDirectory\%__thisRunTag%\%__coverageShortFileName%
REM set __ReportOutputDirectory=$(Build.SourcesDirectory)\TestResults\Coverage\Reports
set __ReportOutputDirectory=%TMP%\Zzz.CoverageResults\%__thisRunTag%
set __BuildConfiguration=Debug

REM build not needed
REM dotnet build "%__sln%"

dotnet test "%__unitTestProject%" --configuration %__BuildConfiguration% --logger:trx /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput="%__Common_TestResultsFileName%"

REM the below works because of the dotnet-reportgenerator-globaltool above
reportgenerator "-reports:%__Common_TestResultsFileName%" "-targetdir:%__ReportOutputDirectory%" -tag:%__thisRunTag% -reportTypes:htmlInline

start "" "%__ReportOutputDirectory%\index.htm"


set __coverageShortFileName=
set __currentDirectory=
set __ReportOutputDirectory=
set __sln=
set __unitTestProject=
set __Common_TestResultsFileName=
set __BuildConfiguration=
set __thisRunTag=

Мой UnitTests.csproj имеет это в нем:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>

    <IsPackable>false</IsPackable>

    <AssemblyName>My.UnitTests</AssemblyName>

    <RootNamespace>My.UnitTests</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="StyleCop.Cache" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.msbuild" Version="2.6.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
    <PackageReference Include="MSTest.TestAdapter" Version="1.3.2" />
    <PackageReference Include="MSTest.TestFramework" Version="1.3.2" />
    <PackageReference Include="Moq" Version="4.10.1" />
  </ItemGroup>

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



</Project>

Примечательно, что "coverlet.msbuild" и "dotnet-reportgenerator-cli". Я знаю, что вам нужен файл "coverlet.msbuild", другой может быть просто экспериментальной вещью, которая вам может понадобиться или не понадобиться.

Я использую множество переменных bat для управления и вывода в папку% TMP%, чтобы VS/git не захотел проверять файлы.

Подсказки пришли от:

https://holsson.wordpress.com/2018/11/30/test-code-coverage-with-net-core-and-tfs/

https://tattoocoder.com/cross-platform-code-coverage-arrives-for-net-core/

https://medium.com/bluekiri/code-coverage-in-vsts-with-xunit-coverlet-and-reportgenerator-be2a64cd9c2f

Ответ 7

OpenCover + ReportGenerator. Установите как пакеты NUGET в один из ваших тестовых проектов (один раз, потому что они просто должны появиться в папке пакета).

Затем вы можете поместить этот powershel https://github.com/rpokrovskij/opencover4vs.ps1 в свою папку решений и настроить его с помощью своих тестовых проектов, используя путь globing, например

$TestProjectsGlobbing = @(, '*. Test.csproj')

Затем вы можете запустить его как обычный Powershel script. Результат должен появиться в папке решения в\TestsResults\report\index.html