如何在Hudson / Jenkins中获得CTest结果

|| 我正在使用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
是CMake插件中的构建目录
Tests
是我所有测试所在的子目录
-T Test
使CTest输出为XML(?!)
verify >nul
将错误级别重置为0,因为如果任何测试失败,CTest会返回> 0,Jenkins将其解释为“整个构建失败”,这是我们不希望的。 最后一行将CTest \的XML转换为最小的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,直接链接 它带有两个参数,测试所在的目录(在build目录中)和一个xsl文件 它仅读取最后的xml测试结果,并使用xsl对其进行转换,然后将其输出到stdout last6ѭ文件的第一行中存在“最后的xml测试”,因此需要附加的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
好吧,那很丑。但是,仍然希望这对某人有帮助。并欢迎进行改进(也许从python运行ctest?使用Python插件的路径而不是C:...?)     

要回复问题请先登录注册