Как использовать OpenCover и ReportGenerator для просмотра результатов покрытия модульных тестов?

Я новичок в использовании OpenCover и ReportGenerator, и я немного пытаюсь понять, как заставить их работать. Я использую VS.NET 2012 'Professional', что означает, что у меня нет доступа к встроенным инструментам покрытия модульных тестов. У меня также установлен ReSharper, но я не хочу платить за другую утилиту в 'dotCover'

Похоже, что OpenCover и ReportGenerator будут делать то, что мне нужно, и я вижу документацию, которая была загружена вместе, но мне не хватает понимания. Во-первых, когда я загружаю пакеты nuget для обоих, каким должен быть мой целевой проект? У меня есть многослойное приложение, поэтому я предполагаю, что мой проект модульного тестирования правильный, или это вообще имеет значение? Я вижу в документации, я просто указываю на / bin (я думаю) решения, использующего команды командной строки, поэтому, возможно, мне даже не нужно было добавлять эти загрузки в какой-либо конкретный проект (возможно, это был тестовый комплект)). Может кто-нибудь сказать мне, если я правильно понял?

После того, как я их установил, я пытаюсь получить показатели покрытия модульных тестов, и документы, поставляемые с пакетом, не так ясны, как я надеялся. Есть ли хорошие посты в блоге или ссылки, которые проходят через использование этого инструмента вместе, чтобы получить метрики?

5 ответов

Решение

Вам не нужно добавлять их в конкретный проект

Я также использую генератор отчетов и открытую обложку, чтобы получать результаты тестового покрытия. Это скрипт, который я использую для генерации покрытия кода с использованием open cover.

"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

Обратите внимание, что если вашему аргументу нужно экранировать кавычки, т.е. передавать аргументы с пробелами этому целевому процессу, вы можете использовать \ "ie -targetargs:"\"c:\program files\"

Это скрипт, который я использую для запуска генератора отчетов.

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

Надеюсь это поможет.

После нескольких лет использования этих инструментов с открытым исходным кодом я, наконец, создал исчерпывающую статью о том, как использовать OpenCover и ReportCover для генерации метрик покрытия модульных тестов.

В посте описывается, как создать .bat файл и команды, необходимые для выполнения следующих действий:

  • Генерация выходного отчета о показателях модульного теста с использованием OpenCover
  • Генерация .htm отчет с помощью ReportGenerator
  • Анализ выходных данных для интерпретации показателей покрытия модульных тестов

Использование OpenCover и ReportGenerator для получения показателей покрытия кода модульного тестирования в.NET

Спасибо @atconway за ваш урок. Я немного обновил ваш скрипт.bat, чтобы облегчить будущие обновления и изменения проекта.

Подводя итог, чтобы использовать OpenCover с NUnit, вы должны добавить в свой проект следующие нюансы:

  • OpenCover
  • NUnit.ConsoleRunner
  • Генератор отчетов Даниэль Пальме

и вот обновленный.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

вам нужно настроить две основные вещи: как найти ваши тестовые библиотеки и какие пространства имен включить в вывод. Я делаю это так:

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

Обратите внимание, мои тесты начинаются с префикса Все. Вам нужно Debug\Prefix ключ для фильтрации основных тестов nUnit из таких папок, как Debug\netcore1.1\Vse,

Мне пришлось установить OpenCover из msi или шоколадного пакета, потому что, когда я пытаюсь запустить команду OpenCover с помощью исполняемого файла пакета Nugget, выдает следующую ошибку:

Фиксация ... Нет результатов, это могло быть по ряду причин. Наиболее частые причины:1) отсутствие PDB для сборок, соответствующих фильтру. Просмотрите выходной файл и обратитесь к руководству по использованию (Usage.rtf) о фильтрах. 2) профилировщик может быть неправильно зарегистрирован, обратитесь к руководству по использованию и переключателю -register.

Другие вопросы по тегам