Saturday, October 25, 2014

Интеграция OpenCover в .NET проект.

Что такое OpenCover?

OpenCover - это инструмент с открытым кодом, который показывает разработчикам .NET приложений на сколько существующий исходный код покрыт unit-тестами. Ссылка на официальный сайт - https://github.com/sawilde/opencover.

Интеграция OpenCover

Для того, чтобы интегрировать OpenCover в проек, для начала необходимо установить:
  1. NUnit.Runners
  2. OpenCover
  3. 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.config не появляется в файле проекта после добавления указанных выше NuGet-packages, поэтому можно добавить его руками.

Тестовой проект, в который мы интегорируем 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.CoverageReportGenerator и запускаем. В результате получаем coverage-отчет:

Файл с тестовым проектом, можно скачать по ссылке OpenCoverSample.zip