testlib: Track current test suite in JUnit test logger

Instead of deferring the creation of the test suite until logging
stops, we create it up front, matching the logic of adding test
elements on test function enter.

Change-Id: I78b1ccdfde5493d78ef478d4b3c45d5a49358979
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
bb10
Tor Arne Vestbø 2020-07-21 12:04:44 +02:00
parent 81d83d5672
commit 6f2fb55ea1
2 changed files with 32 additions and 27 deletions

View File

@ -43,6 +43,7 @@
#include <QtTest/qtestcase.h>
#include <QtTest/private/qtestresult_p.h>
#include <QtTest/private/qbenchmark_p.h>
#include <QtTest/private/qtestlog_p.h>
#ifdef min // windows.h without NOMINMAX is included by the benchmark headers.
# undef min
@ -64,7 +65,7 @@ QJUnitTestLogger::QJUnitTestLogger(const char *filename)
QJUnitTestLogger::~QJUnitTestLogger()
{
delete currentLogElement;
Q_ASSERT(!currentTestSuite);
delete logFormatter;
}
@ -75,25 +76,10 @@ void QJUnitTestLogger::startLogging()
logFormatter = new QTestJUnitStreamer(this);
delete errorLogElement;
errorLogElement = new QTestElement(QTest::LET_SystemError);
}
void QJUnitTestLogger::stopLogging()
{
QTestElement *iterator = listOfTestcases;
char buf[10];
currentLogElement = new QTestElement(QTest::LET_TestSuite);
currentLogElement->addAttribute(QTest::AI_Name, QTestResult::currentTestObjectName());
qsnprintf(buf, sizeof(buf), "%i", testCounter);
currentLogElement->addAttribute(QTest::AI_Tests, buf);
qsnprintf(buf, sizeof(buf), "%i", failureCounter);
currentLogElement->addAttribute(QTest::AI_Failures, buf);
qsnprintf(buf, sizeof(buf), "%i", errorCounter);
currentLogElement->addAttribute(QTest::AI_Errors, buf);
Q_ASSERT(!currentTestSuite);
currentTestSuite = new QTestElement(QTest::LET_TestSuite);
currentTestSuite->addAttribute(QTest::AI_Name, QTestResult::currentTestObjectName());
QTestElement *property;
QTestElement *properties = new QTestElement(QTest::LET_Properties);
@ -113,21 +99,37 @@ void QJUnitTestLogger::stopLogging()
property->addAttribute(QTest::AI_PropertyValue, QLibraryInfo::build());
properties->addLogElement(property);
currentLogElement->addLogElement(properties);
currentTestSuite->addLogElement(properties);
}
currentLogElement->addLogElement(iterator);
void QJUnitTestLogger::stopLogging()
{
char buf[10];
/* For correct indenting, make sure every testcase knows its parent */
QTestElement* testcase = iterator;
qsnprintf(buf, sizeof(buf), "%i", testCounter);
currentTestSuite->addAttribute(QTest::AI_Tests, buf);
qsnprintf(buf, sizeof(buf), "%i", failureCounter);
currentTestSuite->addAttribute(QTest::AI_Failures, buf);
qsnprintf(buf, sizeof(buf), "%i", errorCounter);
currentTestSuite->addAttribute(QTest::AI_Errors, buf);
currentTestSuite->addLogElement(listOfTestcases);
// For correct indenting, make sure every testcase knows its parent
QTestElement *testcase = listOfTestcases;
while (testcase) {
testcase->setParent(currentLogElement);
testcase->setParent(currentTestSuite);
testcase = testcase->nextElement();
}
currentLogElement->addLogElement(errorLogElement);
currentTestSuite->addLogElement(errorLogElement);
QTestElement *it = currentLogElement;
logFormatter->output(it);
logFormatter->output(currentTestSuite);
delete currentTestSuite;
currentTestSuite = nullptr;
QAbstractTestLogger::stopLogging();
}
@ -138,6 +140,8 @@ void QJUnitTestLogger::enterTestFunction(const char *function)
currentLogElement->addAttribute(QTest::AI_Name, function);
currentLogElement->addToList(&listOfTestcases);
// The element will be deleted when the suite is deleted
++testCounter;
}

View File

@ -79,6 +79,7 @@ class QJUnitTestLogger : public QAbstractTestLogger
const char *file = nullptr, int line = 0) override;
private:
QTestElement *currentTestSuite = nullptr;
QTestElement *listOfTestcases = nullptr;
QTestElement *currentLogElement = nullptr;
QTestElement *errorLogElement = nullptr;