Как получить результаты CTest в Hudson / Jenkins

#junit #hudson #cmake #jenkins #ctest

#junit #хадсон #cmake #дженкинс #ctest

Вопрос:

Я использую CTest (часть CMake) для своих автоматических тестов.

Как мне получить результаты CTest в Jenkins dashboard? Или, выражаясь иначе, как мне заставить CTest выводиться в формате XML, подобном JUnit?

Ответ №1:

В Jenkins после части CMake (вероятно, созданной с помощью плагина CMake) добавьте следующий пакетный скрипт или адаптируйте для сборок в Linux :

 del build_32JUnitTestResults.xml
pushd build_32Tests
"C:Program FilesCMake 2.8binctest.exe" -T Test -C RelWithDebInfo --output-on-failure
popd
verify >nul
C:Python27python.exe external/tool/CTest2JUnit.py build_32/Tests external/tool/CTest2JUnit.xsl > build_32/JUnitTestResults.xml
  
  • build_32 является ли каталог сборки плагином CMake
  • Tests это подкаталог, в котором находятся все мои тесты
  • -T Test выводит CTest в формате XML (?!)
  • verify >nul сбрасывает errorlevel на 0, потому что CTest возвращает > 0, если какой-либо тест завершается неудачно, что Дженкинс интерпретирует как «сбой всей сборки», чего мы не хотим
  • Последняя строка преобразует XML CTest в минимальный формат JUnit xml. Скрипт Python и xslt находятся в исходном каталоге, возможно, вы захотите это изменить.

Скрипт на python выглядит следующим образом (взломан за 10 минут, будьте осторожны) :

 from lxml import etree
import StringIO
import sys

TAGfile = open(sys.argv[1] "/Testing/TAG", 'r')
dirname = TAGfile.readline().strip()

xmlfile = open(sys.argv[1] "/Testing/" dirname "/Test.xml", 'r')
xslfile = open(sys.argv[2], 'r')

xmlcontent = xmlfile.read()
xslcontent = xslfile.read()

xmldoc = etree.parse(StringIO.StringIO(xmlcontent))
xslt_root = etree.XML(xslcontent)
transform = etree.XSLT(xslt_root)

result_tree = transform(xmldoc)
print(result_tree)
  
  • Для этого нужен lxml, прямая ссылка
  • Он принимает два аргумента: каталог, в котором находятся тесты (в каталоге сборки), и файл xsl
  • Он просто считывает последние результаты XML-тестов, преобразует их с помощью xsl и выводит в стандартный вывод
  • «Последние XML-тесты» присутствуют в первой строке Testing/TAG файла, отсюда и дополнительный fopen

XSL выглядит следующим образом. Это довольно минимально, но выполняет свою работу: [РЕДАКТИРОВАТЬ] смотрите улучшенную версию MOnsDaR :http://pastebin.com/3mQ2ZQfa

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>

    <xsl:template match="/Site/Testing">    
        <testsuite>
            <xsl:apply-templates select="Test"/>
        </testsuite>
    </xsl:template>

    <xsl:template match="Test">
        <xsl:variable name="testcasename"><xsl:value-of select= "Name"/></xsl:variable>
        <xsl:variable name="testcaseclassname"><xsl:value-of select= "FullName"/></xsl:variable>
        <testcase name="{$testcasename}" classname="{$testcaseclassname}">
            <xsl:if test="@Status = 'passed'">
            </xsl:if>
            <xsl:if test="@Status = 'failed'">
                <error type="error"><xsl:value-of select="Results/Measurement/Value/text()" /></error>
            </xsl:if>
            <xsl:if test="@Status = 'notrun'">
                <skipped><xsl:value-of select="Results/Measurement/Value/text()" /></skipped>
            </xsl:if>
        </testcase>
    </xsl:template>

</xsl:stylesheet>
  

Наконец, установите флажок «Опубликовать результаты тестов JUnit» (или аналогичный, моя версия на французском языке) и задайте XML-путь в build_32/JUnitTestResults.xml

Ну, это было некрасиво. Но все же, надеюсь, это кому-то поможет. И улучшения приветствуются (возможно, запуск ctest с python? Используя путь к плагину Python вместо C: … ? )

Комментарии:

1. Большое спасибо за это решение. В настоящее время я играю с ним, и он в основном работает идеально для меня.

2. Я улучшил ваш XSL-код, чтобы поддерживать больше возможностей XML-вывода CTest: pastebin.com/GAj7Fzqd Теперь он добавляет время выполнения тестов, а в случае ошибки добавляет errortype и errorcode в виде сообщения. Пожалуйста, прокомментируйте, есть ли что-то еще, что можно было бы добавить в сгенерированный JUnit-файл.

3. Новая версия поддерживает теги JUnit <Property> и дополнительно сохраняет свойства как исходящие из системы (чтобы их можно было увидеть в Jenkins): pastebin.com/3mQ2ZQfa

4. в Linux вы можете использовать xsltproc shell для достижения тех же результатов: скопируйте XSL-файл в некоторое местоположение, а затем используйте следующую команду: xsltproc ctest2junix.xsl Testing / head -n 1 < Testing/TAG /Test.xml > JUnitTestResults.xml head -n ... команда должна быть заключена в обратные кавычки…

5. Я дополнительно улучшил xslt-файл из @MOnsDaR xslt следующим образом: CTest2JUnit.xsl Он заполняет testclassname как ‘this / Path’, тесты и сбои.

Ответ №2:

Похоже, в настоящее время это интегрировано в jenkins-ci: