Интеграция Коллекции Code Coverage В Cruisecontrol.net



Введение В последнее время активно пропагандируется практика разработки программного обеспечения через тестирование.

Несомненно, это очень полезно, но не всегда и не все им пользуются.

Таким образом, часть кода покрывается модульными тестами, а часть остается непокрытой.

Мониторинг каждого проекта вручную на предмет того, нормально ли написаны тесты или нет, — задача практически невыполнимая.

Недавно я задался вопросом, как можно автоматизировать процесс сбора метрик, которые показывают процент покрытия кода тестами.

Было решено интегрировать его коллекцию в CruiseControl.NET. Естественно, 100% покрытие не гарантирует отсутствие ошибок, но, по крайней мере, показывает отношение разработчиков к написанию тестов.



Интеграция коллекции Code Coverage в CruiseControl.NET

В этой статье я не буду останавливаться на вопросах, связанных с настройкой CruiseControl для сборки проектов и запуска модульных тестов.

Будут описаны шаги, которые позволят вам собрать необходимую информацию о покрытии кода и отобразить ее на странице тестов.

Для написания модульных тестов наша компания использует фреймворк Microsoft — MSTest. Результаты работы с данным фреймворком будут описаны в статье.

Стоит отметить, что обязательным условием для внедрения покрытия кода является первоначальная настройка CruiseControl для запуска тестов.

Насколько я знаю, в CruiseControl есть встроенные возможности отображения данных, собранных с помощью NCover. Но в связи с тем, что у нас нет возможности купить эту библиотеку, мы используем те методы, которые доступны.

Все описанное ниже применимо к проектам, написанным в Visual Studio 2010. Отличия от версии 2008 хоть и небольшие, но есть.



Создание файла data.coverage на сервере сборки

Visual Studio позволяет настроить выполнение тестов таким образом, что после прохождения всех тестов создается файл, в котором будет храниться информация о пройденных участках кода.

Этот файл будет называться data.coverage (он хранится в папке In с результатами тестирования).

Этот параметр хранится в файле .

testrunconfig вашего проекта.

Через пользовательский интерфейс его можно настроить следующим образом:

  1. Откройте файл .

    testrunconfig.

  2. Выберите данные и диагностику
  3. Установите флажок рядом с «Покрытие кода» и нажмите «Настроить».

  4. Выберите библиотеку, для которой вы хотите собрать материалы
  5. Снимите флажок Сборки приборов на месте.

После сохранения файла он будет содержать следующий текст:
  
  
  
  
  
   

<Эxml version="1.0" encoding="UTF-8"?> <TestSettings name="Local Test Run" id="de0d45b4-4fed-4acb-a663-2cfdf0ce4fd7" xmlns=" http://microsoft.com/schemas/VisualStudio/TeamTest/2010 "> <Description>This is a default test run configuration for a local test run.</Description> <Deployment enabled="false" /> <Execution> <Timeouts testTimeout="300000" /> <TestTypeSpecific> <UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b"> <AssemblyResolution> <TestDirectory useLoadContext="true" /> </AssemblyResolution> </UnitTestRunConfig> </TestTypeSpecific> <AgentRule name="LocalMachineDefaultRole"> <DataCollectors> <DataCollector uri=" datacollector://Microsoft/CodeCoverage/1.0 " assemblyQualifiedName="Microsoft.VisualStudio.TestTools.CodeCoverage.CoveragePlugIn, Microsoft.VisualStudio.QualityTools.Plugins.CodeCoverage, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="Code Coverage"> <Configuration> <CodeCoverage xmlns=""> <Regular> <CodeCoverageItem binaryFile="YourProject\bin\Debug\YourProject.dll" pdbFile="YourProject\bin\Debug\YourProject.pdb" /> </Regular> </CodeCoverage> </Configuration> </DataCollector> </DataCollectors> </AgentRule> </Execution> </TestSettings>

Секция DataCollectors просто сообщает MSTest, что необходимо собирать покрытие кода.

Теперь мы знаем, что следует указать в конфиге, и у нас есть 3 варианта использования этого на сервере сборки:

  • используйте готовый конфиг-файл из вашего проекта;
  • хранить в проекте отдельный конфиг для сервера сборки;
  • создать файл конфигурации на лету.

Первый случай нам не подходит, потому что.

этот файл хранится в системе контроля версий, поэтому любой разработчик может отключить настройку сбора Code Coverage и поставить этот файл обратно.

Или наоборот, если мы, например, не хотим собирать эту метрику в каких-то случаях.

