Хадсон, C++ и UnitTest++
Кто-нибудь использовал Hudson в качестве сервера непрерывной интеграции для проекта C++, используя UnitTest ++ в качестве библиотеки тестирования?
Как именно вы это настроили?
Я знаю, что раньше было несколько вопросов о непрерывной интеграции, но я надеюсь, что этот вопрос имеет более узкий охват.
РЕДАКТИРОВАТЬ: Я немного уточнить, что я ищу. У меня уже есть набор сборок, который дает сбой при сбое модульных тестов. Я ищу что-то вроде поддержки Хадсона JUnit. UnitTest++ может создавать отчеты XML (см. Здесь). Так что, возможно, если кто-то знает, как перевести эти отчеты, чтобы они были совместимы с JUnit, Хадсон будет знать, как их съесть?
6 ответов
Мы активно занимаемся этим на моем рабочем месте.
В настоящее время мы используем проект программного обеспечения в свободном стиле, чтобы:
- Проверяйте наш репозиторий Subversion на обновления каждые 15 минут
- Вызовите пакетный файл Windows для очистки и построения файла решения.
- Файлы проекта создают и запускают модульные тесты как событие после сборки
- Ошибки модульного теста возвращаются тестом
main()
, таким образом, рассматриваются как ошибки сборки
Я также протестировал конфигурацию, которая использует XmlTestReporter, включенный в UnitTest++, для генерации выходных файлов. Плагин xUnit изначально поддерживает этот вывод, наряду с любым другим выводом, который вы можете преобразовать, хотя мне пришлось изменить файл XSL, который прилагался к нему в версии 0.1.3, чтобы получить длительности, записанные в истории тестов.
Есть много вещей, которые мы хотели бы улучшить в нашей интеграции; журналы сборки длинные и трудные для разбора, без окраски или выделения, и т. д., но до сих пор это было для нас полезным.
Я проверил плагин xUnit, как предложил Патрик Джонмейер в принятом ответе. Для полноты, вот код драйвера:
#include <fstream>
#include "UnitTest++.h"
#include "XmlTestReporter.h"
int main( int argc, char *argc[] ) {
std::ofstream f("file.xml");
UnitTest::XmlTestReporter reporter(f);
return UnitTest::RunAllTests(reporter, UnitTest::Test::GetTestList(), NULL, 0);
}
В конфигурации Hudson установите флажок "Опубликовать отчет о результатах инструментов тестирования" и укажите его "file.xml"
У Хадсона теперь есть плагин CppUnit, который может добиться цели.
Я использую Hudson с выходом CppUnit и xml. Xml переводится xslt в вывод JUnit, как. Сайт CppUnit предоставляет xslt, который преобразует выходные данные CppUnit в выходные данные JUnit. Я немного его взломал, чтобы узнать подробности:
- пространства имен как пакеты
- время исполнения
Вы можете преобразовать свой вывод XML, чтобы получить следующее:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite>
<testcase name="my test name"
classname="Package1.Package2.TestClass"
time="0.25">
<error type="error"/>
</testcase>
....
</testsuite>
В случае успеха: просто удалите вложенный тег
С уважением
Задолго до того, как я начал использовать Hudson, я работал над проектом C++, где мы использовали cpp-unit-lite и CruiseControl
Мы изменили Cpp-unit-lite для генерации JUnit, таких как файлы отчетов XML, а CruiseControl взял файлы отчетов XML.
Вы можете сделать то же самое для UnitTest++, и Хадсон подберет файлы отчетов.
Тем не менее, это похоже на большую работу. Взгляните на сюжетный плагин для Hudson. У вас может быть скрипт, который извлекает количество неудачных / пройденных тестов из выходных данных UnitTest++ и использует плагин plot, чтобы нарисовать простой график прохождения / неудачных тестов для каждой сборки.
Не так хорошо, как встроенный отчет о модульных тестах, но вы можете быстро приступить к работе.
Мы использовали аналогичный подход в моем офисе, за исключением использования cxxtest вместо UnitTest++, и сейчас мы находимся в процессе перехода на чрезвычайно превосходную (imho) среду gtest для google.
С cxxtest мы сделали нечто похожее на то, что предложил Патрик Дж. Это было, в основном, добавить шаг сборки, который запускал бы программу набора тестов через ant и приводил к сбою сборки в случае неудачи каких-либо тестов. Недостаток этого подхода заключается в том, что когда сборка завершается неудачно из-за результатов теста, вам нужно искать выход консоли, чтобы выяснить, что пошло не так. Также вы теряете изящные диаграммы, которые может генерировать hudson, если ваша тестовая среда может выводить совместимый с junit XML.
Одним из мотивирующих факторов для перехода на gtest является то, что он генерирует junit XML, поэтому теоретически hudson может анализировать результаты теста и публиковать их более разумным способом. В любом случае, не похоже, что UnitTest ++ генерирует что-то подобное (пожалуйста, исправьте меня, если я ошибаюсь), так что это может быть спорным вопросом, но, по крайней мере, интеграция его в ваш процесс сборки обеспечит запуск тестов во время строит.