24

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

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

4

2 回答 2

20

在 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 转换为最小的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,直接链接
  • 它有两个参数,测试所在的目录(在构建目录中)和一个 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:...?)

于 2011-06-13T10:28:03.253 回答
0

如今,这似乎已集成到 jenkins-ci 中:

于 2021-04-14T10:14:32.423 回答