是否可以在 Azure DevOps 中使用 coverlet 获取 .NET Framework 项目的代码覆盖率?

Is it possible to get Code Coverage of .NET Framework Project using coverlet in Azure DevOps?

我很容易配置为在 Azure DevOps 中获取 .NET Core 项目的覆盖率结果,但在 .NET Framework 项目中运气不佳。
所以,我将非常感谢得到建议这是因为封面文档明确表示我们也可以将其用于 .NET Framework 项目。 这个问题有点像我的,但我没有看到任何答案, Can you use Coverlet to get code coverage data in a .NET Framework project?

是的,您可以对来自 ASP.NET 项目的覆盖率数据进行编码。正如@riQQ 在 this thread.

中建议的那样简单

以下内容补充和转载@riQQ在上帖的回答

准备了一个webform app和.net framework单元测试,在repo中添加了coverlet.runsettings文件,内容参考Coverlet options supported by VSTest integration:

<?xml version="1.0" encoding="utf-8" ?>
<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="XPlat code coverage">
        <Configuration>
          <Format>json,cobertura</Format>          
          <Exclude>[coverlet.*.tests?]*,[*]Coverlet.Core*</Exclude> <!-- [Assembly-Filter]Type-Filter -->
          <Include>[coverlet.*]*,[*]Coverlet.Core*</Include> <!-- [Assembly-Filter]Type-Filter -->
          <ExcludeByAttribute>Obsolete,GeneratedCodeAttribute,CompilerGeneratedAttribute</ExcludeByAttribute>
          <ExcludeByFile>../dir1/class1.cs,../dir2/*.cs,../dir3/**/*.cs,</ExcludeByFile> <!-- Absolute or relative file paths -->
          <IncludeDirectory>../dir1/,../dir2/,</IncludeDirectory>
          <SingleHit>false</SingleHit>
          <UseSourceLink>true</UseSourceLink>
          <IncludeTestAssembly>true</IncludeTestAssembly>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

配置 VSTest 任务:

可以成功生成覆盖文件:

Passed   TestMethod1
Results File: D:\a\_temp\TestResults\VssAdministrator_fv-az38_2020-03-17_07_53_28.trx
Attachments:
  D:\a\_temp\TestResults\*******-****-****-****-**********\VssAdministrator_fv-az38 2020-03-17 07_53_18.coverage
Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.
Test Run Successful.

注意:如果您想要运行这个基于自托管代理的构建,您可能需要确保安装了 VS Enterprise,请参阅 "Cannot find CodeCoverage.exe" on self-hosted agent

最后,我找到了一个更简单的解决方案。在这里,

  • 在测试项目文件中添加<IsTestProject>true</IsTestProject>。

  • 运行 推荐 dotnet test/dotnet test /p:CollectCoverage=true 在测试项目位置(其中 TestProject.csproj存在)

  • 执行运行命令后可能会出现以下错误,

    找不到导入的项目"C:\Program Files\dotnet\sdk.1.100\Microsoft\VisualStudio\v16.0\WebApplications\Microsoft.WebApplication.targets"。

  • 在项目文件(你想要单元测试并获得代码覆盖率)中,更改如下 导入语句

    这个,<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />

    给,<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />

这对我在本地和 Azure DevOps 都有效。

注意:不要忘记在您的测试项目中安装 Coverlet.msbuild。

更新:

上述方法仅在您没有收到 ".Microsoft.WebApplication.targets was not found" 错误时才有效。注释建议的 import 语句将导致最后发布失败,这是显而易见的。所以,我最终使用 Coverlet.Console 并且它运行顺利,没有任何错误。但是,要使用 coverlet.console 我需要 TestProject.dll 文件而不是项目文件(.csproj);所以我不得不为测试项目添加额外的构建任务。 Here 是如何安装和使用的文档 Coverlet.console

希望这对最终登陆这里的人有所帮助。