#xml #qt #unit-testing #jenkins #xunit
#xml #qt #модульное тестирование #дженкинс #xunit
Вопрос:
Я начал разрабатывать проект QT. Я хочу запустить несколько модульных тестов в jenkins, и я хочу видеть результаты теста в jenkins dashboard. Итак, я установил плагин Xunit. И 1 класс модульного теста работает. Но я хочу запустить несколько модульных тестов или набор тестов. Однако я не знаю, как я могу это сделать с приложением QT. Я попробовал способ. Но это привело к неправильному формату xml. Затем Xunit выдает ошибку. Я думаю, причина ошибки в том, что есть два
TestMathTokenizer testTokenizer;
TestMathParser testParser;
return QTest::qExec(amp;testTokenizer, argc, argv) |
QTest::qExec(amp;testParser, argc, argv);
В jenkins я написал команду для последующей сборки:
qttest-example-test -xml > "C:Program Files (x86)JenkinsworkspacehostGittestResult2.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="testtestmathtokenizer.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="testtestmathtokenizer.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
Ответ №1:
Проблема в том, что у вас есть 2 xml-тега (файла) в одном, поскольку ваш код генерирует по одному для каждого тестового класса, который у вас есть.
Ваш вывод должен быть проанализирован и разделен на 2 xml-файла, возникла та же проблема.
Вот CMD-скрипт, который разделит ваш файл на 2:
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-скрипт.