我正在尝试在 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:没有可用的测试。确保测试项目有一个nuget参考包" Microsoft.NET.Test.Sdk"和框架版本设置是适当的,然后再试一次。
我的项目确实引用了该程序集(在创建单元测试项目时,VS本身默认安装了该程序集)。
为什么TFS在肯定存在时会抱怨该程序集,并且可以从命令行手动运行而没有错误?
答案 0 :(得分:2)
我不知道dotcover是否适用于网络核心,但您可以查看coverlet,也可以在此处找到示例:Cross platform code coverage arrives for .NET Core
答案 1 :(得分:2)
我刚刚将一个项目从net461迁移到了dotnet核心,我想维护代码覆盖率。使用OP建议的命令行是我所需要的。我正在迁移假脚本,我之前使用点覆盖生成快照文件以推送到teamcity和html报告。我可以确认以下内容对我有用:
<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 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
)项目,因为我已经在上一步中完成了这项工作。这些可以删除,以满足您的需求。
/Filters=ARG
(可选)指定coverage过滤器。句法:+:module=*;class=*;function=*;
使用-:myassembly
从代码覆盖范围中排除程序集。这里支持星号通配符(*
)