我有一个子项目,我在其中放置了所有QTest
单元测试并构建了一个运行测试的独立测试应用程序(即我从 Qt Creator 中运行它)。我有多个可以使用qExec()
. 但是我不知道执行多个测试类的正确方法是什么。
目前我是这样做的(MVCE):
测试.pro
QT -= gui
QT += core \
testlib
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
TARGET = testrunner
HEADERS += test_foo.h
SOURCES += main.cpp
主文件
#include <QtTest>
#include <QCoreApplication>
#include "test_foo.h"
int main(int argc, char** argv) {
QCoreApplication app(argc, argv);
TestFooClass testFoo;
TestBarClass testBar;
// NOTE THIS LINE IN PARTICULAR.
return QTest::qExec(&testFoo, argc, argv) || QTest::qExec(&testBar, argc, argv);
}
test_foo.h
#include <QtTest>
class TestFooClass: public QObject
{
Q_OBJECT
private slots:
void test_func_foo() {};
};
class TestBarClass: public QObject
{
Q_OBJECT
private slots:
void test_func_bar() {};
};
但是文档qExec()
说这是错误的方法:
对于独立测试应用程序,不应多次调用此函数,因为用于将测试输出记录到文件和执行单个测试函数的命令行选项将无法正确运行。
另一个主要缺点是没有针对所有测试类的单一摘要,仅针对个别类。当我有几十个班级,每个班级都有几十个测试时,这是一个问题。要检查所有测试是否通过,我必须向上滚动以查看每个类的通过/失败的所有“总计”,例如:
********* Start testing of TestFooClass *********
PASS : TestFooClass::initTestCase()
PASS : TestFooClass::test_func_foo()
PASS : TestFooClass::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestFooClass *********
********* Start testing of TestBarClass *********
PASS : TestBarClass::initTestCase()
PASS : TestBarClass::test_func_bar()
PASS : TestBarClass::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestBarClass *********
qExec() || qExec()
考虑到文档说如果测试失败qExec()
返回非零值,我也对我的作品感到惊讶,这应该意味着以下所有qExec()
调用都不会发生,但情况似乎并非如此。
运行多个测试类的正确方法是什么?这样我就可以一目了然地看到数百个单元测试中是否有任何一个失败了。