testlib: Simplify JUnit test logger

- Use the right name for the attribute (AI_Message),
   rather than fixing it up in QTestJUnitStreamer.
 - Don't pretend that we're adding line and file information,
   only to discard it in QTestJUnitStreamer.
 - Don't pretend to add benchmark information,
   only to discard it in QTestJUnitStreamer.

Pick-to: 6.2
Change-Id: Ib6eadc12300157216fe9c6e8bcfebd7eb8a3ea68
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
bb10
Tor Arne Vestbø 2021-07-28 15:40:22 +02:00
parent f1ab1132ea
commit 177d259782
10 changed files with 35 additions and 92 deletions

View File

@ -167,7 +167,6 @@ void QJUnitTestLogger::addIncident(IncidentTypes type, const char *description,
const char *file, int line)
{
const char *typeBuf = nullptr;
char buf[100];
switch (type) {
case QAbstractTestLogger::XPass:
@ -206,13 +205,7 @@ void QJUnitTestLogger::addIncident(IncidentTypes type, const char *description,
if (type == QAbstractTestLogger::Fail || type == QAbstractTestLogger::XPass) {
QTestElement *failureElement = new QTestElement(QTest::LET_Failure);
failureElement->addAttribute(QTest::AI_Result, typeBuf);
if (file)
failureElement->addAttribute(QTest::AI_File, file);
else
failureElement->addAttribute(QTest::AI_File, "");
qsnprintf(buf, sizeof(buf), "%i", line);
failureElement->addAttribute(QTest::AI_Line, buf);
failureElement->addAttribute(QTest::AI_Description, description);
failureElement->addAttribute(QTest::AI_Message, description);
addTag(failureElement);
currentLogElement->addLogElement(failureElement);
}
@ -251,14 +244,6 @@ void QJUnitTestLogger::addIncident(IncidentTypes type, const char *description,
currentLogElement->addAttribute(QTest::AI_Result, typeBuf);
}
if (file)
currentLogElement->addAttribute(QTest::AI_File, file);
else
currentLogElement->addAttribute(QTest::AI_File, "");
qsnprintf(buf, sizeof(buf), "%i", line);
currentLogElement->addAttribute(QTest::AI_Line, buf);
/*
Since XFAIL does not add a failure to the testlog in junitxml, add a message, so we still
have some information about the expected failure.
@ -268,24 +253,6 @@ void QJUnitTestLogger::addIncident(IncidentTypes type, const char *description,
}
}
void QJUnitTestLogger::addBenchmarkResult(const QBenchmarkResult &result)
{
QTestElement *benchmarkElement = new QTestElement(QTest::LET_Benchmark);
benchmarkElement->addAttribute(
QTest::AI_Metric,
QTest::benchmarkMetricName(result.metric));
benchmarkElement->addAttribute(QTest::AI_Tag, result.context.tag.toUtf8().data());
const qreal valuePerIteration = qreal(result.value) / qreal(result.iterations);
benchmarkElement->addAttribute(QTest::AI_Value, QByteArray::number(valuePerIteration).constData());
char buf[100];
qsnprintf(buf, sizeof(buf), "%i", result.iterations);
benchmarkElement->addAttribute(QTest::AI_Iterations, buf);
currentLogElement->addLogElement(benchmarkElement);
}
void QJUnitTestLogger::addTag(QTestElement* element)
{
const char *tag = QTestResult::currentDataTag();
@ -309,6 +276,9 @@ void QJUnitTestLogger::addTag(QTestElement* element)
void QJUnitTestLogger::addMessage(MessageTypes type, const QString &message, const char *file, int line)
{
Q_UNUSED(file);
Q_UNUSED(line);
auto messageElement = new QTestElement(QTest::LET_Message);
auto systemLogElement = systemOutputElement;
const char *typeBuf = nullptr;
@ -347,25 +317,16 @@ void QJUnitTestLogger::addMessage(MessageTypes type, const QString &message, con
}
messageElement->addAttribute(QTest::AI_Type, typeBuf);
messageElement->addAttribute(QTest::AI_Description, message.toUtf8().constData());
messageElement->addAttribute(QTest::AI_Message, message.toUtf8().constData());
addTag(messageElement);
if (file)
messageElement->addAttribute(QTest::AI_File, file);
else
messageElement->addAttribute(QTest::AI_File, "");
char buf[100];
qsnprintf(buf, sizeof(buf), "%i", line);
messageElement->addAttribute(QTest::AI_Line, buf);
currentLogElement->addLogElement(messageElement);
++errorCounter;
// Also add the message to the system log (stdout/stderr), if one exists
if (systemLogElement) {
auto messageElement = new QTestElement(QTest::LET_Message);
messageElement->addAttribute(QTest::AI_Description, message.toUtf8().constData());
messageElement->addAttribute(QTest::AI_Message, message.toUtf8().constData());
systemLogElement->addLogElement(messageElement);
}
}

View File

@ -72,12 +72,13 @@ class QJUnitTestLogger : public QAbstractTestLogger
void addIncident(IncidentTypes type, const char *description,
const char *file = nullptr, int line = 0) override;
void addBenchmarkResult(const QBenchmarkResult &result) override;
void addTag(QTestElement* element);
void addMessage(MessageTypes type, const QString &message,
const char *file = nullptr, int line = 0) override;
void addBenchmarkResult(const QBenchmarkResult &) override {}
private:
QTestElement *currentTestSuite = nullptr;
QTestElement *listOfTestcases = nullptr;

View File

@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE
\value AI_Type
\value AI_Description
\value AI_Message
\value AI_PropertyValue
@ -132,7 +132,7 @@ const char *QTestElementAttribute::name() const
"failures",
"errors",
"type",
"description",
"message",
"value",
"qtestversion",
"qtversion",

View File

@ -67,7 +67,7 @@ namespace QTest {
AI_Failures = 3,
AI_Errors = 4,
AI_Type = 5,
AI_Description = 6,
AI_Message = 6,
AI_PropertyValue = 7,
AI_QTestVersion = 8,
AI_QtVersion = 9,

View File

@ -129,25 +129,16 @@ void QTestJUnitStreamer::formatAttributes(const QTestElement* element, const QTe
&& (element->parentElement()->elementType() == QTest::LET_SystemOutput
|| element->parentElement()->elementType() == QTest::LET_SystemError)) {
if (attrindex != QTest::AI_Description) return;
if (attrindex != QTest::AI_Message) return;
QXmlTestLogger::xmlCdata(formatted, attribute->value());
return;
}
char const* key = nullptr;
if (attrindex == QTest::AI_Description)
key = "message";
else if (attrindex != QTest::AI_File && attrindex != QTest::AI_Line)
key = attribute->name();
if (key) {
QTestCharBuffer quotedValue;
QXmlTestLogger::xmlQuote(&quotedValue, attribute->value());
QTest::qt_asprintf(formatted, " %s=\"%s\"", key, quotedValue.constData());
} else {
formatted->data()[0] = '\0';
}
QTestCharBuffer quotedValue;
QXmlTestLogger::xmlQuote(&quotedValue, attribute->value());
QTest::qt_asprintf(formatted, " %s=\"%s\"",
attribute->name(), quotedValue.constData());
}
void QTestJUnitStreamer::formatAfterAttributes(const QTestElement *element, QTestCharBuffer *formatted) const
@ -197,21 +188,20 @@ void QTestJUnitStreamer::outputElements(QTestElement *element, bool) const
while (element) {
hasChildren = element->childElements();
if (element->elementType() != QTest::LET_Benchmark) {
formatStart(element, &buf);
outputString(buf.data());
formatStart(element, &buf);
outputString(buf.data());
outputElementAttributes(element, element->attributes());
outputElementAttributes(element, element->attributes());
formatAfterAttributes(element, &buf);
outputString(buf.data());
formatAfterAttributes(element, &buf);
outputString(buf.data());
if (hasChildren)
outputElements(element->childElements(), true);
if (hasChildren)
outputElements(element->childElements(), true);
formatEnd(element, &buf);
outputString(buf.data());
formatEnd(element, &buf);
outputString(buf.data());
}
element = element->previousElement();
}
}

View File

@ -6,8 +6,7 @@
<property name="QtBuild" value=""/>
</properties>
<testcase name="initTestCase" result="pass" time="@TEST_DURATION@"/>
<testcase name="passingBenchmark" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="passingBenchmark" result="pass" time="@TEST_DURATION@"/>
<testcase name="skippingBenchmark" time="@TEST_DURATION@">
<!-- type="skip" message="This is a skipping benchmark" -->
</testcase>

View File

@ -6,8 +6,7 @@
<property name="QtBuild" value=""/>
</properties>
<testcase name="initTestCase" result="pass" time="@TEST_DURATION@"/>
<testcase name="events" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="events" result="pass" time="@TEST_DURATION@"/>
<testcase name="cleanupTestCase" result="pass" time="@TEST_DURATION@"/>
<system-err/>
</testsuite>

View File

@ -6,8 +6,7 @@
<property name="QtBuild" value=""/>
</properties>
<testcase name="initTestCase" result="pass" time="@TEST_DURATION@"/>
<testcase name="threeEvents" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="threeEvents" result="pass" time="@TEST_DURATION@"/>
<testcase name="cleanupTestCase" result="pass" time="@TEST_DURATION@"/>
<system-err/>
</testsuite>
@ -19,8 +18,7 @@
<property name="QtBuild" value=""/>
</properties>
<testcase name="initTestCase" result="pass" time="@TEST_DURATION@"/>
<testcase name="threeEvents" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="threeEvents" result="pass" time="@TEST_DURATION@"/>
<testcase name="cleanupTestCase" result="pass" time="@TEST_DURATION@"/>
<system-err/>
</testsuite>
@ -32,8 +30,7 @@
<property name="QtBuild" value=""/>
</properties>
<testcase name="initTestCase" result="pass" time="@TEST_DURATION@"/>
<testcase name="threeEvents" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="threeEvents" result="pass" time="@TEST_DURATION@"/>
<testcase name="cleanupTestCase" result="pass" time="@TEST_DURATION@"/>
<system-err/>
</testsuite>

View File

@ -6,8 +6,7 @@
<property name="QtBuild" value=""/>
</properties>
<testcase name="initTestCase" result="pass" time="@TEST_DURATION@"/>
<testcase name="threeBillionTicks" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="threeBillionTicks" result="pass" time="@TEST_DURATION@"/>
<testcase name="cleanupTestCase" result="pass" time="@TEST_DURATION@"/>
<system-err/>
</testsuite>

View File

@ -6,12 +6,9 @@
<property name="QtBuild" value=""/>
</properties>
<testcase name="initTestCase" result="pass" time="@TEST_DURATION@"/>
<testcase name="waitForOneThousand" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="waitForFourThousand" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="qbenchmark_once" result="pass" time="@TEST_DURATION@">
</testcase>
<testcase name="waitForOneThousand" result="pass" time="@TEST_DURATION@"/>
<testcase name="waitForFourThousand" result="pass" time="@TEST_DURATION@"/>
<testcase name="qbenchmark_once" result="pass" time="@TEST_DURATION@"/>
<testcase name="cleanupTestCase" result="pass" time="@TEST_DURATION@"/>
<system-err/>
</testsuite>