Вградете колекцията от кодово покритие
Напоследък активно се популяризира практиката за разработка на софтуер Test-Driven Development. Несъмнено е много полезно, но не винаги и не всеки го използва. Следователно част от кода е покрита от модулни тестове, а част остава непокрита. Ръчното следене на всеки проект, независимо дали тестовете са написани добре или не, е почти невъзможна задача. Наскоро се чудех как да автоматизирам процеса на събиране на показател, който показва процента на покритие на кода от тестове. Беше решено колекцията му да бъде вградена в CruiseControl.NET. Естествено, 100% покритие не гарантира липсата на грешки, но поне показва отношението на разработчиците към писането на тестове.
В тази статия няма да се спирам на точките, свързани с настройването на CruiseControl за изграждане на проекти и провеждане на модулни тестове. Ще бъдат описани стъпки, които ще ви позволят да съберете необходимата информация за покритието на кода и да я покажете на тестовата страница. За писане на модулни тестове, нашата компания използва рамка от Microsoft - MSTest. Резултатите от работата с тази рамка ще бъдат описани в статията. Струва си да се отбележи, че предпоставка за покритие на код за вграждане е първоначалната конфигурация на CruiseControl за провеждане на тестове.
Доколкото знам, CruiseControl има вградени възможности за показване на данни, събрани с NCover. Но поради факта, че нямаме възможност да закупим тази библиотека, ние използваме методите, които са налични.
Всичко описано по-долу се отнася за проекти, написани на Visual Studio 2010. Разликите от версията 2008, макар и малки, са налице.
Създаване на файл data.coverage на сървъра за изграждане
Visual Studio ви позволява да персонализирате изпълнението на теста по този начинтака че след преминаване на всички тестове да се създаде файл, който ще съхранява информация за обхванатите секции от кода. Този файл ще се нарича data.coverage (той се съхранява в папката In с резултатите от теста). Тази настройка се съхранява във файла .testrunconfig на вашия проект. Чрез потребителския интерфейс може да се настрои по следния начин:
- Отворете вашия .testrunconfig файл
- Изберете Данни и диагностика
- Поставете отметка в квадратчето до Покритие на кода и щракнете върху Конфигуриране
- Изберете библиотеката, за която искате да съберете покритие
- Махнете отметката от Instrument Assemblys in place
Секцията DataCollectors казва на MSTest да събира кодово покритие.
Сега знаем какво трябва да бъде посочено в конфигурацията и имаме 3 опции за използването му на сървъра за изграждане:
- използвайте готов конфигурационен файл от вашия проект;
- съхранявайте отделна конфигурация за сървъра за изграждане в проекта;
- създайте конфигурационен файл в движение.
Когато конфигурацията е готова, можете да стартирате тестове за това в конфигурационния файл CruiseControl'a в разделасъс задачи, трябва да добавите следния код:
Ако стартирате CruiseControl сега, ще бъде създаден файл data.coverage в папката PathToWorkingDirectory\[USERNAME]_[MACHINE-NAME] [DATE AND TIME]\In\[MACHINE-NAME]. защото има време в името на папката, тогава няма да е много удобно да го използвате в бъдеще. Следователно, следният раздел трябва да бъде добавен към .testrunconfig (вътре):
Файлът data.coverage вече може да бъде намерен в папката PathToWorkingDirectory\FolderName\In\[MACHINE-NAME].
След извършените действия, в папката с резултатите от теста за този проект на машината с CruiseControl ще има файл data.coverage. Проблемът е, че този файл е двоичен, така че трябва да го конвертираме в xml.
Преобразувайте data.coverage в XML
За да конвертирате този файл, трябва да напишете конзолно приложение, което ще се изпълни след преминаване на всички тестове. Тук всичко е доста просто, кодът, който извършва преобразуването, е представен по-долу:
В изходния XML ще има много информация, която не ни трябва, така че можем да приложим XSL трансформация и да оставим само секциите, от които се нуждаем. Освен това имената на методите ще имат пълното име, включително пространството на имената, което е донякъде неудобно при показване на подробна информация за покритие и това се решава чрез просто модифициране на получения XML файл.
Стартирането на нашето конзолно приложение се осъществява благодарение на допълнителен раздел в конфигурацията на сървъра за изграждане:
Добавяне на данни за изграждане на резултати
Вече сме почти готови. Достатъчно е да добавите получения XML файл към резултатите от изграждането. Това се прави съвсем просто, трябва да добавите следния раздел към конфигурацията на CruiseControl в раздела Publishers:
Файлът TestResult.xml вече трябва да е билвие в конфигурацията, ако сте конфигурирани да работите с тестове.
Показване на данни на страницата за изграждане
Остава да напишем XSLT файл, който да покаже събраните данни на страницата с компилацията. При компилации с по-малко от 20% покритие покритието на кода ще бъде червено, 20%-50% ще бъде жълто и>50% ще бъде зелено. Тези стойности могат лесно да се променят в XSLT и да използвате тези, които ви подхождат най-добре.
Показваме общата стойност на покритие на страницата за компилация, ето как изглежда сега:
За да направя това, трябваше леко да модифицирам MSTestReport2008.xsl от стандартния набор CruiseControl.NET.
Ето как изглеждат подробностите за показателя за покритие на кода:
Няма да заемам място в статията с XSLT текст, затова публикувах 2 XSLT файла в GitHub, заедно с приложение за конвертиране на файл data.coverage в XML.
Благодаря ви много, ще има време за коментари и допълнения.
Hardcore conf в C++. Каним само професионалисти.