42

我是使用 OpenCover 和 ReportGenerator 的菜鸟,我在理解如何让它们工作方面有点挣扎。我正在使用 VS.NET 2012 'Professional',这意味着我无法访问内置的单元测试覆盖率工具。我也安装了 ReSharper,但不想为“dotCover”中的另一个实用程序付费

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

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

4

5 回答 5

48

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

我也使用报告生成器和打开封面来生成测试覆盖率结果。这是我使用 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:\报告\MSTest\projectCoverageReport.xml

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

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

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

希望这可以帮助。

于 2013-05-17T18:25:03.120 回答
14

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

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

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

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

于 2015-06-19T05:14:48.363 回答
5

感谢@atconway 的教程。我已经稍微更新了您的 .bat 脚本,以简化未来的升级和项目更改。

总而言之,要将 OpenCover 与 NUnit 一起使用,您必须将这些 nuget 添加到您的项目中:

  • 开盖
  • 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%
于 2017-03-30T18:29:06.347 回答
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.

于 2017-04-03T20:37:23.633 回答
0

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

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

于 2021-10-13T14:20:02.180 回答