Введение В последнее время активно пропагандируется практика разработки программного обеспечения через тестирование.
Несомненно, это очень полезно, но не всегда и не все им пользуются.
Таким образом, часть кода покрывается модульными тестами, а часть остается непокрытой.
Мониторинг каждого проекта вручную на предмет того, нормально ли написаны тесты или нет, — задача практически невыполнимая.
Недавно я задался вопросом, как можно автоматизировать процесс сбора метрик, которые показывают процент покрытия кода тестами.
Было решено интегрировать его коллекцию в CruiseControl.NET. Естественно, 100% покрытие не гарантирует отсутствие ошибок, но, по крайней мере, показывает отношение разработчиков к написанию тестов.
В этой статье я не буду останавливаться на вопросах, связанных с настройкой CruiseControl для сборки проектов и запуска модульных тестов.
Будут описаны шаги, которые позволят вам собрать необходимую информацию о покрытии кода и отобразить ее на странице тестов.
Для написания модульных тестов наша компания использует фреймворк Microsoft — MSTest. Результаты работы с данным фреймворком будут описаны в статье.
Стоит отметить, что обязательным условием для внедрения покрытия кода является первоначальная настройка CruiseControl для запуска тестов.
Насколько я знаю, в CruiseControl есть встроенные возможности отображения данных, собранных с помощью NCover. Но в связи с тем, что у нас нет возможности купить эту библиотеку, мы используем те методы, которые доступны.
Все описанное ниже применимо к проектам, написанным в Visual Studio 2010. Отличия от версии 2008 хоть и небольшие, но есть.
Создание файла data.coverage на сервере сборки
Visual Studio позволяет настроить выполнение тестов таким образом, что после прохождения всех тестов создается файл, в котором будет храниться информация о пройденных участках кода.Этот файл будет называться data.coverage (он хранится в папке In с результатами тестирования).
Этот параметр хранится в файле .
testrunconfig вашего проекта.
Через пользовательский интерфейс его можно настроить следующим образом:
- Откройте файл .
testrunconfig.
- Выберите данные и диагностику
- Установите флажок рядом с «Покрытие кода» и нажмите «Настроить».
- Выберите библиотеку, для которой вы хотите собрать материалы
- Снимите флажок Сборки приборов на месте.
Секция DataCollectors просто сообщает MSTest, что необходимо собирать покрытие кода.<Э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>
Теперь мы знаем, что следует указать в конфиге, и у нас есть 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 и использовать те, которые подходят вам лучше всего.
Мы показываем общее значение покрытия на странице сборки, вот как оно выглядит сейчас:
Для этого мне пришлось немного доработать MSTestReport2008.xsl из стандартного набора CruiseControl.NET.
А вот как выглядят подробные метрики покрытия кода:
Я не буду занимать место в статье XSLT-текстом, поэтому разместил ее на GitHub 2 файла XSLT вместе с приложением для преобразования файла data.coverage в XML.
Спасибо большое, буду рад вашим комментариям и дополнениям.
Теги: #.
NET #покрытие кода #круиз-контроль #cruisecontrol #csharp #.
NET
-
Bricsys Представляет Bricscad V12 Для Linux
19 Oct, 24 -
Новый Воскресный Поток: От Sveltejs До Rider
19 Oct, 24 -
Код, В Котором Мы Живем
19 Oct, 24 -
Подборка Полезных Утилит Scss
19 Oct, 24 -
Как Я Писал Политику Безопасности
19 Oct, 24 -
Война И Айтишники.
19 Oct, 24 -
Расширение +1 Для Mozilla Firefox
19 Oct, 24 -
Небольшой Квест По Web 2.0
19 Oct, 24