当前位置: 首页 > 面试题库 >

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

鲍健柏
2023-03-14
问题内容

我正在使用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
  • Testing/TAG文件的第一行中包含“最后的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:…?)



 类似资料:
  • 问题内容: 似乎将CMake + CTest集成到jenkins中应该很容易。该cmakebuilder插件是非常容易配置(刚才设置的源树和构建树,完成了!)。但是我不明白如何调用CTest步骤。 根据xUnit主页,自1.58版以来,支持CTest的XML输出,请参见bug报告。 那就是我能找到的所有文档。当我在google或stackoverflow上搜索时,我只能找到非常老的文档,需要手动操

  • 我需要获取数据库中的所有记录作为数组使用在教义中,我的查询是这样的 即使将水合模式设置为,我也会将结果作为对象 我犯了什么错误?

  • 问题内容: 我的Jenkins安装中有一些不再需要的插件。我已经禁用了插件(并且我的构建仍然可以使用),并且我想完全删除插件。完全删除Jenkins(Hudson)插件的正确过程是什么? 问题答案: 就像Je​​sseGlick在他的回答中提到的那样,如果您使用的是Jenkins 1.487或更高版本,则可以通过本机方式在JenkinsUI中卸载插件。有关详细信息,请参见JENKINS-3070。

  • 我在服务器的/var/lib/hudson目录中安装了一个hudson。当我通过浏览器中的URL访问jenkins时,我会在页面底部看到版本1.411。 有人知道如何通过命令行(CLI)更新詹金斯吗?如果可能的话。 当我进入管理詹金斯页面时,它说:“詹金斯的新版本(1.521)可供下载(变更日志)。” 我觉得下载新的jar并在服务器中提取不安全。

  • 问题内容: 在2011年,哈德森(Hudson)和詹金斯(Jenkins)紧随其后(IMHO)-哈德森(Hadson)有点稳定,但詹金斯(Jenkins)的发展更快。 2012年的“哈德逊与詹金斯”现在情况如何? 问题答案: 在稳定性方面,詹金斯(Jenkins)一年多以来一直为希望更加确保所安装软件的稳定性和支持的人们提供长期支持(LTS)版本。 每三个月左右,就会选择一个先前的发行版,Jenk

  • 问题内容: 我一直在尝试发送HttpPost请求并获取响应,但是即使我能够建立连接,我仍然无法获得如何获取由请求-响应返回的字符串消息。 对不起,我听起来很幼稚,因为我是Java新手。请帮我。 问题答案: 尝试在您的响应中使用: