.NET Core 2.0 的代码覆盖率

Code coverage with .NET Core 2.0

我正在尝试在我们的 ASP.NET Core 2.0 网络应用程序上设置代码覆盖率。我使用 dotcover(来自 JetBrains)为所有其他构建提供代码覆盖(在构建过程中通过命令行 运行ning dotcover)。

当我从我们的 .NET Core 2.0 Web 应用程序的构建服务器 运行 dotcover 时,我看到了这个。

它声明它已 运行 成功,但随后就挂在那里并且没有创建代码覆盖率文件。

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 test 自己(没有 dotcover)它似乎已经工作,但再次没有创建覆盖输出。

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

我不确定如何为 .NET Core 2.0 应用程序生成代码覆盖率,也不确定数据收集器的方式/内容以及它们应该如何使用。此示例中的数据收集器是 dotcover 吗?

基本上,我只想为 .NET Core 2.0 应用程序生成代码覆盖率。

更新:

根据建议,我安装了 coverlet 作为 dotcover 的替代品。我已经让它工作了,但是我的行为不一致。当我从服务器 运行 我的批处理文件时,一切都很好。

但是当从 TFS 运行 时我得到一个错误。

System.IO.FileNotFoundException: 中没有可用的测试。确保测试项目有包 "Microsoft.NET.Test.Sdk" 的 nuget 引用并且框架版本设置合适,然后重试。

我的项目确实引用了该程序集(当您创建单元测试项目时,VS 本身默认安装了它)。

为什么 TFS 抱怨该程序集确实存在并且可以从命令行手动 运行 而不会出错?

我不知道 dotcover 是否可以与 net core 一起使用,但是你可以看看 coverlet, also you can find an example here: Cross platform code coverage arrives for .NET Core

我刚刚将一个项目从 net461 迁移到 dotnet core,我想保持代码覆盖率。我需要使用 OP 建议的命令行。我正在迁移我之前使用点覆盖生成要推送到 teamcity 的快照文件和 html 报告的假脚本。我可以确认以下内容对我有用:

  • 点网 SDK 2.1.2
  • JetBrains.dotCover.CommandLineTools 2018.1.0
    • 2017.1.20170403.131707 也检测呈阳性
  • Microsoft.NET.Test.Sdk 15.7.0
  • NUnit 3.10.1
  • NUnit3TestAdapter 3.10.0

DotCover cover

<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 analyze

我在生成的快照文件上使用 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) 项目,因为我已经在前面的步骤中完成了这些工作。这些可以根据您的需要删除。
  • OP 确实说在测试完成后点封面似乎挂起。值得指出的是,如果有大量代码和/或程序集,将测试覆盖结束时的快照转换为报告可能需要一段时间。实际上,在生成 html 报告时,您确实会看到点覆盖在测试完成时暂停。使用过滤器 (/Filters=) 参数来减少所覆盖内容的大小,尤其是当您不想对第三方组件进行任何覆盖时。

/Filters=ARG (Optional) Specifies coverage filters. Syntax: +:module=*;class=*;function=*; Use -:myassembly to exclude an assembly from code coverage. Asterisk wildcard (*) is supported here