如何使用 OpenCover 和 ReportGenerator 查看单元测试覆盖率结果?

问题描述 投票:0回答:5

我对使用 OpenCover 和 ReportGenerator 很菜鸟,而且在理解如何让它们工作方面我有点费劲。我正在使用 VS.NET 2012“专业”,这意味着我无权访问内置的单元测试覆盖工具。我还安装了 ReSharper,但不想为“dotCover”中的另一个实用程序付费

看起来 OpenCover 和 ReportGenerator 可以满足我的需要,并且我看到了一起下载的文档,但我缺少一些理解。首先,当我下载两者的 nuget 包时,我的目标项目应该是什么?我有一个多层应用程序,所以我假设我的单元测试项目是正确的,或者它甚至重要吗?我在文档中看到,我只是指向使用命令行命令的解决方案的 /bin (我认为),所以也许我什至不需要将这些下载添加到任何特定项目(可能是一个测试工具) )。有人可以告诉我这个是否正确吗?

安装完它们后,我试图获取单元测试覆盖率指标,但软件包附带的文档并不像我希望的那么清晰。是否有任何好的博客文章或链接可以一起使用这些工具来获取指标?

.net unit-testing nuget-package opencover reportgenerator
5个回答
49
投票

您不需要将这些添加到特定项目中

我也使用报告生成器和开盖来生成测试覆盖率结果。这是我用来使用 opencover 生成代码覆盖率的脚本

"C:\Program Files (x86)\OpenCover\OpenCover.Console.exe" -register:user -target:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest.exe" -targetargs:"/noisolation /testcontainer:\"C:\<your project path>\bin\Debug\<project name>.dll\" /resultsfile:C:\Reports\MSTest\<project name>.trx" -filter:"+[*]*" -mergebyhash -output:C:\Reports\MSTest\projectCoverageReport.xml

请注意,如果您的参数需要转义引号,即将带有空格的参数传递给目标进程,那么您可以使用

"
,例如:
-targetargs:"c:\program files"

这是我用来运行报告生成器的脚本。

C:\ReportGenerator\bin\ReportGenerator.exe -reports:"C:\Reports\MSTest\\projectCoverageReport.xml" -targetdir:"C:\Reports\CodeCoverage"

希望这有帮助。


16
投票

使用这些开源工具几年后,我终于创建了一篇关于如何使用 OpenCover 和 ReportCover 生成单元测试覆盖率指标的综合帖子。

这篇文章描述了如何创建

.bat
文件以及执行以下操作所需的命令:

  • 使用 OpenCover 生成单元测试指标的输出报告
  • 使用 ReportGenerator 生成
    .htm
    报告
  • 分析输出数据以解释单元测试覆盖率指标

使用 OpenCover 和 ReportGenerator 获取 .NET 中的单元测试代码覆盖率指标


5
投票

感谢@atconway的教程。 我稍微更新了您的 .bat 脚本,以方便将来的升级和项目更改。

总结一下,要将 OpenCover 与 NUnit 结合使用,您必须将这些核心添加到您的项目中:

  • 开盖
  • NUnit.ConsoleRunner
  • Daniel Palme 的报告生成器

这里是更新的 .bat 文件。 要运行它,只需编辑“设置”并将脚本另存为项目根目录中的 .bat 文件。

@echo off
REM ** Be sure to install these nugets:
REM ** NUnit.ConsoleRunner
REM ** OpenCover
REM ** ReportGenerator
REM **
REM ** All paths should be entered without quotes

REM ** SET TestResultsFileProjectName=CalculatorResults
SET TestResultsFileProjectName=<ANY_NAME>

REM ** SET DLLToTestRelativePath=Calculator\bin\Debug\MyCalc.dll
SET DLLToTestRelativePath=<VALID_PATH>

REM ** Filters Wiki https://github.com/opencover/opencover/wiki/Usage
REM ** SET Filters=+[Calculator]* -[Calculator]CalculatorTests.*
SET Filters=<VALID_FILTERS>

SET OpenCoverFolderName=OpenCover.4.6.519
SET NUnitConsoleRunnerFolderName=NUnit.ConsoleRunner.3.6.1
SET ReportGeneratorFolderName=ReportGenerator.2.5.6

REM *****************************************************************

REM Create a 'GeneratedReports' folder if it does not exist
if not exist "%~dp0GeneratedReports" mkdir "%~dp0GeneratedReports"

REM Remove any previous test execution files to prevent issues overwriting
IF EXIST "%~dp0%TestResultsFileProjectName%.trx" del "%~dp0%TestResultsFileProjectName%.trx%"

REM Remove any previously created test output directories
CD %~dp0
FOR /D /R %%X IN (%USERNAME%*) DO RD /S /Q "%%X"

REM Run the tests against the targeted output
call :RunOpenCoverUnitTestMetrics

REM Generate the report output based on the test results
if %errorlevel% equ 0 (
 call :RunReportGeneratorOutput
)

REM Launch the report
if %errorlevel% equ 0 (
 call :RunLaunchReport
)
exit /b %errorlevel%

:RunOpenCoverUnitTestMetrics
"%~dp0packages\%OpenCoverFolderName%\tools\OpenCover.Console.exe" ^
-register:user ^
-target:"%~dp0packages\%NUnitConsoleRunnerFolderName%\tools\nunit3-console.exe" ^
-targetargs:"--noheader \"%~dp0%DLLToTestRelativePath%\"" ^
-filter:"%Filters%" ^
-mergebyhash ^
-skipautoprops ^
-excludebyattribute:"System.CodeDom.Compiler.GeneratedCodeAttribute" ^
-output:"%~dp0GeneratedReports\%TestResultsFileProjectName%.xml"
exit /b %errorlevel%

:RunReportGeneratorOutput
"%~dp0packages\%ReportGeneratorFolderName%\tools\ReportGenerator.exe" ^
-reports:"%~dp0GeneratedReports\%TestResultsFileProjectName%.xml" ^
-targetdir:"%~dp0GeneratedReports\ReportGenerator Output"
exit /b %errorlevel%

:RunLaunchReport
start "report" "%~dp0GeneratedReports\ReportGenerator Output\index.htm"
exit /b %errorlevel%

0
投票

为多个测试容器配置opencover简直是地狱。

使用我的智能 Powershell 脚本,它可以给你一些想法。

https://github.com/rpokrovskij/opencover4vs.ps1/blob/master/opencover4vs.ps1

您需要配置两个主要内容:如何查找测试 dll 以及要包含到输出中的命名空间。我这样做:

$TestDllsPatterns = @(,'*\bin\Debug\Vse.*.Test.dll')  
$TestableCodeNamespacePatterns = @(,'*') 

注意,我的测试从前缀 Vse 开始。您需要

Debug\Prefix
键来从
Debug\netcore1.1\Vse
等文件夹中筛选出核心 nUnit 测试。


0
投票

我必须从 msi 或 Chocolatey 包安装 OpenCover,因为当我尝试使用 Nugget 包可执行文件运行 OpenCover 命令时会抛出以下错误:

正在承诺...没有结果,这可能有多种原因。这 最常见的原因是: 1) 缺少与过滤器匹配的组件的 PDB,请查看 输出文件并参阅有关过滤器的使用指南(Usage.rtf)。 2)Profiler可能没有正确注册,请参考使用方法 指南和 -register 开关。

© www.soinside.com 2019 - 2024. All rights reserved.