如何衡量 ASP.NET 核心项目中 Visual Studio 的代码覆盖率?

How to measure Code Coverage in ASP.NET Core projects in Visual Studio?

我想测量 ASP.NET 核心应用程序中我的 XUnit 测试的代码覆盖率。 Visual Studio 2015 中的 .NET Core 工具是预览版 2,目前代码覆盖还不起作用。

2 月份的博客 post http://dotnetthoughts.net/measuring-code-coverage-of-aspnet-core-applications-using-opencover/ 显示了使用命令行打开封面的解决方法。我正在 Visual Studio 中寻找更集成的方式。

有没有人听说过结合 XUnit 测量代码覆盖率的更好/更集成的方法?

NuGet package Microsoft.CodeCoverage 1.0.1 添加到您的 project.json

我正在为 Asp.NET 开发模板,现在我正在开发单元测试,所以我看到了您的 post。你可以看到 project/configuration here.

我刚刚试用了 ReSharper 版本 2016.3 EAP 4(抢先体验预览版)。除了单元测试执行,现在 dotCover returns 我的 .net 核心测试项目的代码覆盖信息。

免责声明:这些步骤来自 Measuring ASP.NET Core Coverage with OpenCover - DotNetThoughts

尽管海报上提到了这个网站,但我认为最好还是在这里进行这些步骤以实现繁荣。

注意:这些说明虽然是为 windows 操作系统量身定制的,但应该很容易适用于 OpenCover 和 ReportGenerator 支持的任何 O/S。

  1. 创建您的 ASP.NET 核心 MVC 网站
  2. 确保global.json在项目"test"中有
  3. 右键单击解决方案中的测试文件夹并添加一个新项目
  4. 确保项目类型是 .NET Core Class 库
  5. 将以下内容添加到您的 project.json 依赖项节点:
    • "dotnet-test-xunit": "2.2.0-preview2-build1029",
    • "xunit":“2.2.0-beta3-build3402”
    • "Microsoft.CodeCoverage": "1.0.2"
  6. 在你的project.json版本下添加以下内容
    • "testRunner": "xunit",
  7. 编写单元测试
  8. 下载OpenCover and Report Generator
  9. 安装 OpenCover
  10. 将 Report Generator 提取到名为 Report Generator 的文件夹中的 OpenCover 安装目录中
  11. 在您的项目中创建一个 BAT 文件并将其命名为 cover.bat
  12. 添加以下内容:
@echo off

SET dotnet="C:\Program Files\dotnet\dotnet.exe"  
SET opencover="C:\Program Files (x86)\OpenCover\OpenCover.Console.exe"
SET reportgenerator="C:\Program Files (x86)\OpenCover\ReportGenerator\ReportGenerator.exe"

SET targetargs="test"  
SET filter="+[*]NAMESPACE.* -[*.Test]* -[xunit.*]* -[FluentValidation]*"  
SET coveragefile=Coverage.xml  
SET coveragedir=Coverage

REM Run code coverage analysis  
%opencover% -oldStyle -register:user -target:%dotnet% -output:%coveragefile% -targetargs:%targetargs% -filter:%filter% -skipautoprops -hideskipped:All

REM Generate the report  
%reportgenerator% -targetdir:%coveragedir% -reporttypes:Html;Badges -reports:%coveragefile% -verbosity:Error

REM Open the report  
start "report" "%coveragedir%\index.htm"
  1. 将 NAMESPACE 替换为您的项目命名空间。
  2. 如果有多个项目,请根据每个命名空间的需要多次复制正则表达式+[*]NAMESPACE.*
  3. 保存文件
  4. 打开命令提示符并确保在您的测试项目中
  5. 键入 cover 以进行单元测试 运行 并且您的覆盖结果采用 HTML 格式,或者您在第 11 步中为 bat 文件命名的任何名称。

codecoverage 对我有用,对于 .Net Core 使用 Microsoft.CodeCoverage 如上所述。

检查您是否已将 Microsoft.CodeCoverage nuget 添加到您的测试项目

还要检查主项目上的 project.json 文件,debugType 属性应该是 "full" 而不是 "portable"

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "debugType": "full"
  },

这对我来说是固定的

