Что такое OpenCover?
OpenCover - это инструмент с открытым кодом, который показывает разработчикам .NET приложений на сколько существующий исходный код покрыт unit-тестами. Ссылка на официальный сайт - https://github.com/sawilde/opencover.
Интеграция OpenCover
Для того, чтобы интегрировать OpenCover в проек, для начала необходимо установить:
- NUnit.Runners
- OpenCover
- ReportGenerator
Данную процедуру можно сделать при помощь Library Package Manager (NuGet). Сперва необходимо добавить поддержку востановления NuGet-packages для .sln-файла проекта.
Далее переходим в панель управление NuGet-packages.
В поле для поиска вводим поочередно название NuGet-package и устанавливаем его. В итоге в .nuget папке должен появиться файл packages.config с содержимым:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NUnit.Runners" version="2.6.3" />
<package id="OpenCover" version="4.5.3207" />
<package id="ReportGenerator" version="2.0.0.0" />
</packages>
<packages>
<package id="NUnit.Runners" version="2.6.3" />
<package id="OpenCover" version="4.5.3207" />
<package id="ReportGenerator" version="2.0.0.0" />
</packages>
Файл packages.config не появляется в файле проекта после добавления указанных выше NuGet-packages, поэтому можно добавить его руками.
Тестовой проект, в который мы интегорируем OpenCover, имеет следующую структуру:
Компилируем приложение OpenCoverSample.CoverageReportGenerator и запускаем. В результате получаем coverage-отчет:
Тестовой проект, в который мы интегорируем OpenCover, имеет следующую структуру:
Так как OpenCover не может сгенерировать coverage-отчет без unit-test runner, необходимо создать .bat файл, который выполнит все наши тесты (RunTests.bat). Содержимое RunTests.bat:
..\..\..\..\packages\NUnit.Runners.2.6.3\tools\nunit-console.exe OpenCoverSample.Core.UnitTests.dll /noshadow
После того, как мы научились выполнять unit-тесты, мы можем построить coverage-отчет. Для этого создадим RunOpenCover.bat файл со следующим содержимым:
..\..\..\..\packages\OpenCover.4.5.3207\OpenCover.Console.exe -target:RunTests.bat -register:user -filter:"+[OpenCoverSample*]* -[OpenCoverSample.Core.UnitTests]*"
..\..\..\..\packages\ReportGenerator.2.0.0.0\reportgenerator.exe -reports:results.xml -targetdir:coverag
.\coverag\index.htm
Так как мы не хотим, чтобы в coverage-отчет входили сборки с unit-тестами, мы добавили фильт, который будет игнорировать их.
Для файлов RunOpenCover.bat и RunTests.bat атрибуту Copy to Output Directory ставим значение "Copy always".
Далее добавим ссылку на проект с unit-тестами в проект OpenCoverSample .CoverageReportGenerator.
В OpenCoverSample.CoverageReportGenerator Program.cs добавляем код, который будет генерировать отчет:
namespace OpenCoverSample.CoverageReportGenerator
{
class Program
{
static void Main(string[] args)
{
var process = new System.Diagnostics.Process();
var startInfo = new System.Diagnostics.ProcessStartInfo
{
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
FileName = "RunOpenCover.bat",
RedirectStandardOutput = true,
UseShellExecute = false
};
process.StartInfo = startInfo;
process.OutputDataReceived += (sender, a) => Console.WriteLine(a.Data);
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
}
}
}
Файл с тестовым проектом, можно скачать по ссылке OpenCoverSample.zip