diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp
index 8e4fcd5a766..2584fc9cda7 100644
--- a/src/plugins/autotest/gtest/gtestoutputreader.cpp
+++ b/src/plugins/autotest/gtest/gtestoutputreader.cpp
@@ -71,6 +71,7 @@ void GTestOutputReader::processOutputLine(const QByteArray &outputLine)
testResult.setResult(ResultType::TestEnd);
testResult.setDescription(Tr::tr("Test execution took %1.").arg(match.captured(2)));
testResult.setDuration(match.captured(3));
+ m_executionDuration = m_executionDuration.value_or(0) + match.captured(3).toInt();
reportResult(testResult);
m_currentTestSuite.clear();
m_currentTestCase.clear();
diff --git a/src/plugins/autotest/qtest/qttestoutputreader.cpp b/src/plugins/autotest/qtest/qttestoutputreader.cpp
index 9a5eab32996..99693357a05 100644
--- a/src/plugins/autotest/qtest/qttestoutputreader.cpp
+++ b/src/plugins/autotest/qtest/qttestoutputreader.cpp
@@ -283,6 +283,7 @@ void QtTestOutputReader::processXMLOutput(const QByteArray &outputLine)
m_testCase.clear();
} else if (currentTag == QStringLiteral("TestCase")) {
sendFinishMessage(false);
+ m_executionDuration = qRound(m_duration.toDouble());
} else if (validEndTags.contains(currentTag.toString())) {
if (m_parseMessages && isTestMessage(m_result)) {
const QRegularExpressionMatch match = userFileLocation().match(m_description);
@@ -343,7 +344,7 @@ void QtTestOutputReader::processPlainTextOutput(const QByteArray &outputLine)
static const QRegularExpression config("^Config: Using QtTest library (.*), "
"(Qt (\\d+(\\.\\d+){2}) \\(.*\\))$");
static const QRegularExpression summary("^Totals: (\\d+) passed, (\\d+) failed, "
- "(\\d+) skipped(, (\\d+) blacklisted)?(, \\d+ms)?$");
+ "(\\d+) skipped(, (\\d+) blacklisted)?(, (\\d+)ms)?$");
static const QRegularExpression finish("^[*]{9} Finished testing of (.*) [*]{9}$");
static const QRegularExpression result("^(PASS |FAIL! |XFAIL |XPASS |SKIP |RESULT "
@@ -389,6 +390,8 @@ void QtTestOutputReader::processPlainTextOutput(const QByteArray &outputLine)
// BlacklistedXYZ is wrong here, but we use it for convenience (avoids another enum value)
if (int blacklisted = match.captured(5).toInt())
m_summary[ResultType::BlacklistedPass] = blacklisted;
+ if (match.hasCaptured(7))
+ m_executionDuration.emplace(match.captured(7).toInt());
processSummaryFinishOutput();
} else if (finish.match(line).hasMatch()) {
processSummaryFinishOutput();
diff --git a/src/plugins/autotest/testoutputreader.h b/src/plugins/autotest/testoutputreader.h
index 247d036831a..f615f5a2056 100644
--- a/src/plugins/autotest/testoutputreader.h
+++ b/src/plugins/autotest/testoutputreader.h
@@ -25,6 +25,8 @@ public:
int disabledTests() const { return m_disabled; }
bool hasSummary() const { return !m_summary.isEmpty(); }
QHash summary() const { return m_summary; }
+ bool hasDuration() const { return m_executionDuration.has_value(); }
+ int duration() const { return m_executionDuration.value(); }
void setId(const QString &id) { m_id = id; }
QString id() const { return m_id; }
@@ -49,6 +51,8 @@ protected:
QString m_id;
QHash m_summary;
int m_disabled = -1;
+ std::optional m_executionDuration;
+
private:
enum class SanitizerOutputMode { None, Asan, Ubsan};
TestResult m_sanitizerResult;
diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp
index 46c6d71b8f4..7a1295a4391 100644
--- a/src/plugins/autotest/testresultmodel.cpp
+++ b/src/plugins/autotest/testresultmodel.cpp
@@ -238,6 +238,10 @@ TestResultModel::TestResultModel(QObject *parent)
this, [this](const QString &id, const QHash &summary){
m_reportedSummary.insert(id, summary);
});
+ connect(TestRunner::instance(), &TestRunner::reportDuration,
+ this, [this](int duration){
+ m_reportedDurations.emplace(m_reportedDurations.value_or(0) + duration);
+ });
}
void TestResultModel::updateParent(const TestResultItem *item)
@@ -354,6 +358,7 @@ void TestResultModel::clearTestResults()
clear();
m_testResultCount.clear();
m_reportedSummary.clear();
+ m_reportedDurations.reset();
m_disabled = 0;
m_fileNames.clear();
m_maxWidthOfFileName = 0;
diff --git a/src/plugins/autotest/testresultmodel.h b/src/plugins/autotest/testresultmodel.h
index add1f717538..07569bd6809 100644
--- a/src/plugins/autotest/testresultmodel.h
+++ b/src/plugins/autotest/testresultmodel.h
@@ -70,6 +70,7 @@ public:
int resultTypeCount(ResultType type) const;
int disabledTests() const { return m_disabled; }
+ std::optional reportedDuration() const { return m_reportedDurations; }
void raiseDisabledTests(int amount) { m_disabled += amount; }
private:
@@ -80,6 +81,7 @@ private:
void updateParent(const TestResultItem *item);
QHash> m_testResultCount;
QHash> m_reportedSummary;
+ std::optional m_reportedDurations = std::nullopt;
int m_widthOfLineNumber = 0;
int m_maxWidthOfFileName = 0;
int m_disabled = 0;
diff --git a/src/plugins/autotest/testresultspane.cpp b/src/plugins/autotest/testresultspane.cpp
index 642eb67cb6a..1ccbd986f0a 100644
--- a/src/plugins/autotest/testresultspane.cpp
+++ b/src/plugins/autotest/testresultspane.cpp
@@ -500,7 +500,10 @@ void TestResultsPane::updateSummaryLabel()
count = m_model->disabledTests();
if (count)
labelText += ", " + QString::number(count) + ' ' + Tr::tr("disabled");
- labelText.append(".
");
+ if (auto millisec = m_model->reportedDuration())
+ labelText += ". (" + QString::number(*millisec) + " ms)";
+ else
+ labelText.append(".");
m_summaryLabel->setText(labelText);
}
diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp
index 49bbbd4e920..f794e45eef4 100644
--- a/src/plugins/autotest/testrunner.cpp
+++ b/src/plugins/autotest/testrunner.cpp
@@ -454,6 +454,8 @@ void TestRunner::runTestsHelper()
emit hadDisabledTests(disabled);
if (testStorage->m_outputReader->hasSummary())
emit reportSummary(testStorage->m_outputReader->id(), testStorage->m_outputReader->summary());
+ if (testStorage->m_outputReader->hasDuration())
+ emit reportDuration(testStorage->m_outputReader->duration());
testStorage->m_outputReader->resetCommandlineColor();
}
diff --git a/src/plugins/autotest/testrunner.h b/src/plugins/autotest/testrunner.h
index 507ada786f6..275b17c7ccc 100644
--- a/src/plugins/autotest/testrunner.h
+++ b/src/plugins/autotest/testrunner.h
@@ -57,6 +57,7 @@ signals:
void testResultReady(const TestResult &result);
void hadDisabledTests(int disabled);
void reportSummary(const QString &id, const QHash &summary);
+ void reportDuration(int duration);
private:
void buildProject(ProjectExplorer::Project *project);