dotnet 测试找不到友好名称为"代码覆盖率"的数据收集器



几个月前,当我们的项目还在.NET 4.7.2中时,我们曾使用Visual Studio Test任务在Azure DevOps服务器上运行单元测试。我们使用参数Test files来指定需要运行哪些测试程序集,Code Coverage在那里运行得很好。

由于我们将项目迁移到了.NET5.0,所以我们使用dotnet test来运行单元测试,而现在Code Coverage已经不起作用了。

这里有一个例子:

D:test-2-1_tooldotnetdotnet.exe test A.Test.dll B.Test.dll C.Test.dll --logger trx --results-directory D:test-2-1_temp --settings D:test-2-15s.runsettings
Microsoft (R) Test Execution Command Line Tool Version 16.9.4
Copyright (c) Microsoft Corporation.  All rights reserved.
Starting test execution, please wait...
A total of 22 test files matched the specified pattern.
Data collection : Unable to find a datacollector with friendly name 'Code Coverage'.
Data collection : Could not find data collector 'Code Coverage'

.runsettings的含量

<DataCollectionRunSettings>
<DataCollectors>
<DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<Configuration>
<CodeCoverage>
<ModulePaths>
<Include>
<ModulePath>{someRegexToLimitCodeCoverageToSpecificTestAssemblies}</ModulePath>
</Include>
</ModulePaths>
</CodeCoverage>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>

在另一个较小的项目中,Code Coverage仍然有效,但这里我们指定应该测试哪些项目文件,而不是哪些编译的测试程序集

这是现在的方法吗?如果是,是否也可以让它重新指定测试程序集?

提前感谢!

@LoriB我的Azure Devops管道中的问题是,开发人员使用构建的dll作为测试的项目参数。这适用于运行单元测试,但不适用于代码覆盖率。不使用**/*Tests.dll作为参数我现在把它改为**/*Tests.csproj,现在代码覆盖率就可以工作了。

在问题的示例中,行

D:test-2-1_tooldotnetdotnet.exe test A.Test.dll B.Test.dll C.Test.dll --logger trx --results-directory D:test-2-1_temp --settings D:test-2-15s.runsettings

应该改为

D:test-2-1_tooldotnetdotnet.exe test A.Test.csproj B.Test.csproj C.Test.csproj --logger trx --results-directory D:test-2-1_temp --settings D:test-2-15s.runsettings

甚至更好的

D:test-2-1_tooldotnetdotnet.exe test **/*.Test.csproj --logger trx --results-directory D:test-2-1_temp --settings D:test-2-15s.runsettings

编辑:

但要回答您的问题:

这就是dotnet.exe的帮助所说的:

用法:dotnet test[options]<项目|解决方案>[[--]…]]

参数:<项目|解决方案>要操作的项目或解决方案文件。如果未指定文件,命令将在当前目录中搜索一个文件。

虽然我找到了dll的示例,但dotnet.exe要求提供项目解决方案文件。而不是库或任何其他程序集。由于我无法获得使用dll的代码覆盖率,我建议不要使用程序集作为输入。仅项目或解决方案文件。

这个问题可能有很多不同的根本原因,但对我来说,向测试项目中添加nuget包Microsoft.CodeCoverage有所帮助。

最新更新