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






4.50/5 (2投票s)
一键获取所有版本的 Visual Studio 中的分支级代码覆盖率报告。
引言
本文旨在为 Visual Studio 提供易于使用的 .NET Framework (.NET Core) 分支级别代码覆盖率工具。
背景
- 这是针对 4 年前发布的 .NET framework 的 文章的更新版本。
- 我发现 OpenCover 和 ReportGenerator 仍然是测试 .NET 分支级别单元测试覆盖率的最佳开源选择。感谢原始开发人员维护这些优秀的工具!
- 本文讨论了最新框架和工具行为上的主要差异。
- .NET Core 框架更改了 NuGet 包的安装位置。
- 对于 .NET Core,Opencover 可以直接调用 dotnet 来获取覆盖率结果,而不是调用单元测试框架的运行器。
步骤摘要
- 安装 NuGet 包。
- 启用调试信息。
- 构建整个解决方案。
- 执行 Coverage.bat 文件。批处理文件执行以下操作
- OpenCover 捕获单元测试结果,并生成 XML 格式的覆盖率报告。使用参考:https://github.com/OpenCover/opencover/wiki/Usage
- ReportGenerator 根据 OpenCover 的 '.XML' 文件生成 HTML 报告。使用参考:https://github.com/danielpalme/ReportGenerator
- 调用在 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 调用的简单批处理文件
- 在单元测试项目中创建以下 .bat 文件,名称为 Coverage.bat。
- 在此批处理文件中,根据您的项目设置
OpenCoverVersion
和ReportGeneratorVersion
变量。
@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 日:初始版本