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

时间:2013-05-16 15:23:27

标签: .net unit-testing nuget-package opencover reportgenerator

我是使用OpenCover和ReportGenerator的小伙子,我在理解如何让它们工作方面有点挣扎。我正在使用VS.NET 2012'Professional',这意味着我无法访问内置的单元测试覆盖工具。我也安装了ReSharper,但不想在'dotCover'

中支付另一个实用程序

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

一旦我安装了它们,我就会尝试获得单元测试覆盖率指标,而且程序包附带的文档并不像我希望的那样清晰。是否有任何好的博客文章或链接可以一起使用这些工具来获取指标?

4 个答案:

答案 0 :(得分:43)

您无需将这些添加到特定项目

我使用报告生成器和打开封面来生成测试覆盖率结果。这是我用来使用opencover

生成codecoverage的脚本
  

“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:\\ bin \ Debug \。 DLL \”   /resultsfile:C:\Reports\MSTest\.trx“-filter:”+ [] “   -mergebyhash -output:C:\ Reports \ MSTest \ projectCoverageReport.xml

请注意,如果您的参数需要转义引号,即将带有空格的参数传递给该目标进程,那么您可以使用\“ie -targetargs:”\“c:\ program files \”

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

  

C:\ ReportGenerator \ BIN \ ReportGenerator.exe   -reports:“C:\ Reports \ MSTest \ projectCoverageReport.xml”-targetdir:“C:\ Reports \ CodeCoverage”

希望这有帮助。

答案 1 :(得分:13)

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

该帖子描述了如何创建.bat文件以及执行以下操作所需的命令:

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

Using OpenCover and ReportGenerator to get Unit Testing Code Coverage Metrics in .NET

答案 2 :(得分:5)

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

总结一下,要将OpenCover与NUnit配合使用,您必须向项目中添加以下内容:

  • OpenCover
  • NUnit.ConsoleRunner
  • Daniel Palme的ReportGenerator

这里是更新的.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%

答案 3 :(得分: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测试。