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

Cal*_*602 22 junit hudson cmake ctest jenkins

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

如何在Jenkins仪表板中获得CTest结果?或者,换句话说,如何让CTest在类似JUnit的XML中输出?

Cal*_*602 16

在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
Run Code Online (Sandbox Code Playgroud)
  • build_32 是CMake插件中的Build Directory
  • Tests 是我所有测试所在的子目录
  • -T Test 以XML格式输出CTest(?!)
  • verify >nul 将errorlevel重置为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)
Run Code Online (Sandbox Code Playgroud)
  • 它需要lxml,直接链接
  • 它需要两个参数,测试所在的目录(在构建目录中)和xsl文件
  • 它只是读取最后的xml测试结果,用xsl转换它,并将其输出到stdout
  • "最后的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>
Run Code Online (Sandbox Code Playgroud)

最后,选中"发布JUnit测试结果"(或类似的,我的版本是法语)并将xml路径设置为 build_32/JUnitTestResults.xml

嗯,这很难看.但是,希望这有助于某人.并且欢迎改进(从python运行ctest可能吗?使用Python插件的路径而不是C:...?)

  • 我增强了您的XSL代码以支持CTest XML-Output的更多功能:http://pastebin.com/GAj7Fzqd它现在增加了测试的执行时间,如果出现错误,它会将错误类型和错误代码添加为消息.如果有其他东西可以添加到生成的JUnit-File中,请评论. (5认同)
  • 在Linux上,您可以使用xsltproc + shell来实现相同的结果:将XSL文件复制到某个位置,然后使用以下命令:xsltproc ctest2junix.xsl Testing /`head -n 1 <Testing/TAG`/Test.xml> JUnitTestResults. xml`head -n ...`命令应该包含在反引号中... (4认同)
  • 我进一步改进了来自@MOnsDaR xslt的xslt文件:[CTest2JUnit.xsl](https://github.com/zanata/zanata-tests/blob/master/scripts/CTest2JUnit.xsl)它将testclassname填入'this/Path' ,测试和失败. (2认同)