【问题标题】:How can I print test result with Xunit in jenkins for QT5 multiple unit tests如何在 jenkins 中使用 Xunit 打印测试结果以进行 QT5 多单元测试
【发布时间】:2014-09-08 21:58:53
【问题描述】:

我已经开始开发 QT 项目了。我想在 jenkins 中运行多个单元测试,我想在 jenkins 仪表板中查看测试结果。所以我安装了 Xunit 插件。并且 1 个单元测试类正在工作。但我想运行多个单元测试或测试套件。但是我不知道如何使用 QT 应用程序。我尝试了一种方法。但它产生了错误的 xml 格式。然后 Xunit 给出错误。我认为错误的原因是有两个

TestMathTokenizer testTokenizer;
TestMathParser testParser;
return QTest::qExec(&testTokenizer, argc, argv) |
        QTest::qExec(&testParser, argc, argv);

在 jenkins 中,我为后期构建编写了命令:

qttest-example-test -xml > "C:\Program Files (x86)\Jenkins\workspace\hostGit\testResult2.xml"

生成的 XML 如下:

<?xml version="1.0" encoding="UTF-8"?>
<TestCase name="TestMathTokenizer">
<Environment>
    <QtVersion>5.2.1</QtVersion>
    <QTestVersion>5.2.1</QTestVersion>
</Environment>
<TestFunction name="initTestCase">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::initTestCase() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testEmpty">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[Inside TestMathTokenizer::testEmpty() ]]></Description>
</Message>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testInt">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testIntFail">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testExpr">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testUnexpectedCharacterFail">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testFutureFunctionality">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Incident type="xfail" file="test\testmathtokenizer.cpp" line="86">
    <Description><![CDATA[sqrt not implemented yet]]></Description>
</Incident>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testZero">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Incident type="fail" file="test\testmathtokenizer.cpp" line="95">
    <Description><![CDATA['false' returned FALSE. ()]]></Description>
</Incident>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
</TestFunction>
<TestFunction name="evilFunction">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::init() ]]></Description>
</Message>
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanup() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
<Message type="qdebug" file="" line="0">
    <Description><![CDATA[TestMathTokenizer::cleanupTestCase() ]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
</TestFunction>
</TestCase>
<?xml version="1.0" encoding="UTF-8"?>
<TestCase name="TestMathParser">
<Environment>
    <QtVersion>5.2.1</QtVersion>
    <QTestVersion>5.2.1</QTestVersion>
</Environment>
<TestFunction name="initTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testEmptyFail">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testInt">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testInvalidOperator">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testAllOperators">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testDivisionByZeroFail">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="testUnexpectedEndFail">
<Incident type="pass" file="" line="0" />
</TestFunction>
<TestFunction name="cleanupTestCase">
<Incident type="pass" file="" line="0" />
</TestFunction>
</TestCase>

错误:

 Caused by: org.xml.sax.SAXParseException; lineNumber: 100; columnNumber: 6; The processing instruction target matching "[xX][mM][lL]" is not allowed.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at com.thalesgroup.dtkit.util.converter.ConversionService.convert(ConversionService.java:316)
    ... 21 more

【问题讨论】:

    标签: xml qt unit-testing jenkins xunit


    【解决方案1】:

    问题是您有 2 个 xml 标签(文件)合二为一,因为您的代码会为您拥有的每个测试类生成一个。

    您的输出应该被解析并拆分为 2 个 xml,有同样的问题。

    这是一个 CMD 脚本,可以将您的文件分成两部分:

    set /a filenameCounter=0 
    setlocal ENABLEDELAYEDEXPANSION 
    for /f "tokens=*" %%a in (testResult2.xml) do (    
       if "%%a"=="<?xml version="1.0" encoding="ISO-8859-1"?>" (
           set /a filenameCounter=filenameCounter+1
       )
       set splitFile=file!filenameCounter!.xml
       echo %%a>>!splitFile! 
    ) 
    endlocal 
    del testResult2.xml
    

    在Execute Windows批处理命令中添加这个脚本,当然如果构建是在Windows下,如果不是,我可以为你提供一个perl脚本。

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多