So erhalten Sie CTest-Ergebnisse in Hudson / Jenkins
Frage
Ich verwende CTest (Teil von CMake) für meine automatisierten Tests.
Wie erhalte ich CTest-Ergebnisse im Jenkins-Dashboard?Oder anders ausgedrückt: Wie kann ich CTest in JUnit-ähnlichem XML ausgeben?
Lösung
Fügen Sie in Jenkins nach dem CMake-Teil (wahrscheinlich über das CMake-Plugin erstellt) das folgende Batch-Skript hinzu oder passen Sie es für Builds unter Linux an:
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
ist das Build-Verzeichnis im CMake-Plugin -
Tests
ist das Unterverzeichnis, in dem alle meine Tests leben -
-T Test
gibt CTest in XML aus (?!) -
verify >nul
setzt die Fehlerstufe auf 0 zurück, da CTest> 0 zurückgibt, wenn ein Test fehlschlägt, was Jenkins als "der gesamte Build ist fehlgeschlagen" interpretiert, was wir nicht wollen - In der letzten Zeile wird das XML von CTest in eine minimale JUnit-XML konvertiert. Das Python-Skript und das xslt befinden sich im Quellverzeichnis. Möglicherweise möchten Sie dies ändern.
Das Python-Skript sieht folgendermaßen aus (in 10 Minuten zusammen gehackt, Vorsicht):
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)
- Es benötigt lxml, direkter Link
- Es werden zwei Argumente benötigt, das Verzeichnis, in dem sich die Tests befinden (im Build-Verzeichnis), und eine xsl-Datei
- Es liest einfach die letzten XML-Testergebnisse, transformiert sie mit dem xsl und gibt sie an stdout aus
- Die "letzten XML-Tests" befinden sich in der ersten Zeile der
Testing/TAG
-Datei, daher das zusätzliche fopenDas xsl sieht so aus. Es ist ziemlich minimal, erledigt aber die Aufgabe: [BEARBEITEN] siehe MOnsDaRs verbesserte Version: http://pastebin.com/3mQ2ZQfa < / a>
<?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>