summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
authorJason McDonald <jason.mcdonald@nokia.com>2012-02-02 17:08:44 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-13 01:46:09 +0100
commit9b2971cbb4ebf102198c2320a575e2fd718c182e (patch)
tree05e227d3607eda50b7e39255407c157f68b83e6f /src/testlib
parenta6d3983ef6b7affef1d2aa48ed8bf8000a6e4267 (diff)
testlib: Count passes, fails and skips consistently.
For data-driven tests, testlib previously counted one fail or skip for each data row that failed or skipped, while it counted only one pass for a test function where all rows passed and counted no passes for a test function where some rows passed and some rows failed. A similar problem also existed for benchmark tests, which could run multiple iterations of the same test, with each fail and skip being counted but only a single pass being counted for the entire series of iterations. This commit makes testlib count one pass, fail or skip for each data row. Test functions that are not data-driven count one result for the test function, as before. Benchmark tests count one pass, fail or skip per iteration. A side-effect of this change is that the test output in plain text, xml and light xml formats now shows a result for every data row and benchmark iteration executed, allowing post-processors to correctly calculate the total number of tests executed. Previously, individual rows were not shown in the test output if they passed, making such calculations impossible. The only change to the xunitxml output format is to correct a bug where no test result was recorded for a test function if the last data row was skipped and all other rows passed -- in which case the overall result should be a pass. Note that there is also a pre-existing bug in the xunit logger, where no result is reported if all rows are skipped; that bug is unaffected by this commit. Task-number: QTBUG-21848 Task-number: QTBUG-22124 Change-Id: I7e17177e10d6e89e55b9684c159bd506f21d002b Reviewed-by: Ed Baak <ed.baak@nokia.com>
Diffstat (limited to 'src/testlib')
-rw-r--r--src/testlib/qtestcase.cpp9
-rw-r--r--src/testlib/qtestresult.cpp24
-rw-r--r--src/testlib/qtestresult_p.h2
3 files changed, 19 insertions, 16 deletions
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index d94abff23c..161af0f10f 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -1518,6 +1518,7 @@ static void qInvokeTestMethodDataEntry(char *slot)
QTestResult::setCurrentTestLocation(QTestResult::CleanupFunc);
invokeMethod(QTest::currentTestObject, "cleanup()");
+ QTestResult::finishedCurrentTestDataCleanup();
QTestResult::setCurrentTestLocation(QTestResult::NoWhere);
// If this test method has a benchmark, repeat until all measurements are
@@ -1749,8 +1750,10 @@ static void qInvokeTestMethods(QObject *testObject)
QTestResult::setCurrentTestLocation(QTestResult::InitFunc);
invokeMethod(testObject, "initTestCase()");
- // finishedCurrentTestFunction() resets QTestResult::testFailed(), so use a local copy.
- const bool previousFailed = QTestResult::testFailed();
+ // finishedCurrentTestDataCleanup() resets QTestResult::currentTestFailed(), so use a local copy.
+ const bool previousFailed = QTestResult::currentTestFailed();
+ QTestResult::finishedCurrentTestData();
+ QTestResult::finishedCurrentTestDataCleanup();
QTestResult::finishedCurrentTestFunction();
if (!QTestResult::skipCurrentTest() && !previousFailed) {
@@ -1782,6 +1785,8 @@ static void qInvokeTestMethods(QObject *testObject)
QTestResult::setSkipCurrentTest(false);
QTestResult::setCurrentTestFunction("cleanupTestCase");
invokeMethod(testObject, "cleanupTestCase()");
+ QTestResult::finishedCurrentTestData();
+ QTestResult::finishedCurrentTestDataCleanup();
}
QTestResult::finishedCurrentTestFunction();
QTestResult::setCurrentTestFunction(0);
diff --git a/src/testlib/qtestresult.cpp b/src/testlib/qtestresult.cpp
index c49c7aefe3..cfa85eb065 100644
--- a/src/testlib/qtestresult.cpp
+++ b/src/testlib/qtestresult.cpp
@@ -58,7 +58,6 @@ namespace QTest
static const char *currentTestFunc = 0;
static const char *currentTestObjectName = 0;
static bool failed = false;
- static bool dataFailed = false;
static bool skipCurrentTest = false;
static QTestResult::TestLocation location = QTestResult::NoWhere;
@@ -75,7 +74,6 @@ void QTestResult::reset()
QTest::currentTestFunc = 0;
QTest::currentTestObjectName = 0;
QTest::failed = false;
- QTest::dataFailed = false;
QTest::location = QTestResult::NoWhere;
QTest::expectFailComment = 0;
@@ -86,7 +84,7 @@ void QTestResult::reset()
bool QTestResult::currentTestFailed()
{
- return QTest::dataFailed;
+ return QTest::failed;
}
QTestData *QTestResult::currentGlobalTestData()
@@ -107,7 +105,7 @@ void QTestResult::setCurrentGlobalTestData(QTestData *data)
void QTestResult::setCurrentTestData(QTestData *data)
{
QTest::currentTestData = data;
- QTest::dataFailed = false;
+ QTest::failed = false;
}
void QTestResult::setCurrentTestFunction(const char *func)
@@ -133,21 +131,27 @@ void QTestResult::finishedCurrentTestData()
addFailure("QEXPECT_FAIL was called without any subsequent verification statements", 0, 0);
clearExpectFail();
- if (!QTest::dataFailed && QTestLog::unhandledIgnoreMessages()) {
+ if (!QTest::failed && QTestLog::unhandledIgnoreMessages()) {
QTestLog::printUnhandledIgnoreMessages();
addFailure("Not all expected messages were received", 0, 0);
}
QTestLog::clearIgnoreMessages();
}
-void QTestResult::finishedCurrentTestFunction()
+void QTestResult::finishedCurrentTestDataCleanup()
{
+ // If the current test hasn't failed or been skipped, then it passes.
if (!QTest::failed && !QTest::skipCurrentTest) {
QTestLog::addPass("");
}
+
+ QTest::failed = false;
+}
+
+void QTestResult::finishedCurrentTestFunction()
+{
QTest::currentTestFunc = 0;
QTest::failed = false;
- QTest::dataFailed = false;
QTest::location = NoWhere;
QTestLog::leaveTestFunction();
@@ -276,7 +280,6 @@ void QTestResult::addFailure(const char *message, const char *file, int line)
QTestLog::addFail(message, file, line);
QTest::failed = true;
- QTest::dataFailed = true;
}
void QTestResult::addSkip(const char *message, const char *file, int line)
@@ -306,11 +309,6 @@ const char *QTestResult::currentTestObjectName()
return QTest::currentTestObjectName ? QTest::currentTestObjectName : "";
}
-bool QTestResult::testFailed()
-{
- return QTest::failed;
-}
-
void QTestResult::setSkipCurrentTest(bool value)
{
QTest::skipCurrentTest = value;
diff --git a/src/testlib/qtestresult_p.h b/src/testlib/qtestresult_p.h
index 81e11180ef..5c6c4fba90 100644
--- a/src/testlib/qtestresult_p.h
+++ b/src/testlib/qtestresult_p.h
@@ -74,6 +74,7 @@ public:
static const char *currentDataTag();
static const char *currentGlobalDataTag();
static void finishedCurrentTestData();
+ static void finishedCurrentTestDataCleanup();
static void finishedCurrentTestFunction();
static void reset();
@@ -92,7 +93,6 @@ public:
QTest::TestFailMode mode, const char *file, int line);
static bool verify(bool statement, const char *statementStr, const char *extraInfo,
const char *file, int line);
- static bool testFailed();
static void setSkipCurrentTest(bool value);
static bool skipCurrentTest();