【问题标题】:Code coverage with .NET Core 2.0.NET Core 2.0 的代码覆盖率
【发布时间】:2023-03-08 13:17:01
【问题描述】:

我正在尝试在我们的 ASP.NET Core 2.0 Web 应用程序上设置代码覆盖率。我使用 dotcover(来自 JetBrains)为我的所有其他构建提供代码覆盖(通过在构建过程中从命令行运行 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 抱怨该程序集确实存在并且可以从命令行手动运行而不会出现错误?

【问题讨论】:

  • 我想知道它是付费产品,为什么不直接联系他们……他们过去真的很有帮助。如果你得到答案,那么你可以在这里添加它,所以我们都知道是否遇到同样的问题。
  • @balexandre - 同样,我发现他们的支持很好,但他们的命令行工具是免费的,所以那里可能没有足够的动力。

标签: asp.net-core .net-core code-coverage dotcover


【解决方案1】:

我不知道dotcover是否可以与net core一起使用,但是你可以看看coverlet,你也可以在这里找到一个例子:Cross platform code coverage arrives for .NET Core

【讨论】:

  • 我已经尝试过您的建议,但行为不一致。看我的更新。谢谢。
  • 它确实在their page 上声明:“dotCover 计算并报告针对 .NET Framework、Silverlight、和 .NET Core 的应用程序中的语句级代码覆盖率”
  • @balexandre 是的,我希望能够快速启动并运行它,因为我在所有其他构建中都使用了它,它完美地工作并产生了很棒的代码覆盖输出。我在使用它时遇到错误,因此我的问题在这里。
  • 让 Coverlet 与 TFS 一起工作的方法是明确指定项目的名称并禁止它进行构建和恢复,例如dotnet test "MyProject.Tests.csproj" --no-build --no-restore /p:CollectCoverage=true
  • 虽然这没有回答我最初的问题,但我对您提出的解决方案非常满意,可以将其标记为答案。谢谢。
【解决方案2】:

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

  • DotNet 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(可选)指定覆盖过滤器。句法: +:module=*;class=*;function=*; 使用-:myassembly 将程序集排除在代码覆盖范围之外。此处支持星号通配符 (*)

【讨论】:

  • 非常有用的信息,非常感谢。根据之前的建议,我目前正在使用 Coverlet 来覆盖我的代码,但会再次尝试使用您的建议。
猜你喜欢
  • 2018-02-13
  • 2020-07-08
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2017-01-25
  • 2012-06-30
相关资源
最近更新 更多