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

43

我是一个OpenCover和ReportGenerator的新手,对于如何使用它们仍有些困惑。我正在使用VS.NET 2012 'Professional',这意味着我无法访问内置的单元测试覆盖工具。我已经安装了ReSharper,但不想再购买其他实用程序'dotCover'。

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

一旦我安装了它们,我正在尝试获取单元测试覆盖度量,而随附的文档并没有像我希望的那样清晰。是否有任何好的博客文章或链接介绍如何使用这些工具一起获取指标?


5
我必须补充一点,OpenCover 的文档是有史以来最糟糕的! - Dr. Strangelove
5个回答

49

您不需要将它们添加到特定项目中。

我使用报告生成器和OpenCover生成测试覆盖率结果。这是我使用的脚本,使用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:\\bin\Debug\.dll\" /resultsfile:C:\Reports\MSTest\.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"

希望这有所帮助。


你的项目路径和项目名称是用于测试项目还是主要项目? - reggaeguitar

16

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

该文章描述了如何创建 .bat 文件以及执行以下命令所需的步骤:

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

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


5

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

总结一下,要使用OpenCover与NUnit,请将以下Nuget添加到您的项目中:

  • OpenCover
  • NUnit.ConsoleRunner
  • 由Daniel Palme创建的ReportGenerator

这是更新后的.bat文件。 只需编辑“settings”并将脚本保存为项目根目录下的.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)分析器可能未正确注册,请参考使用指南和-register开关。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接