OpenCover+报告生成器。作为 NUGET 包安装到您的测试项目之一(一次,因为它们只需要出现在包文件夹中)。

然后您可以将此 powershel https://github.com/rpokrovskij/opencover4vs.ps1 放入您的解决方案文件夹,并使用路径通配符将其与您的测试项目一起设置,例如

$TestProjectsGlobbing = @(,'*.Test.csproj')

然后您可以 运行 它作为一个普通的 Powershel 脚本。结果应出现在 \TestsResults\report\index.html

的解决方案文件夹中

Coverlet (https://github.com/tonerdo/coverlet) 是最近出现的一个新项目。它与 msbuild 一起工作,并为覆盖率提供了直接的解决方案

我得到了一些 URL 提示。 (网址在底部)

这是 "poor man's",但它会在您的默认浏览器中触发一个 htm 文件,其中包含一些良好的覆盖率 htm 报告。而且比VS 2017 ENTERPRISE版便宜多了!

显然,您必须将 __unitTestProject 设置为正确的值。

REM I call this file zzzCoverageRun.bat , or whatever name you want, but is a .bat file
REM PREREQUISITES
REM In Visual Studio, go to Tools / Nuget Package Manager / Package Manager Console
REM and run below line
REM dotnet tool install --global dotnet-reportgenerator-globaltool --version 4.0.15 


set __currentDirectory=%cd%

set __sln=%__currentDirectory%\..\Solutions\My.Solution.sln
set __unitTestProject=%__currentDirectory%\..\UnitTests\My.UnitTests.csproj


For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set __mydate=%%c-%%a-%%b)
For /f "tokens=1-3 delims=/:" %%a in ('time /t') do (set __mytime=%%a%%b%%c)
echo %__mydate%_%__mytime%


set __thisRunTag=%__localRepositoryName%%__mydate%_%__mytime%

set __coverageShortFileName=coverage.cobertura.xml
set __Common_TestResultsFileName=%TMP%\Zzz.TestResultsDirectory\%__thisRunTag%\%__coverageShortFileName%
REM set __ReportOutputDirectory=$(Build.SourcesDirectory)\TestResults\Coverage\Reports
set __ReportOutputDirectory=%TMP%\Zzz.CoverageResults\%__thisRunTag%
set __BuildConfiguration=Debug

REM build not needed
REM dotnet build "%__sln%"

dotnet test "%__unitTestProject%" --configuration %__BuildConfiguration% --logger:trx /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput="%__Common_TestResultsFileName%"

REM the below works because of the dotnet-reportgenerator-globaltool above
reportgenerator "-reports:%__Common_TestResultsFileName%" "-targetdir:%__ReportOutputDirectory%" -tag:%__thisRunTag% -reportTypes:htmlInline

start "" "%__ReportOutputDirectory%\index.htm"


set __coverageShortFileName=
set __currentDirectory=
set __ReportOutputDirectory=
set __sln=
set __unitTestProject=
set __Common_TestResultsFileName=
set __BuildConfiguration=
set __thisRunTag=

我的 UnitTests.csproj 里面有这个:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>

    <IsPackable>false</IsPackable>

    <AssemblyName>My.UnitTests</AssemblyName>

    <RootNamespace>My.UnitTests</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="StyleCop.Cache" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.msbuild" Version="2.6.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
    <PackageReference Include="MSTest.TestAdapter" Version="1.3.2" />
    <PackageReference Include="MSTest.TestFramework" Version="1.3.2" />
    <PackageReference Include="Moq" Version="4.10.1" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-reportgenerator-cli" Version="4.0.15" />
  </ItemGroup>  



</Project>

值得注意的是 "coverlet.msbuild" 和 "dotnet-reportgenerator-cli"。我知道您需要 "coverlet.msbuild",另一个可能只是您可能需要或可能不需要的实验。

我使用了很多 bat 变量来驱动东西,并输出到 %TMP% 文件夹以避免 VS/git 想要签入文件。

提示来自:

https://holsson.wordpress.com/2018/11/30/test-code-coverage-with-net-core-and-tfs/

https://tattoocoder.com/cross-platform-code-coverage-arrives-for-net-core/

https://medium.com/bluekiri/code-coverage-in-vsts-with-xunit-coverlet-and-reportgenerator-be2a64cd9c2f