По этим причинам в CruiseControl необходимо включить настройку того, собирать ли метрику или нет. Второй вариант также не полностью предотвращает описанную выше проблему.

По причинам, описанным выше, в нашей компании остановились на третьем варианте.

Как создать XML-файл описывать не буду, все достаточно просто.

Когда конфиг готов, можно запускать тесты.

Для этого в конфиг-файл CruiseControl в разделе с задачами добавьте следующий код:

<exec> <executable>C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe</executable> <buildArgs>"/testcontainer:PathToWorkingDirectory\Source\bin\Release\YourTestProject.dll" "/runconfig:PathToYourConfig\localtestrun.testrunconfig" "/resultsfile:PathToWorkingDirectory\TestResults.xml"</buildArgs> <description>Executing MSTest</description> </exec>

Если вы запустите CruiseControl сейчас, файл data.coverage будет создан в папке PathToWorkingDirectory\[ИМЯ ПОЛЬЗОВАТЕЛЯ]_[ИМЯ-МАШИНЫ] [ДАТА И ВРЕМЯ]\In\[ИМЯ-МАШИНЫ].

в названии папки есть время, то пользоваться им в дальнейшем будет не очень удобно.

Поэтому вам необходимо добавить следующий раздел в .

testrunconfig (внутри ):

<NamingScheme baseName="FolderName" appendTimeStamp="false" useDefault="false" />

Файл data.coverage теперь можно найти в папке PathToWorkingDirectory\FolderName\In\[MACHINE-NAME].

После этих действий в папке с результатами тестирования этого проекта на машине с CruiseControl появится файл data.coverage. Проблема в том, что этот файл двоичный, поэтому нам нужно преобразовать его в xml.

Преобразование data.coverage в XML

Чтобы преобразовать этот файл, вам необходимо написать консольное приложение, которое будет запускаться после прохождения всех тестов.

Здесь все довольно просто, код, выполняющий преобразование, представлен ниже:

using (CoverageInfo info = CoverageInfo.CreateFromFile(PathToDataCoverageFile)) { CoverageDS data = info.BuildDataSet(); string outputXml = data.GetXml(); File.WriteAllText(PathToOutputXmlCoverageFile,outputXml)); }

В выходном XML будет много информации, которая нам не нужна, поэтому мы можем применить XSL-преобразование и оставить только те разделы, которые нам нужны.

Также имена методов будут иметь полное имя, включая пространство имен, что несколько неудобно при отображении подробной информации о покрытии, и эту проблему можно решить, просто изменив полученный XML-файл.

Наше консольное приложение запускается благодаря дополнительному разделу в конфиге сервера сборки:

<exec> <executable>PathToConverter\Coverage2XmlConverter.exe</executable > <buildArgs>"PathToDataCoverage\data.coverage" "PathToOutputXml\coverage.xml"</buildArgs> <description>Calculation code coverage data</description> </exec>



Добавление данных для построения результатов

Теперь у нас почти все готово.

Достаточно добавить полученный XML-файл в результаты сборки.

Делается это довольно просто, нужно в конфиг CruiseControl внутри раздела Publishers добавить следующий раздел:

<merge> <files> <file>PathToResults\TestResult.xml</file> <file>PathToCoverage\coverage.xml</file> </files> </merge>

Файл TestResult.xml уже должен быть в вашей конфигурации, если вы настроены на работу с тестами.



Отображение данных на странице сборки

Остается только написать XSLT-файл для отображения собранных данных на странице со сборкой.

В сборках с покрытием менее 20% индикатор покрытия кода будет красным, в случае 20–50% — желтым, а в случае > 50% — зеленым.

Вы можете легко изменить эти значения в XSLT и использовать те, которые подходят вам лучше всего.

Мы показываем общее значение покрытия на странице сборки, вот как оно выглядит сейчас:

Интеграция коллекции Code Coverage в CruiseControl.NET

Для этого мне пришлось немного доработать MSTestReport2008.xsl из стандартного набора CruiseControl.NET. А вот как выглядят подробные метрики покрытия кода:

Интеграция коллекции Code Coverage в CruiseControl.NET

Я не буду занимать место в статье XSLT-текстом, поэтому разместил ее на GitHub 2 файла XSLT вместе с приложением для преобразования файла data.coverage в XML. Спасибо большое, буду рад вашим комментариям и дополнениям.

Теги: #.

NET #покрытие кода #круиз-контроль #cruisecontrol #csharp #.

NET

Вместе с данным постом часто просматривают: