Как получить результаты CTest в Хадсон / Дженкинс - PullRequest
21 голосов
/ 13 июня 2011

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

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

1 Ответ

16 голосов
/ 13 июня 2011

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

del build_32\JUnitTestResults.xml
pushd build_32\Tests
"C:\Program Files\CMake 2.8\bin\ctest.exe" -T Test -C RelWithDebInfo --output-on-failure
popd
verify >nul
C:\Python27\python.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 to 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 и выводит их в stdout
  • «Последние 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: ...?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...