65.9K
CodeProject 正在变化。 阅读更多。
Home

单元测试:.NET Core、xUnit、OpenCover、ReportGenerator 和 Visual Studio 集成的分支级别代码覆盖率

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2018年10月9日

CPOL

2分钟阅读

viewsIcon

8965

一键获取所有版本的 Visual Studio 中的分支级代码覆盖率报告。

引言

本文旨在为 Visual Studio 提供易于使用的 .NET Framework (.NET Core) 分支级别代码覆盖率工具。

背景

  • 这是针对 4 年前发布的 .NET framework 的 文章的更新版本。
  • 我发现 OpenCover 和 ReportGenerator 仍然是测试 .NET 分支级别单元测试覆盖率的最佳开源选择。感谢原始开发人员维护这些优秀的工具!
  • 本文讨论了最新框架和工具行为上的主要差异。
    • .NET Core 框架更改了 NuGet 包的安装位置。
    • 对于 .NET Core,Opencover 可以直接调用 dotnet 来获取覆盖率结果,而不是调用单元测试框架的运行器。

步骤摘要

  1. 安装 NuGet 包。
  2. 启用调试信息。
  3. 构建整个解决方案。
  4. 执行 Coverage.bat 文件。批处理文件执行以下操作
    1. OpenCover 捕获单元测试结果,并生成 XML 格式的覆盖率报告。使用参考:https://github.com/OpenCover/opencover/wiki/Usage
    2. ReportGenerator 根据 OpenCover 的 '.XML' 文件生成 HTML 报告。使用参考:https://github.com/danielpalme/ReportGenerator
    3. 调用在 coverage 子文件夹中创建的 HTML 摘要报告

通过 NuGet 包安装依赖项

  • XUnit 内置于 Visual Studio 中。但您需要将 NuGet 包升级到最新版本。
  • OpenCover
  • ReportGenerator
PM> install-package OpenCover
PM> install-package ReportGenerator

启用调试信息

默认情况下,dotnet core 二进制文件不会公开 OpenCover 所需的调试信息。

我们需要将 "DebugType" 标签添加到我们要分析的每个项目文件中

<PropertyGroup>
  <DebugType>Full</DebugType>
</PropertyGroup>

创建从 Visual Studio 调用的简单批处理文件

  1. 在单元测试项目中创建以下 .bat 文件,名称为 Coverage.bat
  2. 在此批处理文件中,根据您的项目设置 OpenCoverVersionReportGeneratorVersion 变量。
@ECHO OFF
REM @echo suppresses command line. 
REM ^ is line continuation character

REM for .NET core projects Nuget packages are installed in %UserProfile%\.nuget\packages
REM The %UserProfile% variable is a special system-wide environment variable 
REM It contains %SystemDrive%\Users\{username}

SET PackagesFolder=%UserProfile%\.nuget\packages
SET OpenCoverVersion=4.6.519
SET ReportGeneratorVersion=3.1.2

REM Some of the APIs used by OpenCover to profile the app are missing in .net Core.  
    -oldstyle switch fixes this issue
REM "-filter" to selectively include or exclude assemblies and classes from coverage results.
REM DTOs, auto generated designer files, diagrams files, 
          unit test classes are excluded from coverage report
REM Default filters are: -[mscorlib]* -[mscorlib.*]* -[System]* -[System.*]* -[Microsoft.VisualBasic]* 
@ECHO ON
%PackagesFolder%\opencover\%OpenCoverVersion%\tools\OpenCover.Console.exe ^
    -target:"C:/Program Files/dotnet/dotnet.exe" ^
    -targetargs:"test \"CommonUtilities.UnitTest.csproj\" --configuration Debug --no-build" ^
    -filter:"+[*]* -[*.Tests*]* -[*.UnitTest*]* -[*.XUnitTest*]* -[<assembly>.DataModel]* 
                                -[<assembly>.UnitTest]* -[<assembly>.Diagrams]*" ^
    -filter:-excludebyfile:*\*Designer.cs -mergebyhash ^
    -oldStyle ^
    -register:user ^
    -output:"OpenCoverReport.xml"
@ECHO OFF

REM delete old coverage files
REM /F /Q switches to delete files and directories even with readonly attribute without confirmation
DEL /F /Q .\coverage\*.*

REM Generate HTML based coverage reports
@ECHO ON
%PackagesFolder%\ReportGenerator\%ReportGeneratorVersion%\tools\reportgenerator.exe ^
 -reports:OpenCoverReport.xml -targetdir:coverage Verbosity: Error

REM invoke the html coverage summary in the browser
START "" ".\coverage\index.htm"

Visual Studio 集成

  • 我们可以将 Coverage.bat 可执行文件配置为外部工具。
  • Visual Studio 提供了将外部工具与项目集成的宏。https://msdn.microsoft.com/en-us/library/c02as0cs.aspx?f=255&MSPPError=-2147217396
  • 项目 文件夹中将“外部工具”配置为 Coverage.Bat,如以下屏幕截图所示。
  • 这将在 IDE 中执行命令,并在 Visual Studio 的“输出”窗口中显示输出。
  • 如果将其配置为第一个外部工具,则将其视为“外部命令(N)?”(默认情况下,Visual Studio Enterprise 预先配置了 3 个外部工具)。
  • 您可以将此菜单项添加到必要的工具栏(我配置到“构建”工具栏),如以下步骤所示

示例输出

历史

  • 2018 年 10 月 9 日:初始版本
© . All rights reserved.