#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
является ли каталог сборки плагином CMakeTests
это подкаталог, в котором находятся все мои тесты-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.xmlhead -n ...
команда должна быть заключена в обратные кавычки…5. Я дополнительно улучшил xslt-файл из @MOnsDaR xslt следующим образом: CTest2JUnit.xsl Он заполняет testclassname как ‘this / Path’, тесты и сбои.
Ответ №2:
Похоже, в настоящее время это интегрировано в jenkins-ci: