本页内容

QTest Namespace

QTest 命名空间包含所有与Qt Test 相关的函数和声明。更多内容...

头文件: #include <QTest>
CMake: find_package(Qt6 REQUIRED COMPONENTS Test)
target_link_libraries(mytarget PRIVATE Qt6::Test)
qmake: QT += testlib

类

class QTouchEventSequence
class QTouchEventWidgetSequence
(since 6.8) class ThrowOnFailDisabler
(since 6.8) class ThrowOnFailEnabler
(since 6.8) class ThrowOnSkipDisabler
(since 6.8) class ThrowOnSkipEnabler

类型

enum KeyAction { Press, Release, Click, Shortcut }
enum MouseAction { MousePress, MouseRelease, MouseClick, MouseDClick, MouseMove }
enum QBenchmarkMetric { FramesPerSecond, BitsPerSecond, BytesPerSecond, WalltimeMilliseconds, WalltimeNanoseconds, …, EmulationFaults }
enum TestFailMode { Abort, Continue }

变量

(since 6.11) std::atomic<std::chrono::milliseconds> defaultTryTimeout

函数

void addColumn(const char *name, T *dummy = 0)
QTestData &addRow(const char *format, ...)
const char *benchmarkMetricName(QTest::QBenchmarkMetric metric)
const char *benchmarkMetricUnit(QTest::QBenchmarkMetric metric)
QPointingDevice *createTouchDevice(QInputDevice::DeviceType devType = QInputDevice::DeviceType::TouchScreen, QInputDevice::Capabilities caps = QInputDevice::Capability::Position)
const char *currentAppName()
const char *currentDataTag()
(since 6.11) const char *currentGlobalDataTag()
bool currentTestFailed()
const char *currentTestFunction()
(since 6.5) bool currentTestResolved()
(since 6.3) void failOnWarning(const QRegularExpression &messagePattern)
(since 6.8) void failOnWarning()
(since 6.3) void failOnWarning(const char *message)
void ignoreMessage(QtMsgType type, const char *message)
void ignoreMessage(QtMsgType type, const QRegularExpression &messagePattern)
void keyClick(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyClick(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyClicks(QWidget *widget, const QString &sequence, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyEvent(QTest::KeyAction action, QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyEvent(QTest::KeyAction action, QWidget *widget, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyEvent(QTest::KeyAction action, QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyEvent(QTest::KeyAction action, QWindow *window, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyPress(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyPress(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyRelease(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyRelease(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void keySequence(QWidget *widget, const QKeySequence &keySequence)
void keySequence(QWindow *window, const QKeySequence &keySequence)
void mouseClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
void mouseClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
void mouseDClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
void mouseDClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
void mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay = -1)
void mouseMove(QWindow *window, QPoint pos = QPoint(), int delay = -1)
void mousePress(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
void mousePress(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
void mouseRelease(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
void mouseRelease(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
QTestData &newRow(const char *dataTag)
int qExec(QObject *testObject, int argc = 0, char **argv = nullptr)
int qExec(QObject *testObject, const QStringList &arguments)
QSharedPointer<QTemporaryDir> qExtractTestData(const QString &dirName)
(since 6.5) void qRegisterTestCase(const QString &name, QTest::TestEntryFunction entryFunction)
(since 6.7) void qSleep(std::chrono::milliseconds msecs)
void qSleep(int ms)
(since 6.7) void qWait(std::chrono::milliseconds msecs)
void qWait(int msecs)
(since 6.7) bool qWaitFor(Functor predicate, QDeadlineTimer deadline = QDeadlineTimer( defaultTryTimeout.load(std::memory_order_relaxed)))
bool qWaitFor(Functor predicate, int timeout)
(since 6.10) bool qWaitForWindowActive(QWidget *widget, QDeadlineTimer timeout)
(since 6.10) bool qWaitForWindowActive(QWindow *window, QDeadlineTimer timeout)
(since 6.10) bool qWaitForWindowActive(QWidget *widget)
(since 6.10) bool qWaitForWindowActive(QWindow *window)
bool qWaitForWindowActive(QWidget *widget, int timeout)
bool qWaitForWindowActive(QWindow *window, int timeout)
(since 6.10) bool qWaitForWindowExposed(QWidget *widget, QDeadlineTimer timeout)
(since 6.10) bool qWaitForWindowExposed(QWindow *window, QDeadlineTimer timeout)
(since 6.10) bool qWaitForWindowExposed(QWidget *widget)
(since 6.10) bool qWaitForWindowExposed(QWindow *window)
bool qWaitForWindowExposed(QWidget *widget, int timeout)
bool qWaitForWindowExposed(QWindow *window, int timeout)
(since 6.7) bool qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout)
(since 6.7) bool qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout)
(since 6.10) bool qWaitForWindowFocused(QWidget *widget)
(since 6.10) bool qWaitForWindowFocused(QWindow *window)
void setBenchmarkResult(qreal result, QTest::QBenchmarkMetric metric)
(since 6.8) void setThrowOnFail(bool enable)
(since 6.8) void setThrowOnSkip(bool enable)
char *toHexRepresentation(const char *ba, qsizetype length)
char *toString(const T &value)
char *toString(QSizePolicy sp)
char *toString(QSizePolicy::ControlType ct)
char *toString(QSizePolicy::ControlTypes cts)
char *toString(QSizePolicy::Policy p)
char *toString(const QByteArray &ba)
char *toString(const QCborError &c)
char *toString(const QChar &character)
char *toString(const QDate &date)
char *toString(const QDateTime &dateTime)
(since 6.5) char *toString(const QKeySequence &ks)
char *toString(const QLatin1StringView &string)
char *toString(const QPoint &point)
char *toString(const QPointF &point)
char *toString(const QRect &rectangle)
char *toString(const QRectF &rectangle)
char *toString(const QSize &size)
char *toString(const QSizeF &size)
char *toString(const QString &string)
char *toString(const QStringView &string)
char *toString(const QTime &time)
char *toString(const QUrl &url)
char *toString(const QUuid &uuid)
char *toString(const QVariant &variant)
char *toString(const QVector2D &v)
char *toString(const QVector3D &v)
char *toString(const QVector4D &v)
char *toString(const std::pair<T1, T2> &pair)
char *toString(const std::tuple<Types...> &tuple)
char *toString(std::nullptr_t)
QTest::QTouchEventWidgetSequence touchEvent(QWidget *widget, QPointingDevice *device, bool autoCommit = true)
QTest::QTouchEventSequence touchEvent(QWindow *window, QPointingDevice *device, bool autoCommit = true)
(since 6.8) void wheelEvent(QWindow *window, QPointF pos, QPoint angleDelta, QPoint pixelDelta = QPoint(0, 0), Qt::KeyboardModifiers stateKey = Qt::NoModifier, Qt::ScrollPhase phase = Qt::NoScrollPhase)

宏

QBENCHMARK
QBENCHMARK_ONCE
QCOMPARE(实际值、期望值)
(since 6.9) QCOMPARE_3WAY(左侧,右侧,阶)
(since 6.4) QCOMPARE_EQ(计算值,基准值)
(since 6.4) QCOMPARE_GE(计算值,基线值)
(since 6.4) QCOMPARE_GT(计算值,基准值)
(since 6.4) QCOMPARE_LE(计算值,基准值)
(since 6.4) QCOMPARE_LT(计算值,基准值)
(since 6.4) QCOMPARE_NE(计算值,基线)
QEXPECT_FAIL(数据索引,注释,模式)
QFAIL(消息)
QFETCH(类型,名称)
QFETCH_GLOBAL(类型,名称)
QFINDTESTDATA(文件名)
QSKIP(描述)
QTEST(实际,测试元素)
QTEST_APPLESS_MAIN(TestClass)
QTEST_GUILESS_MAIN(TestClass)
QTEST_MAIN(TestClass)
(since 6.8) QTEST_THROW_ON_FAIL
(since 6.8) QTEST_THROW_ON_SKIP
QTRY_COMPARE(实际值,预期值)
(since 6.4) QTRY_COMPARE_EQ(计算值,基准值)
(since 6.4) QTRY_COMPARE_EQ_WITH_TIMEOUT(计算值,基准值,超时)
(since 6.4) QTRY_COMPARE_GE(计算值,基准值)
(since 6.4) QTRY_COMPARE_GE_WITH_TIMEOUT(计算值,基准值,超时)
(since 6.4) QTRY_COMPARE_GT(计算值,基准值)
(since 6.4) QTRY_COMPARE_GT_WITH_TIMEOUT(计算值,基准值,超时)
(since 6.4) QTRY_COMPARE_LE(计算值,基准值)
(since 6.4) QTRY_COMPARE_LE_WITH_TIMEOUT(计算值,基准值,超时)
(since 6.4) QTRY_COMPARE_LT(计算值,基准值)
(since 6.4) QTRY_COMPARE_LT_WITH_TIMEOUT(计算值,基准值,超时)
(since 6.4) QTRY_COMPARE_NE(计算值,基准值)
(since 6.4) QTRY_COMPARE_NE_WITH_TIMEOUT(计算值,基准值,超时)
QTRY_COMPARE_WITH_TIMEOUT(实际,预期,超时)
QTRY_VERIFY2(条件,消息)
QTRY_VERIFY(条件)
QTRY_VERIFY2_WITH_TIMEOUT(条件,消息,超时)
QTRY_VERIFY_WITH_TIMEOUT(条件,超时)
QVERIFY2(条件,消息)
QVERIFY(条件)
(since 6.3) QVERIFY_THROWS_EXCEPTION(异常类型, ...)
(since 6.3) QVERIFY_THROWS_NO_EXCEPTION(...)

详细说明

有关如何编写单元测试的信息,请参阅《Qt Test 概述》。

类

类QTouchEventSequence

QTouchEventSequence 类用于模拟一系列触摸事件。更多内容...

classQTouchEventWidgetSequence

QTouchEventWidgetSequence 类用于模拟小部件的一系列触摸事件。更多内容...

类ThrowOnFailDisabler

类ThrowOnFailEnabler

类ThrowOnSkipDisabler

类ThrowOnSkipEnabler

类型文档

enum QTest::KeyAction

此枚举描述了键处理的可能操作。

常量值描述
QTest::Press0按下了键。
QTest::Release1键已松开。
QTest::Click2点击了该键(按下并松开)。
QTest::Shortcut3快捷键被触发。该值是在 Qt 5.6 中添加的。

enum QTest::MouseAction

此枚举描述了鼠标处理的可能操作。

常量值描述
QTest::MousePress0鼠标按钮被按下。
QTest::MouseRelease1鼠标按钮被释放。
QTest::MouseClick2单击鼠标按钮(按下并释放)。
QTest::MouseDClick3鼠标按钮被双击(按下并释放两次)。
QTest::MouseMove4鼠标指针已移动。

enum QTest::QBenchmarkMetric

此枚举列出了所有可以进行基准测试的项目。

常量值描述
QTest::FramesPerSecond0每秒帧数
QTest::BitsPerSecond1每秒位数
QTest::BytesPerSecond2每秒字节数
QTest::WalltimeMilliseconds3时钟时间(以毫秒为单位)
QTest::WalltimeNanoseconds7时钟时间(纳秒)
QTest::BytesAllocated8内存使用量(字节)
QTest::Events6事件计数
QTest::CPUTicks4CPU 时间
QTest::CPUMigrations9CPU 之间的进程迁移
QTest::CPUCycles10CPU 周期
QTest::RefCPUCycles30引用 CPU 周期
QTest::BusCycles11总线周期
QTest::StalledCycles12停滞的周期
QTest::InstructionReads5指令读取
QTest::Instructions13已执行指令
QTest::BranchInstructions14分支类指令
QTest::BranchMisses15预测错误的分支指令
QTest::CacheReferences16任何类型的缓存访问
QTest::CacheMisses20任何类型的缓存未命中
QTest::CacheReads17缓存读取/加载
QTest::CacheReadMisses21缓存读取/加载未命中
QTest::CacheWrites18缓存写入/存储
QTest::CacheWriteMisses22缓存写入/存储未命中
QTest::CachePrefetches19缓存预取
QTest::CachePrefetchMisses23缓存预取未命中
QTest::ContextSwitches24上下文切换
QTest::PageFaults25任何类型的页面缺失
QTest::MinorPageFaults26次要页面缺页
QTest::MajorPageFaults27主要页面故障
QTest::AlignmentFaults28因未对齐导致的缺页
QTest::EmulationFaults29需要软件模拟的故障

请注意,WalltimeNanoseconds 和BytesAllocated 仅可通过setBenchmarkResult() 进行调用,且QTest 框架无法自动提供这些指标的结果。

另请参阅 QTest::benchmarkMetricName() 和QTest::benchmarkMetricUnit()。

enum QTest::TestFailMode

此枚举描述了处理已知会失败的检查(例如通过QVERIFY() 或QCOMPARE() 宏进行的检查)的模式。无论检查是成功还是失败,该模式均适用。

常量值描述
QTest::Abort1中止测试的执行。当在出现问题的检查之后继续执行测试已无意义时,请使用此模式。
QTest::Continue2在出现问题的检查之后继续执行测试。

另请参阅 QEXPECT_FAIL().

变量文档

[since 6.11] std::atomic<std::chrono::milliseconds> QTest::defaultTryTimeout

该全局变量存储了QTRY_* 函数和qWait 所使用的默认超时时间。

该变量的最典型用例是修改整个测试的超时时间:

    using namespace std::chrono_literals;
    // Since the atomic itself (defaultTryTimeout) is the only data,
    // all reads and stores can be relaxed.
    QTest::defaultTryTimeout.store(1s, std::memory_order_relaxed);

不过,您也可以通过调用 `QAtomicScopedValueRollback` 来为特定作用域设置该超时值:

    const auto timeoutRollback = QAtomicScopedValueRollback(
        QTest::defaultTryTimeout, 1s, std::memory_order_relaxed);

要获取该变量的值,请调用 `load()`:

    // Since the atomic itself is all the data, all reads and stores can be relaxed.
    QCOMPARE(QTest::defaultTryTimeout.load(std::memory_order_relaxed), 1s);

该变量于 Qt 6.11 中引入。

函数文档

template <typename T> void QTest::addColumn(const char *name, T *dummy = 0)

向当前测试数据中添加一个类型为T 的列。name 是该列的名称。dummy 是针对存在缺陷的编译器的临时解决方案,可以忽略。

要为该列填充值,可使用newRow()。在实际测试中,请使用QFETCH() 来获取数据。

示例:

    QTest::addColumn<int>("intval");
    QTest::addColumn<QString>("str");
    QTest::addColumn<double>("dbl");
    QTest::newRow("row1") << 1 << "hello" << 1.5;

注意:此 函数只能作为测试框架调用的测试数据函数的一部分来使用。

更详尽的示例请参阅“数据驱动测试”。

另请参阅 QTest::newRow()、QFETCH() 以及QMetaType 。

QTestData &QTest::addRow(const char *format, ...)

将新行追加到当前测试数据中。

该函数的参数将传递给 std::snprintf(),并根据format 进行格式化。有关注意事项和限制,请参阅std::snprintf() 的文档。

测试输出将使用此格式化生成的名称,来标识使用该测试数据进行的测试运行。

返回一个 QTestData 引用,可用于流式导入数据,表中的每一列对应一个值。

示例:

    QTest::addColumn<int>("input");
    QTest::addColumn<QString>("output");
    QTest::addRow("%d", 0) << 0 << QString("0");
    QTest::addRow("%d", 1) << 1 << QString("1");

注意:此 函数只能作为测试框架调用的测试数据函数的一部分来调用。

更详尽的示例请参阅“数据驱动测试”。

另请参阅 newRow()、addColumn() 以及QFETCH()。

const char *QTest::benchmarkMetricName(QTest::QBenchmarkMetric metric)

将枚举值metric 作为字符串返回。

const char *QTest::benchmarkMetricUnit(QTest::QBenchmarkMetric metric)

返回指定metric 的计量单位。

QPointingDevice *QTest::createTouchDevice(QInputDevice::DeviceType devType = QInputDevice::DeviceType::TouchScreen, QInputDevice::Capabilities caps = QInputDevice::Capability::Position)

创建一个类型为devType 、具备caps 功能的虚拟触摸设备,用于模拟触摸事件。

该触摸设备将注册到 Qt 窗口系统接口中。通常,您应在测试用例类中使用 createTouchDevice() 初始化一个QPointingDevice 成员变量,在所有测试中使用同一个实例,并在不再需要时将其删除。

另请参阅 QTest::QTouchEventSequence 和touchEvent()。

const char *QTest::currentAppName()

返回当前正在执行的二进制文件的名称。

const char *QTest::currentDataTag()

返回当前测试数据的名称。如果该测试未分配任何测试数据,则该函数返回nullptr 。

[since 6.11] const char *QTest::currentGlobalDataTag()

返回当前全局测试数据的名称。如果该测试未分配任何全局测试数据,则该函数返回nullptr 。

该函数在 Qt 6.11 中引入。

bool QTest::currentTestFailed()

如果当前测试函数失败,则返回true ;否则返回false。

另请参阅 QTest::currentTestResolved()。

const char *QTest::currentTestFunction()

返回当前正在执行的测试函数的名称。

示例:

void MyTestClass::cleanup()
{
    if (qstrcmp(QTest::currentTestFunction(), "myDatabaseTest") == 0) {
        // clean up all database connections
        closeAllDatabases();
    }
}

[since 6.5] bool QTest::currentTestResolved()

如果当前测试函数失败或被跳过,则返回true 。

当测试失败或触发了跳过时,此规则适用。当该值为真时,测试函数应提前返回。 特别是,当在测试函数(但不包括其 cleanup())中执行时,QTRY_* 宏和测试事件循环会提前终止其循环。测试调用了一个使用本模块宏的辅助函数后,可以使用此函数来判断是否应提前返回。

该函数于 Qt 6.5 中引入。

另请参阅 QTest::currentTestFailed()。

[since 6.3] void QTest::failOnWarning(const QRegularExpression &messagePattern)

对于每个符合messagePattern 条件的警告,都会在测试日志中追加一条测试失败记录。

添加失败记录后,测试函数将继续执行。若要中止测试,可检查currentTestFailed(),若其值为true ,则可提前返回。

对于每个警告,第一个匹配的模式将导致测试失败,其余模式将被忽略。

每个测试函数结束时,所有模式都会被清除。

voidFileTest::loadFiles()
{
    QTest::failOnWarning(QRegularExpression("^加载失败"));

    // 以下每种情况都会导致测试失败:
    qWarning() << "Failed to load image";
    qWarning() << "Failed to load video";
}

若要使所有触发特定警告的测试均失败,请在init() 中向该函数传递一个合适的正则表达式:

void FileTest::init()
{
    QTest::failOnWarning(
        QRegularExpression("QFile::.*: File(.*) already open"));
}

对于“遇到任何警告就失败”这一常见情况,请不传递任何参数:

void FileTest::init()
{
    QTest::failOnWarning();
}

注意: ignoreMessage() 的优先级高于本函数,因此任何同时匹配ignoreMessage() 和failOnWarning() 所指定模式的警告都将被忽略。

该函数于 Qt 6.3 版本中引入。

另请参阅 QTEST_FATAL_FAIL。

[since 6.8] void QTest::failOnWarning()

如果输出任何警告,则将测试失败记录追加到测试日志中。

该函数重载了 `QTest::failOnWarning()`。

该函数在 Qt 6.8 中引入。

另请参阅 failOnWarning(const char *)。

[since 6.3] void QTest::failOnWarning(const char *message)

如果输出message ,则将测试失败记录追加到测试日志中。

该函数重载了QTest::failOnWarning()。

该函数在 Qt 6.3 中引入。

另请参阅 failOnWarning()。

void QTest::ignoreMessage(QtMsgType type, const char *message)

忽略由qDebug()、qInfo() 或qWarning() 生成的消息。如果输出包含相应type 的message ,则将其从测试日志中移除。如果测试结束且未输出message ,则在测试日志末尾追加一条测试失败记录。

注意:调用 此函数仅会忽略一条消息。如果要忽略的消息被输出两次,则必须调用两次 ignoreMessage()。

示例:

QDir dir;
QTest::ignoreMessage(QtWarningMsg, "QDir::mkdir: Empty or null file name(s)");
dir.mkdir("");

上面的示例用于测试当使用无效文件名调用QDir::mkdir() 时,该函数是否会输出正确的警告。

注意: message 会被解释为 UTF-8。

void QTest::ignoreMessage(QtMsgType type, const QRegularExpression &messagePattern)

忽略由qDebug()、qInfo() 或qWarning() 生成的消息。如果输出了一条与messagePattern 匹配且对应type 的消息,该消息将从测试日志中移除。如果测试已完成且该消息尚未输出,则会在测试日志末尾追加一条测试失败记录。

注意:调用 此函数仅会忽略一条消息。如果要忽略的消息被输出两次,则必须调用两次 ignoreMessage()。

这是一个重载函数。

void QTest::keyClick(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟点击key ,可选modifier ,作用于widget 。如果delay 大于0,则测试将在点击键之前等待delay 毫秒。

示例:

QTest::keyClick(myWidget, Qt::Key_Escape);

QTest::keyClick(myWidget, Qt::Key_Escape, Qt::ShiftModifier, 200);

上面的第一个示例模拟在不使用任何键盘修饰键且无延迟的情况下,点击myWidget 上的escape 键。第二个示例模拟在测试延迟 200 毫秒后,点击myWidget 上的shift-escape 。

另请参阅 QTest::keyClicks()。

void QTest::keyClick(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟点击key (可选参数modifier )在widget 上的操作。如果delay 大于0,测试将在点击该键前等待delay 毫秒。

示例:

QTest::keyClick(myWidget, 'a');

上面的示例模拟了在不使用任何键盘修饰键且测试无延迟的情况下,点击a 上的myWidget 按钮。

这是一个重载函数。

另请参阅 QTest::keyClicks()。

void QTest::keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟点击key 键,并可选地设置modifier ,操作在window 上进行。如果delay 大于0,则测试将在点击该键前等待delay 毫秒。

示例:

QTest::keyClick(&myWindow, Qt::Key_Escape);
QTest::keyClick(&myWindow, Qt::Key_Escape, Qt::ShiftModifier, 200);

上面的第一个示例模拟在不使用任何键盘修饰键且无延迟的情况下,点击escape 上的myWindow 键。第二个示例模拟在测试延迟 200 毫秒后,点击shift-escape 上的myWindow 。

这是一个重载函数。

另请参阅 QTest::keyClicks()。

void QTest::keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟点击key ,并可选指定modifier ,操作在window 上进行。如果delay 大于 0,测试将在点击该键前等待delay 毫秒。

示例:

QWidget myWindow;
QTest::keyClick(&myWindow, Qt::Key_Tab);

上面的示例模拟了在不使用任何键盘修饰键且测试无延迟的情况下,点击a 上的myWindow 。

这是一个重载函数。

另请参阅 QTest::keyClicks()。

void QTest::keyClicks(QWidget *widget, const QString &sequence, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟在widget 上点击sequence 的按键。可选地,可以指定键盘modifier ,以及每次按键前测试的delay (单位为毫秒)。

示例:

QTest::keyClicks(myWidget, "hello world");

上面的示例模拟了在myWidget 上点击代表“hello world”的键序列,不使用任何键盘修饰键,且测试中不设置延迟。

另请参阅 QTest::keyClick()。

void QTest::keyEvent(QTest::KeyAction action, QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

向widget 发送一个Qt键盘事件,该事件包含给定的key 和关联的action 。可选地,可以指定键盘modifier ,以及发送事件前测试的delay (单位为毫秒)。

void QTest::keyEvent(QTest::KeyAction action, QWidget *widget, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

向widget 发送一个Qt键事件,该事件包含给定的键ascii 及其关联的action 。可选地,可以指定键盘modifier ,以及在发送事件前测试的delay (单位为毫秒)。

这是一个重载函数。

void QTest::keyEvent(QTest::KeyAction action, QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

向window 发送一个Qt键事件,该事件带有给定的key 和关联的action 。可选地,可以指定键盘modifier ,以及在发送事件前测试的delay (单位为毫秒)。

这是一个重载函数。

void QTest::keyEvent(QTest::KeyAction action, QWindow *window, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

向window 发送一个Qt键事件,该事件包含给定的键ascii 及其关联的action 。可选地,可以指定键盘modifier ,以及在发送事件前测试的delay (单位为毫秒)。

这是一个重载函数。

void QTest::keyPress(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟按下key 键,并可选地同时按下modifier 键,该操作在widget 设备上进行。如果delay 大于 0,则测试将在按下该键前等待delay 毫秒。

注意:稍后 应使用keyRelease()释放该键。

另请参阅 QTest::keyRelease() 和QTest::keyClick()。

void QTest::keyPress(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟按下key 键,并可选地在widget 上使用modifier 。如果delay 大于 0,则测试将在按下该键前等待delay 毫秒。

注意:在 某个时刻,您应使用keyRelease()释放该键。

这是一个重载函数。

另请参见 QTest::keyRelease() 和QTest::keyClick()。

void QTest::keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟按下key 键,并可选地设置modifier ,该操作在window 上执行。如果delay 大于 0,则测试将在按下该键前等待delay 毫秒。

注意:在 某个时刻,您应使用keyRelease()释放该键。

这是一个重载函数。

另请参阅 QTest::keyRelease() 和QTest::keyClick()。

void QTest::keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟按下带有可选modifier 的key ,该键位于window 上。如果delay 大于0,则测试将在按下该键前等待delay 毫秒。

注意:在 适当的时候,应使用keyRelease()释放该键。

这是一个重载函数。

另请参见 QTest::keyRelease() 和QTest::keyClick()。

void QTest::keyRelease(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟在widget 上释放一个key ,并可选地设置modifier 。如果delay 大于0,则测试将在释放键之前等待delay 毫秒。

另请参阅 QTest::keyPress() 和QTest::keyClick()。

void QTest::keyRelease(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟在widget 上释放一个key ,并可选地指定modifier 。如果delay 大于0,则测试将在释放键之前等待delay 毫秒。

这是一个重载函数。

另请参阅 QTest::keyClick()。

void QTest::keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟在window 上释放一个key ,并可选地指定modifier 。如果delay 大于0,则测试将在释放键之前等待delay 毫秒。

这是一个重载函数。

另请参阅 QTest::keyPress() 和QTest::keyClick()。

void QTest::keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)

模拟在window 上释放一个key ,并可选地设置modifier 。如果delay 大于0,则测试将在释放键之前等待delay 毫秒。

这是一个重载函数。

另请参阅 QTest::keyClick()。

void QTest::keySequence(QWidget *widget, const QKeySequence &keySequence)

模拟在widget 中输入keySequence 的操作。

这是一个重载函数。

另请参阅 QTest::keyClick() 和QTest::keyClicks()。

void QTest::keySequence(QWindow *window, const QKeySequence &keySequence)

模拟在window 中输入keySequence 的操作。

这是一个重载函数。

另请参阅 QTest::keyClick() 和QTest::keyClicks()。

void QTest::mouseClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在widget 上点击鼠标button ,可选modifier 。点击位置由pos 定义;默认位置为控件中心。如果指定了delay ,测试将在按下和释放按钮前等待指定毫秒数。

另请参阅 QTest::mousePress() 和QTest::mouseRelease()。

void QTest::mouseClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在window 上单击鼠标button ,可选地配合stateKey 修饰符。单击位置由pos 定义;默认位置为窗口中心。如果指定了delay ,测试将在按下和释放按钮前分别等待指定毫秒数。

这是一个重载函数。

另请参阅 QTest::mousePress() 和QTest::mouseRelease()。

void QTest::mouseDClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在widget 上双击鼠标button ,并可选地设置modifier 。点击位置由pos 定义;默认位置为控件的中心。如果指定了delay ,测试将在每次按下和释放前等待指定的毫秒数。

另请参阅 QTest::mouseClick()。

void QTest::mouseDClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在window 上双击鼠标button ,可选地配合stateKey 修饰符。点击位置由pos 定义;默认位置为窗口中心。如果指定了delay ,测试将在每次按下和松开鼠标前等待指定的毫秒数。

这是一个重载函数。

另请参阅 QTest::mouseClick()。

void QTest::mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay = -1)

将鼠标指针移动到widget 。如果未指定pos ,鼠标指针将移动到控件的中心。如果指定了delay (单位为毫秒),则系统会在移动鼠标指针之前进行等待。

void QTest::mouseMove(QWindow *window, QPoint pos = QPoint(), int delay = -1)

将鼠标指针移动到window 。如果未指定pos ,鼠标指针将移动到窗口中心。如果指定了delay (单位为毫秒),则测试将在移动鼠标指针前进行等待。

这是一个重载函数。

void QTest::mousePress(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在widget 上按下鼠标button ,并可选地设置modifier 。位置由pos 定义;默认位置为控件的中心。如果指定了delay ,则测试将在按下前等待指定的毫秒数。

另请参阅 QTest::mouseRelease() 和QTest::mouseClick()。

void QTest::mousePress(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在window 上按下鼠标button ,并可选地使用stateKey 修饰符。位置由pos 定义;默认位置为窗口中心。如果指定了delay ,则测试将在按下前等待指定的毫秒数。

这是一个重载函数。

另请参阅 QTest::mouseRelease() 和QTest::mouseClick()。

void QTest::mouseRelease(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在widget 上释放鼠标按钮button ,并可选指定modifier 。释放位置由pos 定义;默认位置为控件的中心。 如果指定了delay ,测试将在释放按钮前等待指定的毫秒数;否则,将等待默认时间(1 毫秒),该默认时间可通过命令行参数覆盖。

注意:若需 通过单独发送事件来测试双击,请在两次鼠标释放事件中分别指定一个短暂的延迟(需大于默认值)。按下、释放、再次按下和再次释放的延迟总和必须小于QStyleHints::mouseDoubleClickInterval()。但若无需在事件之间检查状态,建议使用QTest::mouseDClick()。

QSignalSpy doubleClickSpy(target, &TargetClass::doubleClicked);
const QPoint p(1, 2);
QTest::mousePress(&myWindow, Qt::LeftButton, Qt::NoModifier, p);
QVERIFY(target.isPressed());
QTest::mouseRelease(&myWindow, Qt::LeftButton, Qt::NoModifier, p, 10);
QCOMPARE(target.isPressed(), false);
QTest::mousePress(&myWindow, Qt::LeftButton, Qt::NoModifier, p, 10);
QCOMPARE(target.pressCount(), 2);
QTest::mouseRelease(&myWindow, Qt::LeftButton, Qt::NoModifier, p, 10);
QCOMPARE(doubleClickSpy.count(), 1);

另请参阅 QTest::mousePress() 和QTest::mouseClick()。

void QTest::mouseRelease(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)

模拟在window 上释放鼠标button ,可选stateKey 修饰符。释放位置由pos 定义;默认位置为窗口中心。 如果指定了delay ,测试将在释放按钮前等待指定毫秒数;否则,将等待默认时间(1 毫秒),该默认时间可通过命令行参数覆盖。

注意:若需 通过单独发送事件来测试双击操作,请在两个鼠标释放事件中均指定一个短暂的延迟(需大于默认值)。按下、释放、再次按下和再次释放的延迟总和必须小于QStyleHints::mouseDoubleClickInterval()。但若无需在事件之间检查状态,建议使用QTest::mouseDClick()。

QSignalSpy doubleClickSpy(target, &TargetClass::doubleClicked);
const QPoint p(1, 2);
QTest::mousePress(&myWindow, Qt::LeftButton, Qt::NoModifier, p);
QVERIFY(target.isPressed());
QTest::mouseRelease(&myWindow, Qt::LeftButton, Qt::NoModifier, p, 10);
QCOMPARE(target.isPressed(), false);
QTest::mousePress(&myWindow, Qt::LeftButton, Qt::NoModifier, p, 10);
QCOMPARE(target.pressCount(), 2);
QTest::mouseRelease(&myWindow, Qt::LeftButton, Qt::NoModifier, p, 10);
QCOMPARE(doubleClickSpy.count(), 1);

这是一个重载函数。

另请参阅 QTest::mousePress() 和QTest::mouseClick()。

QTestData &QTest::newRow(const char *dataTag)

将新行追加到当前测试数据中。

测试输出将使用名称dataTag 来标识使用此测试数据的测试运行。

返回一个 QTestData 引用,可用于流式导入数据,表中的每一列对应一个值。

示例:

void MyTestClass::addSingleStringRows()
{
    QTest::addColumn<QString>("aString");
    QTest::newRow("just.hello") << QString("hello");
    QTest::newRow("a.null.string") << QString();
}

注意:此 函数只能作为测试框架调用的测试数据函数的一部分来调用。

有关更详尽的示例,请参阅“数据驱动测试”。

另请参阅 addRow()、addColumn() 和QFETCH()。

int QTest::qExec(QObject *testObject, int argc = 0, char **argv = nullptr)

执行在testObject 中声明的测试。此外,如果存在私有槽initTestCase() 、cleanupTestCase() 、init() 和cleanup() ,也会执行这些槽。更多详细信息请参阅“创建测试”。

可选地,可以提供命令行参数argc 和argv 。有关可识别参数的列表,请参阅Qt Test 命令行参数。

以下示例将运行MyTestObject 中的所有测试:

MyTestObject test1;
QTest::qExec(&test1);

如果所有测试均通过,该函数返回 0;如果有一个或多个测试失败,或者发生未处理的异常,则返回非零值。(被跳过的测试不会影响返回值。)

对于独立的测试应用程序,可以使用便捷宏QTEST_MAIN() 来声明一个 main() 函数,该函数负责解析命令行参数并执行测试,从而无需显式调用此函数。

当使用QTEST_MAIN() 宏时,该函数的返回值即为测试应用程序的退出代码。

对于独立测试应用程序,不应多次调用此函数,否则用于将测试输出记录到文件以及执行单个测试函数的命令行选项将无法正常工作。

注意:此函数 不可重入,每次只能运行一个测试。通过 qExec() 执行的测试无法通过 qExec() 运行另一个测试,且不允许多个线程同时调用 qExec()。

如果您是通过编程方式创建的参数(而不是从main() 中的参数获取),那么您可能会对使用 QTest::qExec(QObject *, constQStringList &) 感兴趣,因为它是 Unicode 安全的。

另请参阅 QTEST_MAIN()、QTEST_GUILESS_MAIN()和QTEST_APPLESS_MAIN()。

int QTest::qExec(QObject *testObject, const QStringList &arguments)

其行为与 qExec(QObject *, int, char**) 完全相同,但接受一个由arguments 组成的QStringList ,而不是char** 列表。

这是一个重载函数。

QSharedPointer<QTemporaryDir> QTest::qExtractTestData(const QString &dirName)

将资源中的目录提取到磁盘上。内容将递归地提取到一个临时文件夹中。一旦对返回值的最后一个引用超出作用域,提取的内容将自动被删除。

dirName 是要从资源中提取的目录名称。

返回数据被提取到的临时目录,若发生错误则返回 null。

[since 6.5] void QTest::qRegisterTestCase(const QString &name, QTest::TestEntryFunction entryFunction)

将测试name (其入口函数为entryFunction )注册到当前二进制文件的中央测试用例注册表中。

当不带任何参数运行批处理测试二进制文件时,name 将被列出。若使用name 的 argv[1] 参数运行测试二进制文件,将调用entryFunction 。

该函数于 Qt 6.5 版本中引入。

[since 6.7] void QTest::qSleep(std::chrono::milliseconds msecs)

使用 `msecs` 进行休眠,这会阻塞测试的执行。

此方法不会处理任何事件,且会导致测试进入无响应状态。休眠期间网络通信可能会超时。请使用QTest::qWait() 进行非阻塞休眠。

msecs 必须大于 0 毫秒。

注意: 从 Qt 6.7开始, 该函数使用 `std::this_thread::sleep_for` 实现,因此耗时精度取决于标准库的实现。在 Qt 6.7 之前,该函数在 Unix 系统上调用 `nanosleep() `,在 Windows 系统上调用 `Sleep() `,因此该函数中耗时的精度取决于操作系统。

示例:

using namespace std::chrono_literals;
QTest::qSleep(250ms);

该函数于 Qt 6.7 中引入。

另请参阅 QTest::qWait()。

void QTest::qSleep(int ms)

休眠ms 毫秒,阻塞测试的执行。

相当于调用:

QTest::qSleep(std::chrono::milliseconds{ms});

这是一个重载函数。

[since 6.7] void QTest::qWait(std::chrono::milliseconds msecs)

等待msecs 。在等待期间,系统会继续处理事件,且您的测试仍能对用户界面事件或网络通信做出响应。

示例:

    using namespace std::chrono_literals;
    int i = 0;
    while (myNetworkServerNotResponding() && i++ < 50)
        QTest::qWait(250ms);

上述代码将等待网络服务器响应,最长等待时间约为 12.5 秒。

与 qWait() 相比,QTRY_* 宏通常是更好的选择。qWait() 总是会暂停直至超时结束,这可能会导致测试处于空闲状态并减慢执行速度。

QTRY_* 宏会持续轮询该条件,直到成功或超时结束。因此,您的测试能尽快继续执行,并且更加可靠。如果条件仍然失败,这些宏会将超时时间加倍一次,并报告新值,以便您进行调整。

例如,将上面的代码重写为:

QTRY_VERIFY_WITH_TIMEOUT(!myNetworkServerNotResponding(), 12.5s);

该函数在 Qt 6.7 中引入。

另请参阅 QTest::qSleep()、QSignalSpy::wait() 和QTRY_VERIFY_WITH_TIMEOUT()。

void QTest::qWait(int msecs)

等待msecs 。相当于调用:

QTest::qWait(std::chrono::milliseconds{msecs});

这是一个重载函数。

[since 6.7] template <typename Functor> bool QTest::qWaitFor(Functor predicate, QDeadlineTimer deadline = QDeadlineTimer( defaultTryTimeout.load(std::memory_order_relaxed)))

等待deadline 超时,或者直到predicate 返回true,以先发生者为准。

如果predicate 在任何时候返回 true,则返回true ;否则返回false 。

示例:

    MyObject obj;
    obj.startup();
    using namespace std::chrono_literals;
    const bool result = QTest::qWaitFor([&obj]() { return obj.isReady(); },
                                        QDeadlineTimer(3s));

上述代码将等待对象就绪,最长等待三秒。

该函数自 Qt 6.7 起引入。

template <typename Functor> bool QTest::qWaitFor(Functor predicate, int timeout)

等待timeout 毫秒,或者直到predicate 返回true。

这相当于调用:

qWaitFor(predicate, QDeadlineTimer(timeout));

这是一个重载函数。

[since 6.10] bool QTest::qWaitForWindowActive(QWidget *widget, QDeadlineTimer timeout)

如果widget 在timeout 毫秒内处于活动状态,则返回true ;否则返回false 。

该方法在调用 `QWidget::show()` 并依赖小部件实际处于活动状态(即可见且拥有焦点)后再继续执行的测试中非常有用。

注意: 如果另一个窗口阻止widget 变得处于活动状态,该 方法将超时并返回false 。

注意:由于 焦点是一种排他性属性,widget 可能会在任何时候将焦点让给另一个窗口——即使在该方法已返回true 之后也是如此。

该函数在 Qt 6.10 中引入。

另请参阅 qWaitForWindowExposed() 和QWidget::isActiveWindow()。

[since 6.10] bool QTest::qWaitForWindowActive(QWindow *window, QDeadlineTimer timeout)

如果window 在timeout 内处于活动状态,则返回true ;否则返回false 。

该方法在调用 `QWindow::show()` 并依赖窗口实际处于活动状态(即可见且拥有焦点)后才继续执行的测试中非常有用。

注意: 如果另一个窗口阻止了window 成为活动窗口,该 方法将超时并返回false 。

注意:由于 焦点是一种排他性属性,window 可能会在任何时候将焦点让给另一个窗口——即使在该方法已返回true 之后也是如此。

该函数在 Qt 6.10 中引入。

另请参阅 qWaitForWindowExposed()、qWaitForWindowFocused() 和QWindow::isActive()。

[since 6.10] bool QTest::qWaitForWindowActive(QWidget *widget)

该函数使用 5 秒的默认超时时间。

这是一个重载函数。

该函数在 Qt 6.10 中引入。

[since 6.10] bool QTest::qWaitForWindowActive(QWindow *window)

该函数使用默认的 5 秒超时时间。

这是一个重载函数。

该函数在 Qt 6.10 中引入。

bool QTest::qWaitForWindowActive(QWidget *widget, int timeout)

timeout 的单位是毫秒。

这是一个重载函数。

bool QTest::qWaitForWindowActive(QWindow *window, int timeout)

timeout 的单位是毫秒。

这是一个重载函数。

[since 6.10] bool QTest::qWaitForWindowExposed(QWidget *widget, QDeadlineTimer timeout)

如果widget 在timeout 毫秒内被暴露,则返回true ;否则返回false 。

该方法在调用 `QWidget::show()` 并依赖于小部件实际可见后才继续执行的测试中非常有用。

注意: 如果窗口的客户端区域不可见(例如被其他窗口完全遮挡),则即使该窗口 已映射到屏幕上,仍可能不被视为已暴露。在这种情况下,该方法将超时并返回false 。

该函数在 Qt 6.10 中引入。

另请参阅 qWaitForWindowActive()、QWidget::isVisible() 以及QWindow::isExposed()。

[since 6.10] bool QTest::qWaitForWindowExposed(QWindow *window, QDeadlineTimer timeout)

如果 `window ` 在 `timeout` 中可见,则返回 `true`;否则返回 `false`。

该方法在调用QWindow::show() 并依赖窗口实际可见性才能继续执行的测试中非常有用。

注意: 如果窗口的客户端区域不可见(例如被其他窗口完全遮挡),则即使该窗口 已映射到屏幕上,仍可能不被视为已暴露。在这种情况下,该方法将超时并返回false 。

该函数在 Qt 6.10 中引入。

另请参阅 qWaitForWindowActive() 和QWindow::isExposed()。

[since 6.10] bool QTest::qWaitForWindowExposed(QWidget *widget)

该函数使用默认的 5 秒超时时间。

这是一个重载函数。

该函数于 Qt 6.10 中引入。

[since 6.10] bool QTest::qWaitForWindowExposed(QWindow *window)

该函数使用默认的 5 秒超时时间。

这是一个重载函数。

该函数在 Qt 6.10 中引入。

bool QTest::qWaitForWindowExposed(QWidget *widget, int timeout)

timeout 的单位是毫秒。

这是一个重载函数。

bool QTest::qWaitForWindowExposed(QWindow *window, int timeout)

timeout 的单位是毫秒。

这是一个重载函数。

[since 6.7] bool QTest::qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout)

如果widget 是timeout 中的焦点窗口,则返回true ;否则返回false 。

该方法在调用 `QWidget::show()` 并依赖小部件获得焦点(例如,用于接收键盘事件)后再继续执行的测试中非常有用。

注意: 如果另一个窗口阻止了widget 获得焦点,该 方法将超时并返回false 。

注意:由于 焦点是一种排他性属性,widget 可能会在任何时候(即使在该方法已返回true 之后)将焦点让给另一个窗口。

该函数于 Qt 6.7 中引入。

另请参阅 qWaitForWindowExposed()、qWaitForWindowActive() 和QGuiApplication::focusWindow()。

[since 6.7] bool QTest::qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout)

如果window 是timeout 中的焦点窗口,则返回true ;否则返回false 。

该方法在调用 `QWindow::show()` 并依赖窗口获得焦点(例如用于接收键盘事件)后再继续执行的测试中非常有用。

注意: 如果另一个窗口阻止了window 获得焦点,该 方法将超时并返回false 。

注意:由于 焦点是一种排他性属性,window 可能会在任何时候将焦点让给另一个窗口——即使在该方法已返回true 之后也是如此。

该函数于 Qt 6.7 中引入。

另请参阅 qWaitForWindowExposed()、qWaitForWindowActive() 和QGuiApplication::focusWindow()。

[since 6.10] bool QTest::qWaitForWindowFocused(QWidget *widget)

该函数使用 5 秒的默认超时时间。

这是一个重载函数。

该函数在 Qt 6.10 中引入。

[since 6.10] bool QTest::qWaitForWindowFocused(QWindow *window)

该函数使用默认的 5 秒超时时间。

这是一个重载函数。

该函数于 Qt 6.10 中引入。

void QTest::setBenchmarkResult(qreal result, QTest::QBenchmarkMetric metric)

将此测试函数的基准测试结果设置为result 。

若希望在不使用 QBENCHMARK 宏的情况下报告基准测试结果,请使用此函数。使用metric 来指定Qt Test 应如何解释这些结果。

结果的上下文将包括测试函数名称以及来自 _data 函数的任何数据标签。该函数在每个测试函数中只能被调用一次,后续调用将替换先前报告的结果。

请注意,对于未包含 QBENCHMARK 宏的测试函数,命令行参数 -iterations 不会产生任何影响。

[noexcept, since 6.8] void QTest::setThrowOnFail(bool enable)

启用(enable =true )或禁用(enable=false )在QCOMPARE()/QVERIFY() 操作失败时抛出异常(而非仅从最外层函数上下文返回)。

该功能采用引用计数机制:如果您使用true 调用了该函数N次,则需要使用false 调用N次才能回到起始位置。

当定义了QTEST_THROW_ON_FAIL C++ 宏时,此调用将无效。

注意: 要使用此功能,必须 在启用异常的情况下编译测试。

该函数于 Qt 6.8 中引入。

另请参阅 setThrowOnSkip()、ThrowOnFailEnabler 、ThrowOnFailDisabler 和QTEST_THROW_ON_FAIL 。

[noexcept, since 6.8] void QTest::setThrowOnSkip(bool enable)

启用(enable =true )或禁用(enable=false )在调用QSKIP()时抛出异常(而非仅从最外层函数上下文中返回)。

该功能采用引用计数机制:若您在true 状态下调用此函数N次,则需在false 状态下调用该函数N次,才能回到初始状态。

当定义了QTEST_THROW_ON_SKIP C++ 宏时,此调用将无效。

注意: 要使用此功能,必须 在启用异常的情况下编译测试。

该函数在 Qt 6.8 中引入。

另请参阅 setThrowOnFail()、ThrowOnSkipEnabler 、ThrowOnSkipDisabler 和QTEST_THROW_ON_SKIP 。

char *QTest::toHexRepresentation(const char *ba, qsizetype length)

返回一个字符串指针,该字符串表示字符串ba ,以空格分隔的十六进制字符序列形式呈现。如果输入被认为过长,则会进行截断。截断情况会在返回的字符串末尾通过省略号表示。调用者拥有该返回指针的所有权,并必须确保随后将其传递给 operator delete[]。

length 是字符串ba 的长度。

template <typename T> char *QTest::toString(const T &value)

返回value 的文本表示形式。该函数由QCOMPARE()调用,用于在测试失败时输出详细信息。

您可以在测试中为该函数添加特化或重载,以启用详细输出。

注意:从 Qt 5.5开始,建议 在类型的命名空间中提供 toString() 函数,而非对该模板进行特化。如果您的代码需要继续与 Qt 5.4 或更早版本的 QTestLib 兼容,则仍需继续使用特化形式。

注意: toString()的调用者 必须使用 `delete[]` 删除返回的数据。您的实现应返回使用 `new[] ` 或 `qstrdup()` 创建的字符串。最简单的方法是创建一个 `QByteArray ` 或 `QString `,并对其调用 `QTest::toString()`(参见下文的第二个示例)。

特化示例(Qt ≤ 5.4):

namespace QTest {
    template<>
    char *toString(const MyPoint &point)
    {
        const QByteArray ba("MyPoint("
                            + QByteArray::number(point.x()) + ", "
                            + QByteArray::number(point.y()) + ')');
        return qstrdup(ba.data());
    }
}

上面的示例为名为MyPoint 的类定义了 toString() 的特化。每当两个MyPoint 实例的比较失败时,QCOMPARE() 都会调用此函数,将MyPoint 的内容输出到测试日志中。

同上示例,但采用重载(Qt ≥ 5.5):

char *toString(const MyPoint &point) // should be inside the same namespace as MyPoint
{
    return QTest::toString("MyPoint(" +
                           QByteArray::number(point.x()) + ", " +
                           QByteArray::number(point.y()) + ')');
}

另请参阅 QCOMPARE()。

char *toString(QSizePolicy sp)

返回大小策略sp 的文本表示形式。

这是一个重载函数。

char *toString(QSizePolicy::ControlType ct)

返回控制类型ct 的文本表示形式。

这是一个重载函数。

char *toString(QSizePolicy::ControlTypes cts)

返回控制类型的文本表示形式:cts 。

这是一个重载函数。

char *toString(QSizePolicy::Policy p)

返回策略p 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QByteArray &ba)

返回字节数组 `ba` 的字符串表示形式。

这是一个重载函数。

另请参阅 QTest::toHexRepresentation()。

char *QTest::toString(const QCborError &c)

返回给定 CBOR 错误c 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QChar &character)

返回给定character 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QDate &date)

返回给定date 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QDateTime &dateTime)

返回由dateTime 指定的日期和时间的文本表示形式。

这是一个重载函数。

[since 6.5] char *QTest::toString(const QKeySequence &ks)

返回键序列ks 的文本表示。

这是一个重载函数。

该函数在 Qt 6.5 中引入。

char *QTest::toString(const QLatin1StringView &string)

返回给定string 的字符串表示形式。

这是一个重载函数。

char *QTest::toString(const QPoint &point)

返回给定point 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QPointF &point)

返回给定point 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QRect &rectangle)

返回给定rectangle 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QRectF &rectangle)

返回给定rectangle 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QSize &size)

返回给定size 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QSizeF &size)

返回给定size 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QString &string)

返回给定string 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QStringView &string)

返回给定string 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QTime &time)

返回给定time 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QUrl &url)

返回给定url 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QUuid &uuid)

返回给定uuid 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QVariant &variant)

返回给定variant 的文本表示形式。

这是一个重载函数。

char *QTest::toString(const QVector2D &v)

返回二维向量v 的字符串表示形式。

这是一个重载函数。

char *QTest::toString(const QVector3D &v)

返回三维向量v 的字符串表示形式。

这是一个重载函数。

char *QTest::toString(const QVector4D &v)

返回 4D 向量 `v` 的文本表示形式。

这是一个重载函数。

template <typename T1, typename T2> char *QTest::toString(const std::pair<T1, T2> &pair)

返回pair 的文本表示形式。

这是一个重载函数。

template <typename... Types> char *QTest::toString(const std::tuple<Types...> &tuple)

返回给定tuple 的文本表示形式。

这是一个重载函数。

char *QTest::toString(std::nullptr_t)

返回一个包含“nullptr ”的字符串。

这是一个重载函数。

QTest::QTouchEventWidgetSequence QTest::touchEvent(QWidget *widget, QPointingDevice *device, bool autoCommit = true)

为device 创建并返回一个QTouchEventSequence ,用于为widget 模拟事件。

在向序列中添加触摸事件时,widget 还将用于将提供的位置转换为屏幕坐标,除非在相应的 press()、move() 等调用中提供了另一个控件。

当QTouchEventSequence 的析构函数被调用时(即返回的对象超出作用域时),触摸事件会被提交到事件系统,除非autoCommit 被设置为 false。当autoCommit 为 false 时,必须手动调用 commit()。

createTouchDevice可调用 () 函数来创建一个用于此函数的测试触摸设备。

QTest::QTouchEventSequence QTest::touchEvent(QWindow *window, QPointingDevice *device, bool autoCommit = true)

为device 创建并返回一个QTouchEventSequence ,用于为window 模拟事件。

在向序列添加触摸事件时,window 还将用于将提供的位置转换为屏幕坐标,除非在相应的 press()、move() 等调用中提供了另一个窗口。

当QTouchEventSequence 的析构函数被调用时(即返回的对象超出作用域时),触摸事件会被提交到事件系统,除非autoCommit 被设置为 false。当autoCommit 为 false 时,必须手动调用 commit()。

createTouchDevice可调用 () 来创建一个用于此函数的测试触摸设备。

[since 6.8] void QTest::wheelEvent(QWindow *window, QPointF pos, QPoint angleDelta, QPoint pixelDelta = QPoint(0, 0), Qt::KeyboardModifiers stateKey = Qt::NoModifier, Qt::ScrollPhase phase = Qt::NoScrollPhase)

在window 内模拟一个滚轮事件,其位置为本地窗口坐标系中的pos 。angleDelta 包含滚轮的旋转角度。正值表示向前旋转,负值表示向后旋转。pixelDelta 包含屏幕上的滚动距离(以像素为单位)。该值可以为空。事件发生时的键盘状态由stateKey 指定。事件的滚动阶段由phase 指定。

该函数在 Qt 6.8 中引入。

宏文档

QBENCHMARK

该宏用于测量测试中代码的性能。待测代码包含在该宏后面的代码块中。

例如:

void TestBenchmark::simple()
{
    QString str1 = u"This is a test string"_s;
    QString str2 = u"This is a test string"_s;
    QCOMPARE(str1.localeAwareCompare(str2), 0);
    QBENCHMARK {
        str1.localeAwareCompare(str2);
    }
}

另请参阅 “创建基准测试”和“编写基准测试”。

QBENCHMARK_ONCE

QBENCHMARK_ONCE 宏用于通过单次执行来测量代码块的性能。

该宏用于测量测试中的代码性能。待基准测试的代码包含在该宏后面的代码块中。

与 QBENCHMARK 不同,该代码块中的内容仅执行一次。如果耗时过短,无法被所选后端测量,则报告的耗时为“0”。

另请参阅 《创建基准测试》和《编写基准测试》。

QCOMPARE(actual, expected)

QCOMPARE() 宏使用相等运算符,将一个actual 值与一个expected 值进行比较。如果actual 和expected 匹配,则继续执行。如果不匹配,则在测试日志中记录一次失败,并且测试函数会直接返回,不再进行后续检查。

请务必遵守 QCOMPARE() 参数的语义规则。传递给该函数的第一个参数应始终是被测代码生成的实际值,而第二个参数应始终是预期值。 当值不匹配时,QCOMPARE() 会将它们分别标注为“Actual”(实际值)和“Expected”(预期值)并输出。如果参数顺序被调换,调试失败的测试可能会令人困惑,且预期值为零的测试可能会因舍入误差而失败。

如果比较失败,QCOMPARE() 会尝试输出这些值的内容,因此从测试日志中可以清楚地看到比较失败的原因。

示例:

QCOMPARE(QString("hello").toUpper(), QString("HELLO"));

在比较浮点类型(float 、double 和qfloat16 )时,对于有限值使用qFuzzyCompare()。如果两个值的qFuzzyIsNull() 均为真,则它们也被视为相等。 无穷大若符号相同则视为匹配;任何作为实际值的 NaN 与任何作为预期值的 NaN 均视为匹配(尽管 NaN != NaN,即使它们完全相同)。

在比较QList 时,可以传递数组或值类型的初始化列表作为预期值:

    const int expected[] = {8, 10, 12, 16, 20, 24};
    QCOMPARE(QFontDatabase::standardSizes(), expected);

请注意,使用初始化列表需要定义一个辅助宏,以防止预处理器将逗号解释为宏参数分隔符:

 #define ARG(...) __VA_ARGS__
     QCOMPARE(QFontDatabase::standardSizes(), ARG({8, 10, 12, 16, 20, 24}));
 #undef ARG

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,可以重载 `QTest::toString()` 函数,以格式化输出到测试日志中的值。

示例:

char *toString(const MyType &t)
{
    char *repr = new char[t.reprSize()];
    t.writeRepr(repr);
    return repr;
}

toString() 的返回值必须是 `new char []`。也就是说,一旦调用代码不再需要该对象,应使用 `delete[] `(而非 `free() ` 或简单的 `delete`)将其释放。

另请参阅 QVERIFY()、QTRY_COMPARE()、QTest::toString()、QEXPECT_FAIL()、QCOMPARE_EQ()、QCOMPARE_NE()、QCOMPARE_LT()、QCOMPARE_LE()、QCOMPARE_GT() 以及QCOMPARE_GE()。

[since 6.9] QCOMPARE_3WAY(lhs, rhs, order)

QCOMPARE_3WAY() 宏将三元比较运算符<=> 应用于输入表达式lhs 和rhs ,并检查结果是否为order 。如果为真,则继续执行;否则,将在测试日志中记录一次失败,且测试函数将直接返回,不再进行后续检查。 该宏仅接受 Qt:: 和 std:: 排序类型作为order 的参数,否则将触发断言。

注意: 即使decltype(lhs <=> rhs) 是std类型的,order 也可以 是Qt::排序类型。decltype(lhs <=> rhs) 运算的结果应与order 具有相同的强度。否则,应用该宏将导致编译错误。例如,如果decltype(lhs <=> rhs) 的结果具有弱排序类型,则order 参数不能包含部分或强排序类型。

注意:该宏 仅在编译器支持<=> 运算符时才有效;否则,它会静态断言该先决条件功能不可用。在使用宏之前,请务必检查__cpp_lib_three_way_comparison 是否已定义,若未定义,请使用 QSKIP。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,可以重载QTest::toString() 来格式化要输出到测试日志中的值。

该宏于 Qt 6.9 中引入。

[since 6.4] QCOMPARE_EQ(computed, baseline)

QCOMPARE_EQ() 宏使用相等运算符检查computed 是否等于baseline 。如果为真,则继续执行;否则,将在测试日志中记录一次失败,并且测试函数将返回,不再尝试后续的检查。

其行为通常类似于调用QVERIFY(computed == baseline); ,但在失败时会打印一条格式化的错误消息,报告computed 和baseline 的参数表达式及值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,您可以重载QTest::toString() 来格式化要输出到测试日志中的值。

注意:与 QCOMPARE() 不同, 此宏不提供针对自定义类型和指针的重载。因此,例如将两个const char * 值作为参数传递时,将进行指针比较,而QCOMPARE() 则进行 C 风格字符串的比较。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE()、QCOMPARE_NE()、QCOMPARE_LT()、QCOMPARE_LE()、QCOMPARE_GT() 以及QCOMPARE_GE()。

[since 6.4] QCOMPARE_GE(computed, baseline)

QCOMPARE_GE() 宏使用“大于或等于”运算符,检查computed 是否至少等于baseline 。如果条件为真,则继续执行;否则,将在测试日志中记录一次失败,且测试函数将直接返回,不再进行后续检查。

其工作原理通常与调用 `QVERIFY(computed >= baseline); ` 类似,但在失败时会打印一条格式化的错误消息,其中包含 `computed ` 和 `baseline ` 的参数表达式及值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,您可以重载QTest::toString() 来对输出到测试日志中的值进行格式化。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_EQ()、QCOMPARE_NE()、QCOMPARE_LT()、QCOMPARE_LE() 和QCOMPARE_GT()。

[since 6.4] QCOMPARE_GT(computed, baseline)

QCOMPARE_GT() 宏使用大于运算符检查computed 是否大于baseline 。如果条件为真,则继续执行;否则,将在测试日志中记录失败,且测试函数将直接返回,不再执行后续检查。

其作用通常与调用QVERIFY(computed > baseline); 类似,但在失败时会打印一条格式化的错误消息,其中包含computed 和baseline 的参数表达式及值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,您可以重载QTest::toString() 来格式化要输出到测试日志中的值。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_EQ()、QCOMPARE_NE()、QCOMPARE_LT()、QCOMPARE_LE() 和QCOMPARE_GE()。

[since 6.4] QCOMPARE_LE(computed, baseline)

QCOMPARE_LE() 宏使用“小于等于”运算符,检查computed 是否不大于baseline 。如果条件为真,则继续执行;否则,将在测试日志中记录失败,且测试函数将直接返回,不再尝试后续检查。

其功能通常与调用QVERIFY(computed <= baseline); 类似,但在测试失败时会打印一条格式化的错误消息,其中包含computed 和baseline 的参数表达式及值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,您可以重载QTest::toString() 来格式化要输出到测试日志中的值。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_EQ()、QCOMPARE_NE()、QCOMPARE_LT()、QCOMPARE_GT() 和QCOMPARE_GE()。

[since 6.4] QCOMPARE_LT(computed, baseline)

QCOMPARE_LT() 宏使用小于运算符检查computed 是否小于baseline 。如果为真,则继续执行;否则,将在测试日志中记录失败,且测试函数将直接返回,不再进行后续检查。

其功能通常与调用 `QVERIFY(computed < baseline); ` 类似,但在测试失败时会打印一条格式化的错误消息,其中包含 `computed ` 和 `baseline ` 的参数表达式及其值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,您可以重载QTest::toString() 来格式化要输出到测试日志中的值。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_EQ()、QCOMPARE_NE()、QCOMPARE_LE()、QCOMPARE_GT() 以及QCOMPARE_GE()。

[since 6.4] QCOMPARE_NE(computed, baseline)

宏 QCOMPARE_NE() 使用不等号运算符检查computed 是否不等于baseline 。如果条件为真,则继续执行;否则,将在测试日志中记录一次失败,且测试函数将直接返回,不再进行后续检查。

其工作原理通常与调用QVERIFY(computed != baseline); 类似,但在失败时会打印一条格式化的错误消息,其中报告computed 和baseline 的参数表达式及值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

对于您自己的类,您可以重载QTest::toString() 来格式化要输出到测试日志中的值。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_EQ()、QCOMPARE_LT()、QCOMPARE_LE()、QCOMPARE_GT() 和QCOMPARE_GE()。

QEXPECT_FAIL(dataIndex, comment, mode)

QEXPECT_FAIL() 宏将标记接下来的QCOMPARE() 或QVERIFY() 调用为预期失败。系统不会将失败记录到测试日志中,而是报告一次预期失败。

如果QVERIFY() 或QCOMPARE() 被标记为预期失败,但实际通过了测试,则会将“意外通过”(XPASS)写入测试日志,并被计为测试失败。

参数dataIndex 用于指定测试数据中哪个条目预期会失败。如果预期所有条目都会失败,或者不存在测试数据,则传递空字符串("" )。

comment 将作为预期失败的测试日志进行追加。

mode QTest::TestFailMode 用于确定测试是否应继续执行。无论预期测试失败是否发生, 都会被应用。mode

注意:此宏 仅可在由测试框架调用的测试函数中使用。

示例 1:

QEXPECT_FAIL("", "Will fix in the next release", Continue);
QCOMPARE(i, 42);
QCOMPARE(j, 43);

在上例中,如果变量i 的值不为42,则测试输出中将记录“预期失败”;如果变量i 的值为42,则记录“意外通过”。QEXPECT_FAIL()对示例中的第二个QCOMPARE()语句没有影响。

示例 2:

QEXPECT_FAIL("data27", "Oh my, this is soooo broken", Abort);
QCOMPARE(i, 42);

对于测试数据条目data27 ,上述测试函数将不会继续执行(无论i 的值为何)。

另请参阅 QTest::TestFailMode 、QVERIFY() 和QCOMPARE()。

QFAIL(message)

此宏可用于强制测试失败。测试将停止执行,且失败信息message 将被追加到测试日志中。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

示例:

if (sizeof(int) != 4)
    QFAIL("This test has not been ported to this platform yet.");

QFETCH(type, name)

fetch 宏会在栈上创建一个名为name 的局部变量,其类型为type 。name 和type 必须与测试数据表中的某列匹配。系统会对此进行断言,如果断言失败,测试将终止。

假设一个测试具有以下数据:

void TestQString::toInt_data()
{
    QTest::addColumn<QString>("aString");
    QTest::addColumn<int>("expected");

    QTest::newRow("positive+value") << "42" << 42;
    QTest::newRow("negative-value") << "-42" << -42;
    QTest::newRow("zero") << "0" << 0;
}

测试数据包含两个元素:一个名为aString 的QString 以及一个名为expected 的整数。要在实际测试中获取这些值:

void TestQString::toInt()
{
     QFETCH(QString, aString);
     QFETCH(int, expected);

     QCOMPARE(aString.toInt(), expected);
}

aString 和expected 是栈上的变量,它们会使用当前测试数据进行初始化。

注意:此宏 仅可在由测试框架调用的测试函数中使用。该测试函数必须包含一个 _data 函数。

QFETCH_GLOBAL(type, name)

该宏从全局数据表的一行中获取名为name 、类型为type 的变量。name 和type 必须与全局数据表中的一列匹配。系统会对此进行断言,若断言失败,测试将中止。

假设某测试包含以下数据:

void TestQLocale::initTestCase_data()
{
    QTest::addColumn<QLocale>("locale");
    QTest::newRow("C") << QLocale::c();
    QTest::newRow("UKish") << QLocale("en_GB");
    QTest::newRow("USAish") << QLocale(QLocale::English, QLocale::UnitedStates);
}

void TestQLocale::roundTripInt_data()
{
    QTest::addColumn<int>("number");
    QTest::newRow("zero") << 0;
    QTest::newRow("one") << 1;
    QTest::newRow("two") << 2;
    QTest::newRow("ten") << 10;
}

该测试自身的数据为每行一个数字。在此情况下,initTestCase_data() 还会为每行提供一个区域设置。 因此,该测试将针对后者的每种区域设置与前者的每个数字的所有组合进行运行。由此可见,当全局表中有四行、本地表中有三行时,测试函数将针对 12 个不同的测试用例(4 * 3 = 12)进行运行。

void TestQLocale::roundTripInt()
{
    QFETCH_GLOBAL(QLocale, locale);
    QFETCH(int, number);
    bool ok;
    QCOMPARE(locale.toInt(locale.toString(number), &ok), number);
    QVERIFY(ok);
}

区域设置通过 QFETCH_GLOBAL() 从全局数据表中读取,数字则通过QFETCH() 从本地数据表中读取。

注意:此宏 仅可在具有initTestCase_data() 方法的类的测试方法中使用。

QFINDTESTDATA(filename)

返回由filename 所引用的测试数据文件的QString ,如果找不到该测试数据文件,则返回空的QString 。

该宏允许测试从外部文件加载数据,而无需在测试中硬编码绝对文件名,也无需使用可能容易出错的相对路径。

返回的路径将是以下列表中第一个能解析为现有文件或目录的路径:

如果指定的文件/目录在上述任何位置都不存在,则会在测试日志中输出警告。

例如,在以下代码中:

bool tst_MyXmlParser::parse()
{
    MyXmlParser parser;
    QString input = QFINDTESTDATA("testxml/simple1.xml");
    QVERIFY(parser.parse(input));
}

测试数据文件将从以下路径中确定为第一个存在的文件:

  • /home/user/build/myxmlparser/tests/tst_myxmlparser/testxml/simple1.xml
  • /usr/local/Qt-5.0.0/tests/tst_myxmlparser/testxml/simple1.xml
  • /home/user/sources/myxmlparser/tests/tst_myxmlparser/testxml/simple1.xml

这使得测试能够找到其测试数据,无论该测试是否已被安装,也无论测试的构建树是否与测试的源代码树一致。

注意:要可靠地 从源代码目录检测测试数据,必须满足以下条件之一:使用 qmake;定义QT_TESTCASE_BUILDDIR 宏使其指向调用编译器的当前工作目录;或者仅向编译器传递源文件的绝对路径。否则,无法确定源代码目录的绝对路径。

注意: 如果使用了 CMake 且将QtTest 模块链接到目标,则QT_TESTCASE_BUILDDIR 宏也会被隐式定义。您可以通过在目标上设置 QT_TESTCASE_BUILDDIR 属性来更改默认的QT_TESTCASE_BUILDDIR 。

注意:对于 使用QTEST_APPLESS_MAIN() 宏生成main() 函数的测试,QFINDTESTDATA 不会尝试查找相对于QCoreApplication::applicationDirPath() 的测试数据。实际上,这意味着如果从影子构建树运行使用QTEST_APPLESS_MAIN() 的测试,将无法找到相应的测试数据。

QSKIP(description)

如果在测试函数中调用 QSKIP() 宏,该宏会停止测试的执行,且不会在测试日志中记录失败。您可以使用它来跳过在当前配置下没有意义的测试。例如,如果测试系统上未安装所需的字体,则字体渲染测试可能会调用 QSKIP()。

测试日志中会追加文本“description ”,该文本应包含无法执行该测试的原因说明。

如果测试是数据驱动的,测试函数中每次调用 QSKIP() 只会跳过当前一行测试数据,因此无条件调用 QSKIP() 将在测试日志中为每一行测试数据生成一条跳过消息。

如果从_data 函数中调用,QSKIP()宏将停止_data 函数的执行,并阻止相关测试函数的执行。这将完全跳过一个数据驱动测试。要跳过单个行,请在_data 函数中使用简单的if (condition) newRow(...) << ... 进行条件判断,而不是在测试函数中使用QSKIP()。

如果从initTestCase_data() 调用,QSKIP()宏将跳过所有测试函数和_data 函数。如果在没有initTestCase_data() 的情况下从initTestCase() 调用,或者当 仅设置了一行时,QSKIP()同样会跳过整个测试。 但是,如果initTestCase_data() 包含多行数据,则会针对其每一行各调用一次initTestCase() (随后依次调用各测试函数,最后执行收尾处理)。因此,在initTestCase() 中调用QSKIP()仅会跳过当前全局数据行(由initTestCase_data() 设置)的所有测试函数。

注意:此宏 仅可在测试框架调用的测试函数或_data 函数中使用。

示例:

if (!QSqlDatabase::drivers().contains("SQLITE"))
    QSKIP("This test requires the SQLITE database driver");
跳过已知缺陷

如果测试暴露了一个不会立即修复的已知错误,请使用QEXPECT_FAIL() 宏来记录该失败,并引用该已知问题的缺陷跟踪标识符。 运行测试时,预期失败将在测试输出中标记为 XFAIL,且在设置测试程序的返回码时不会被计为失败。如果预期失败未发生,测试输出中将报告 XPASS(意外通过),并被计为测试失败。

对于已知缺陷,使用QEXPECT_FAIL() 比 QSKIP() 更佳,因为如果没有 XPASS 结果提醒开发者测试也需要更新,他们就无法修复该缺陷。如果使用 QSKIP(),则不会有提醒要求修订或重新启用该测试,而如果没有这些操作,后续的回归问题将无法被报告。

另请参阅 QEXPECT_FAIL() 以及《选择适当的测试排除机制》。

QTEST(actual, testElement)

QTEST() 是QCOMPARE() 的一个便捷宏,用于将值actual 与测试数据中的元素testElement 进行比较。如果不存在该元素,则触发断言。

除此之外,QTEST() 的行为与QCOMPARE() 完全一致。

与其编写:

QFETCH(QString, myString);
QCOMPARE(QString("hello").toUpper(), myString);

您可以这样写:

QTEST(QString("hello").toUpper(), "myString");

另请参阅 QCOMPARE()。

QTEST_APPLESS_MAIN(TestClass)

实现了一个 main() 函数,用于执行TestClass 中的所有测试。

其行为与QTEST_MAIN() 相同,但不会实例化QApplication 对象。请将此宏用于非常简单的独立非图形化测试。

另请参阅 QTEST_MAIN()。

QTEST_GUILESS_MAIN(TestClass)

实现了一个 main() 函数,该函数会实例化一个QCoreApplication 对象和TestClass ,并按定义的顺序执行所有测试。使用此宏可构建独立的可执行文件。

其行为与 `QTEST_MAIN()` 类似,但实例化的是 `QCoreApplication ` 而不是 `QApplication ` 对象。如果您的测试用例不需要 `QApplication` 提供的功能,但仍需要事件循环,请使用此宏。

另请参阅 QTEST_MAIN()。

QTEST_MAIN(TestClass)

实现一个 main() 函数,该函数会实例化应用程序对象和TestClass ,并按定义的顺序执行所有测试。使用此宏可构建独立的可执行文件。

如果定义了QT_WIDGETS_LIB ,则应用程序对象将是一个QApplication ;如果定义了QT_GUI_LIB ,则应用程序对象将是一个QGuiApplication ;否则,它将是一个QCoreApplication 。如果使用qmake且配置中包含QT += widgets ,则QT_WIDGETS_LIB 将自动被定义。同样,如果使用qmake且配置中包含QT += gui ,则QT_GUI_LIB 将自动被定义。

示例:

QTEST_MAIN(TestQString)

另请参阅 QTEST_APPLESS_MAIN()、QTEST_GUILESS_MAIN() 和QTest::qExec()。

[since 6.8] QTEST_THROW_ON_FAIL

一旦定义,QCOMPARE()/QVERIFY() 等宏在出错时总会抛出异常。此时,QTest::setThrowOnFail() 将不再产生任何效果。

若您希望在返回类型非void 的函数中使用QCOMPARE() 或QVERIFY(),定义此宏将非常有用。 若未定义此宏,例如QCOMPARE() 会展开为包含return; 的语句,因此无法在返回类型非void 的函数(或 lambda 表达式)中使用,例如QString 。这包括仅在运行时启用异常抛出(使用QTest::setThrowOnFail(true))的情况。 定义此宏后,QCOMPARE() 将展开为不包含return; 的语句,因此可在任何函数中使用。

该宏于 Qt 6.8 中引入。

[since 6.8] QTEST_THROW_ON_SKIP

一旦定义了QSKIP(),它将始终抛出异常。此时,QTest::setThrowOnSkip()将不再产生任何效果。

若您希望在返回类型非void 的函数中使用QSKIP(),定义此宏将非常有用。 若未定义此宏,例如 `QSKIP()` 会展开为包含 `return;` 的语句,因此无法在返回类型非 `void` 的函数(或 lambda 表达式)中使用,例如 `QString`。这包括仅在运行时启用异常抛出(使用 `QTest::setThrowOnSkip(true)`)的情况。 定义此宏后,QSKIP() 将展开为不包含return; 的语句,因此可在任何函数中使用。

该宏于 Qt 6.8 中引入。

QTRY_COMPARE(actual, expected)

通过调用QTRY_COMPARE_WITH_TIMEOUT()(超时时间为五秒),对actual 和expected 的值进行比较。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

另请参阅 QTRY_COMPARE_WITH_TIMEOUT()、QCOMPARE()、QVERIFY()、QTRY_VERIFY() 和QEXPECT_FAIL()。

[since 6.4] QTRY_COMPARE_EQ(computed, baseline)

通过调用QTRY_COMPARE_EQ_WITH_TIMEOUT (超时时间为5秒),对computed 和baseline 的值进行比较。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_EQ() 和QTRY_COMPARE_EQ_WITH_TIMEOUT()。

[since 6.4] QTRY_COMPARE_EQ_WITH_TIMEOUT(computed, baseline, timeout)

该宏与QCOMPARE_EQ()类似,但会反复对computed 和baseline 的值进行比较,直到比较结果返回true ,或者达到timeout (以毫秒为单位)为止。每次比较之间,系统会处理事件。如果超时,测试日志中将记录一次失败,且测试将不再继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_EQ() 和QTRY_COMPARE_EQ()。

[since 6.4] QTRY_COMPARE_GE(computed, baseline)

通过调用QTRY_COMPARE_GE_WITH_TIMEOUT (超时时间为5秒)来比较computed 和baseline 的值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_GE() 和QTRY_COMPARE_GE_WITH_TIMEOUT()。

[since 6.4] QTRY_COMPARE_GE_WITH_TIMEOUT(computed, baseline, timeout)

该宏与QCOMPARE_GE()类似,但会反复对computed 和baseline 的值进行比较,直到比较结果返回true ,或者达到timeout (以毫秒为单位)为止。每次比较之间,系统都会处理事件。如果超时,测试日志中将记录一次失败,且测试将不再继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_GE() 和QTRY_COMPARE_GE()。

[since 6.4] QTRY_COMPARE_GT(computed, baseline)

通过调用QTRY_COMPARE_GT_WITH_TIMEOUT (超时时间为5秒)来比较computed 和baseline 的值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_GT() 和QTRY_COMPARE_GT_WITH_TIMEOUT()。

[since 6.4] QTRY_COMPARE_GT_WITH_TIMEOUT(computed, baseline, timeout)

该宏与QCOMPARE_GT()类似,但会反复对computed 和baseline 的值进行比较,直到比较结果返回true ,或者达到timeout (以毫秒为单位)为止。每次比较之间,系统会处理事件。如果超时,测试日志中将记录一次失败,且测试将不再继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_GT() 和QTRY_COMPARE_GT()。

[since 6.4] QTRY_COMPARE_LE(computed, baseline)

通过调用QTRY_COMPARE_LE_WITH_TIMEOUT (超时设置为5秒),对computed 和baseline 的值进行比较。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_LE() 和QTRY_COMPARE_LE_WITH_TIMEOUT()。

[since 6.4] QTRY_COMPARE_LE_WITH_TIMEOUT(computed, baseline, timeout)

该宏与QCOMPARE_LE() 类似,但会反复对computed 和baseline 的值进行比较,直到比较结果返回true ,或者达到timeout (以毫秒为单位)为止。每次比较之间,系统会处理事件。如果超时,测试日志中将记录一次失败,且测试将不再继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_LE() 和QTRY_COMPARE_LE()。

[since 6.4] QTRY_COMPARE_LT(computed, baseline)

通过调用QTRY_COMPARE_LT_WITH_TIMEOUT (超时时间为5秒)来比较computed 和baseline 的值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_LT() 和QTRY_COMPARE_LT_WITH_TIMEOUT()。

[since 6.4] QTRY_COMPARE_LT_WITH_TIMEOUT(computed, baseline, timeout)

该宏与QCOMPARE_LT()类似,但会反复比较computed 和baseline 的值,直到比较结果为true ,或者达到timeout (单位为毫秒)为止。每次比较之间,系统会处理事件。如果超时,测试日志中将记录一次失败,且测试不会继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_LT() 和QTRY_COMPARE_LT()。

[since 6.4] QTRY_COMPARE_NE(computed, baseline)

通过调用QTRY_COMPARE_NE_WITH_TIMEOUT (超时时间为5秒)来比较computed 和baseline 的值。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_NE() 和QTRY_COMPARE_NE_WITH_TIMEOUT()。

[since 6.4] QTRY_COMPARE_NE_WITH_TIMEOUT(computed, baseline, timeout)

该宏与QCOMPARE_NE()类似,但会反复对computed 和baseline 的值进行比较,直到比较结果返回true ,或者达到timeout (以毫秒为单位)为止。每次比较之间,系统会处理事件。如果超时,测试日志中将记录一次失败,且测试将不再继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.4 中引入。

另请参阅 QCOMPARE_NE() 和QTRY_COMPARE_NE()。

QTRY_COMPARE_WITH_TIMEOUT(actual, expected, timeout)

QTRY_COMPARE_WITH_TIMEOUT() 宏与QCOMPARE() 类似,但会反复比较actual 和expected 的值,直到这两个值相等,或者达到timeout (以毫秒为单位)为止。 每次比较之间,系统将处理事件。如果超时,测试日志中将记录一次失败,且测试将不再继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

另请参阅 QTRY_COMPARE()、QCOMPARE()、QVERIFY()、QTRY_VERIFY() 和QEXPECT_FAIL()。

QTRY_VERIFY2(condition, message)

通过调用QTRY_VERIFY2_WITH_TIMEOUT()(超时时间为5秒)来检查condition 。如果此时condition 仍为false,则输出message 。message 是一个普通的C字符串。

示例:

QTRY_VERIFY2(list.size() > 2, QByteArray::number(list.size()).constData());

注意:此宏 仅可在由测试框架调用的测试函数中使用。

另请参阅 QTRY_VERIFY2_WITH_TIMEOUT()、QTRY_VERIFY()、QVERIFY()、QCOMPARE()、QTRY_COMPARE() 以及QEXPECT_FAIL()。

QTRY_VERIFY(condition)

通过调用QTRY_VERIFY_WITH_TIMEOUT()并设置5秒超时来检查condition 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

另请参阅 QTRY_VERIFY_WITH_TIMEOUT()、QTRY_VERIFY2()、QVERIFY()、QCOMPARE()、QTRY_COMPARE() 以及QEXPECT_FAIL()。

QTRY_VERIFY2_WITH_TIMEOUT(condition, message, timeout)

宏 QTRY_VERIFY2_WITH_TIMEOUT 与QTRY_VERIFY_WITH_TIMEOUT() 类似,不同之处在于:当在指定的timeout (以毫秒为单位)后,condition 仍为 false 时,它会输出一个详细错误信息message 。message 是一个普通的 C 字符串。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

示例:

QTRY_VERIFY2_WITH_TIMEOUT(list.size() > 2, QByteArray::number(list.size()).constData(), 10s);

注意:此宏 仅可在由测试框架调用的测试函数中使用。

另请参阅 QTRY_VERIFY()、QTRY_VERIFY_WITH_TIMEOUT()、QVERIFY()、QCOMPARE()、QTRY_COMPARE() 和QEXPECT_FAIL()。

QTRY_VERIFY_WITH_TIMEOUT(condition, timeout)

QTRY_VERIFY_WITH_TIMEOUT() 宏与QVERIFY() 类似,但会反复检查condition ,直到该条件为真或达到timeout (以毫秒为单位)为止。 每次评估之间,系统会处理事件。如果超时,测试日志中将记录一次失败,且测试将不再继续执行。

自 Qt 6.8 起,timeout 也可以是std::chrono 字面量,例如2s 。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

另请参阅 QTRY_VERIFY()、QTRY_VERIFY2_WITH_TIMEOUT()、QVERIFY()、QCOMPARE()、QTRY_COMPARE(),以及QEXPECT_FAIL()。

QVERIFY2(condition, message)

QVERIFY2() 宏的行为与QVERIFY() 完全一致,唯一的区别在于:当condition 为 false 时,它会返回一个message 。该message 是一个普通的 C 字符串。

该消息也可通过调用生成普通 C 字符串的函数来获取,例如将qPrintable() 应用于QString ,该字符串可通过任何常规方式构建,包括使用.args() 对某些数据进行格式化。

示例:

QVERIFY2(QFileInfo("file.txt").exists(), "file.txt does not exist.");

例如,如果你有一个文件对象,并且正在测试其open() 函数,你可以编写一个包含如下语句的测试:

bool opened = file.open(QIODevice::WriteOnly);
QVERIFY(opened);

如果该测试失败,将无法提供任何关于文件为何无法打开的线索:

FAIL! : tst_QFile::open_write() 'opened' returned FALSE. ()

如果可以根据被测试的值构建出更具说明性的错误消息,您可以使用 `QVERIFY2() ` 将该消息与测试条件一同传递,以便在测试失败时提供更具说明性的错误信息:

QVERIFY2(file.open(QIODevice::WriteOnly),
         qPrintable(QString("open %1: %2")
                   .arg(file.fileName()).arg(file.errorString())));

如果该分支正在 Qt CI 系统中进行测试,上述详细的失败信息将被插入到发布到代码审查系统的摘要中:

FAIL! : tst_QFile::open_write() 'opened' returned FALSE. (open /tmp/qt.a3B42Cd: No space left on device)

另请参阅 QVERIFY(),QCOMPARE(),QEXPECT_FAIL(),QCOMPARE_EQ(),QCOMPARE_NE(),QCOMPARE_LT(),QCOMPARE_LE(),QCOMPARE_GT() 以及QCOMPARE_GE()。

QVERIFY(condition)

QVERIFY() 宏用于检查condition 是否为真。如果为真,则继续执行;否则,将在测试日志中记录一次失败,且测试将不再继续执行。

当在测试失败报告中添加额外信息既实用又有价值时,您可以使用 `QVERIFY2()`。

注意:此宏 仅可在由测试框架调用的测试函数中使用。

例如,以下代码展示了如何使用该宏来验证QSignalSpy 对象是否有效:

QVERIFY(spy.isValid());

若需获取更多关于失败的信息,请使用 `QCOMPARE(x, y) ` 代替 `QVERIFY(x == y)`,因为当比较失败时,前者会同时报告预期值和实际值。

另请参阅 QCOMPARE()、QTRY_VERIFY()、QSignalSpy 、QEXPECT_FAIL()、QCOMPARE_EQ()、QCOMPARE_NE()、QCOMPARE_LT()、QCOMPARE_LE()、QCOMPARE_GT()以及QCOMPARE_GE()。

[since 6.3] QVERIFY_THROWS_EXCEPTION(exceptiontype, ...)

宏 QVERIFY_THROWS_EXCEPTION 会执行可变参数中给定的表达式,并期望捕获该表达式抛出的异常。

可能出现以下几种情况:

  • 如果表达式抛出的异常与exceptiontype 相同,或继承自exceptiontype ,则执行将继续。
  • 否则,如果表达式未抛出异常,或者抛出的异常继承自 `std::exception`,则会在测试日志中记录失败,且宏会提前返回(从外围函数返回)。
  • 如果抛出的异常既不继承自std::exception ,也不继承自exceptiontype ,则会在测试日志中记录一次失败,并重新抛出该异常。这可避免诸如 pthread 取消异常等问题。

该宏使用可变参数,因此表达式中可以包含逗号——预处理器会将其视为参数分隔符,例如:

QVERIFY_THROWS_EXCEPTION(std::bad_alloc,
// macro arguments:      ^ exceptiontype
                         std::vector<std::pair<int, long>>{42'000'000'000, {42, 42L}});
// macro arguments:      \---------- 1 ----------/  \-------- 2 --------/  \3/  \ 4 /
//                       \----------------------- expression -----------------------/

注意:此宏 仅可在由测试框架调用的测试函数中使用。

该宏在 Qt 6.3 中引入。

[since 6.3] QVERIFY_THROWS_NO_EXCEPTION(...)

宏 QVERIFY_THROWS_NO_EXCEPTION 会执行其可变参数中给定的表达式,并尝试捕获该表达式抛出的任何异常。

可能出现以下几种情况:

  • 如果表达式未抛出异常,则继续执行。
  • 否则,如果捕获了从 `std::exception ` 派生的异常,则会在测试日志中记录失败,并且宏会提前返回(从外围函数隐式返回)。
  • 如果捕获到的异常并非源自 `std::exception `,则会在测试日志中记录一次失败,并重新抛出该异常。这可避免诸如 pthread 取消异常等问题。

该宏使用可变个数参数,因此表达式中可以包含逗号——预处理器将逗号视为参数分隔符,例如:

QVERIFY_THROWS_NO_EXCEPTION(std::pair<int, long>{42, 42L});
// macro arguments:         \---- 1 ----/  \-- 2 -/  \3 /

注意:该宏 仅可在由测试框架调用的测试函数中使用。

该宏于 Qt 6.3 中引入。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.