我正在使用CTest(CMake的一部分)进行自动化测试。
如何在Jenkins仪表板中获得CTest结果?或者,换句话说,如何使CTest以类似JUnit的XML输出?
在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
Tests
-T Test
verify >nul
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)
Testing/TAG
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
build_32/JUnitTestResults.xml
好吧,那很丑。但是,仍然希望这对某人有帮助。欢迎进行改进(可以从python运行ctest?使用Python插件的路径而不是C:…?)