【问题标题】:How to get CTest results in Hudson / Jenkins如何在 Hudson / Jenkins 中获得 CTest 结果
【发布时间】:2011-09-13 19:50:04
【问题描述】:

我正在使用 CTest(CMake 的一部分)进行自动化测试。

如何在 Jenkins 仪表板中获取 CTest 结果?或者,换个说法,我如何让 CTest 以类似 JUnit 的 XML 输出?

【问题讨论】:

    标签: junit hudson cmake jenkins ctest


    【解决方案1】:
    【解决方案2】:

    在 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 以 XML 格式输出 CTest (?!)
    • verify >nul 将 errorlevel 重置为 0,因为如果任何测试失败,CTest 返回 >0,Jenkins 将其解释为“整个构建失败”,这是我们不想要的
    • 最后一行将 CTest 的 XML 转换为 minimal 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,direct link
    • 它有两个参数,测试所在的目录(在构建目录中)和一个 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

    嗯,那很丑。但是,仍然希望这对某人有所帮助。欢迎改进(也许从 python 运行 ctest?使用 Python 插件的路径而不是 C:...?)

    【讨论】:

    • 非常感谢这个解决方案。我目前正在使用它,它基本上对我来说很完美。
    • 我增强了您的 XSL 代码以支持 CTest XML 输出的更多功能:pastebin.com/GAj7Fzqd 它现在添加了测试的执行时间,如果出现错误,它会将错误类型和错误代码添加为一个消息。如果有其他东西可以添加到生成的 JUnit-File 中,请发表评论。
    • 新版本支持 JUnit 的 -Tags 并额外将属性存储为系统输出(以便在 Jenkins 中看到):pastebin.com/3mQ2ZQfa
    • 在 Linux 上你可以使用 xsltproc + shell 来达到相同的结果:将 XSL 文件复制到某个位置,然后使用以下命令:xsltproc ctest2junix.xsl Testing/head -n 1 &lt; Testing/TAG/Test.xml > JUnitTestResults .xml head -n ... 命令应该用反引号括起来...
    • 我进一步改进了来自@MOnsDaR xslt 的xslt 文件为:CTest2JUnit.xsl 它将testclassname 填充为'this/Path',测试和失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2012-01-12
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多