Покрытие кода с помощью .NET Core 2.0

Я пытаюсь настроить покрытие кода в нашем веб-приложении ASP.NET Core 2.0. Я использую dotcover (от JetBrains), чтобы обеспечить покрытие кода во всех других моих сборках (путем запуска dotcover из командной строки во время процесса сборки).

Когда я запускаю dotcover с нашего сервера сборки для нашего веб-приложения .NET Core 2.0, я вижу это.

введите здесь описание изображения

В нем говорится, что он работал успешно, но затем просто зависает и файлы покрытия кода не создаются.

dotcover analyse /TargetExecutable:"C:\Program Files\dotnet\dotnet.exe" /TargetArguments:"test MyUnitTests.csproj" /Output:report.html /ReportType:HTML /LogFile=dotcover.log 

Если я попытаюсь добавить коллекцию покрытия кода, я увижу это.

введите здесь описание изображения

dotcover analyse /TargetExecutable:"C:\Program Files\dotnet\dotnet.exe" /TargetArguments:"test MyUnitTests.csproj --collect:coverage" /Output:report.html /ReportType:HTML /LogFile=dotcover.log

И, наконец, если я запустил тест dotnet самостоятельно (без dotcover), он, похоже, сработал, но снова не создается никакого вывода покрытия.

введите здесь описание изображения

dotnet test "MyUnitTests.csproj" -- collect:coverage

Я не уверен, как сгенерировать покрытие кода для приложения .NET Core 2.0, и не знаю, как / что такое сборщики данных и как их следует использовать. Является ли dotcover сборщиком данных в этом примере?

По сути, я просто хочу создать покрытие кода для приложения .NET Core 2.0.

ОБНОВЛЕНИЕ:

В соответствии с предложением я установил coverlet в качестве альтернативы dotcover. У меня он работает, но ведет себя непоследовательно. Когда я запускаю свой командный файл с сервера, все в порядке.

введите здесь описание изображения

Но при запуске из TFS выдает ошибку.

введите здесь описание изображения

System.IO.FileNotFoundException: в. Убедитесь, что в тестовом проекте есть ссылка nuget на пакет «Microsoft.NET.Test.Sdk» и правильные настройки версии платформы, и повторите попытку.

В моем проекте есть ссылка на эту сборку (она устанавливается по умолчанию самой VS при создании проекта модульного тестирования).

Почему TFS жалуется на эту сборку, если она определенно существует и может быть запущена вручную из командной строки без ошибок?


person DomBurf    schedule 22.03.2018    source источник
comment
Интересно, так как это платный продукт, почему бы не связаться с ними напрямую ... в прошлом они действительно помогали. Если вы получили ответ, вы можете добавить его сюда, чтобы мы все знали, сталкивались ли мы с этой же проблемой.   -  person balexandre    schedule 23.03.2018
comment
@balexandre - Точно так же я нашел их поддержку хорошей, но их инструменты командной строки бесплатны, поэтому там может не хватить импульса.   -  person Bronumski    schedule 11.05.2018


Ответы (2)


Я не знаю, может ли dotcover работать с net core, но вы можете поискать coverlet, также вы можете найти здесь пример: Кросс-платформенное покрытие кода прибывает для .NET Core

person Julito Avellaneda    schedule 22.03.2018
comment
Я попробовал ваше предложение, но веду себя непоследовательно. Смотрите мое обновление. Спасибо. - person DomBurf; 23.03.2018
comment
на их странице указано: dotCover вычисляет и сообщает о покрытии кода на уровне оператора в приложениях, ориентированных на .NET Framework, Silverlight, и .NET Core - person balexandre; 23.03.2018
comment
@balexandre Да, я надеялся запустить его довольно быстро, так как я использую его во всех других своих сборках, он отлично работает и дает потрясающий результат покрытия кода. Я получаю сообщение об ошибке, поэтому здесь мой вопрос. - person DomBurf; 23.03.2018
comment
Способ заставить coverlet работать с TFS состоит в том, чтобы явно указать имя проекта и запретить ему выполнение сборки и восстановления, например. dotnet test MyProject.Tests.csproj --no-build --no-restore / p: CollectCoverage = true - person DomBurf; 23.03.2018
comment
Хотя это не ответило на мой первоначальный вопрос, я достаточно удовлетворен предложенным вами решением, чтобы отметить это как ответ. Спасибо. - person DomBurf; 23.03.2018
comment
Попытка реализовать и возникли проблемы ::: См. Мои примечания по этому вопросу для реализации. (Я только что понял волшебство!) Это немного сложно на Linux .. спойлер, вам нужно дотнет опубликовать UnitTest csproj ..... github.com/tonerdo/coverlet/issues/521 - person granadaCoder; 27.02.2020

Я только что перенес проект с net461 на ядро ​​dotnet и хотел сохранить покрытие кода. Мне было нужно использовать командную строку, предложенную OP. Я переношу фальшивые скрипты, в которых я ранее использовал точечную обложку, чтобы сгенерировать файл моментального снимка, который будет отправлен в teamcity, и отчет в формате html. Я могу подтвердить, что у меня работает следующее:

  • DotNet SDK 2.1.2
  • JetBrains.dotCover.CommandLineTools 2018.1.0
    • Also tested positive with 2017.1.20170403.131707
  • Microsoft.NET.Test.Sdk 15.7.0
  • NUnit 3.10.1
  • NUnit3TestAdapter 3.10.0

Обложка DotCover

<dotcoverpath>\dotCover.exe cover /TargetExecutable:"C:\Program Files\dotnet\dotnet.exe" /TargetArguments:"test --no-build --no-restore ./src/<test-project-root>" /Filters=+:<namespace-to-test> /Output:./bin/DotCover.snapshot

Анализ DotCover

Я не делаю следующего, поскольку использую команду DotCover report на созданный файл моментального снимка, но я также могу подтвердить, что следующее работает и для меня.

<dotcoverpath>\dotCover.exe analyze /TargetExecutable:"C:\Program Files\dotnet\dotnet.exe" /TargetArguments:"test --no-build --no-restore ./src/<test-project-root>" /Filters=+:<namespace-to-test> /ReportType=HTML /Output:./bin/coverage.html

Примечания

  • В моем тестовом прогоне я не восстанавливаю пакеты (--no-restore) и не компилирую (--no-build) проект, поскольку я уже сделал это на предыдущем шаге. Их можно удалить в соответствии с вашими потребностями.
  • Оператор действительно сказал, что точечная крышка, по-видимому, зависла после завершения тестов. Стоит отметить, что преобразование моментального снимка в конце тестового покрытия в отчет может занять некоторое время, если имеется большой объем кода и / или сборок. Фактически вы видите, что точечное покрытие приостанавливается в момент завершения тестов, пока он генерирует отчет в формате html. Используйте параметр filter (/ Filters =), чтобы уменьшить размер покрываемых вещей, особенно если вы не хотите покрывать сторонние компоненты.

/Filters=ARG (Необязательно) Задает фильтры покрытия. Синтаксис: +:module=*;class=*;function=*; Используйте -:myassembly, чтобы исключить сборку из покрытия кода. Здесь поддерживается подстановочный знак звездочки (*)

person Bronumski    schedule 11.05.2018
comment
Очень полезная информация, большое спасибо. В настоящее время я использую покрывало для покрытия своего кода в соответствии с предыдущим предложением, но попробую еще раз, используя ваше предложение. - person DomBurf; 11.05.2018