我对使用 OpenCover 和 ReportGenerator 很菜鸟,而且在理解如何让它们工作方面我有点费劲。我正在使用 VS.NET 2012“专业”,这意味着我无权访问内置的单元测试覆盖工具。我还安装了 ReSharper,但不想为“dotCover”中的另一个实用程序付费
看起来 OpenCover 和 ReportGenerator 可以满足我的需要,并且我看到了一起下载的文档,但我缺少一些理解。首先,当我下载两者的 nuget 包时,我的目标项目应该是什么?我有一个多层应用程序,所以我假设我的单元测试项目是正确的,或者它甚至重要吗?我在文档中看到,我只是指向使用命令行命令的解决方案的 /bin (我认为),所以也许我什至不需要将这些下载添加到任何特定项目(可能是一个测试工具) )。有人可以告诉我这个是否正确吗?
安装完它们后,我试图获取单元测试覆盖率指标,但软件包附带的文档并不像我希望的那么清晰。是否有任何好的博客文章或链接可以一起使用这些工具来获取指标?
您不需要将这些添加到特定项目中
我也使用报告生成器和开盖来生成测试覆盖率结果。这是我用来使用 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"
希望这有帮助。
使用这些开源工具几年后,我终于创建了一篇关于如何使用 OpenCover 和 ReportCover 生成单元测试覆盖率指标的综合帖子。
这篇文章描述了如何创建
.bat
文件以及执行以下操作所需的命令:
.htm
报告感谢@atconway的教程。 我稍微更新了您的 .bat 脚本,以方便将来的升级和项目更改。
总结一下,要将 OpenCover 与 NUnit 结合使用,您必须将这些核心添加到您的项目中:
这里是更新的 .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%
为多个测试容器配置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 测试。
我必须从 msi 或 Chocolatey 包安装 OpenCover,因为当我尝试使用 Nugget 包可执行文件运行 OpenCover 命令时会抛出以下错误:
正在承诺...没有结果,这可能有多种原因。这 最常见的原因是: 1) 缺少与过滤器匹配的组件的 PDB,请查看 输出文件并参阅有关过滤器的使用指南(Usage.rtf)。 2)Profiler可能没有正确注册,请参考使用方法 指南和 -register 开关。