QTest Namespace

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

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

class QTouchEventSequence
(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 }

函数

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()
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(std::chrono::seconds{5}))
bool qWaitFor(Functor predicate, int timeout)
bool qWaitForWindowActive(QWidget *widget, int timeout = 5000)
bool qWaitForWindowActive(QWindow *window, int timeout = 5000)
bool qWaitForWindowExposed(QWidget *widget, int timeout = 5000)
bool qWaitForWindowExposed(QWindow *window, int timeout = 5000)
(since 6.7) bool qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout = std::chrono::seconds{5})
(since 6.7) bool qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout = std::chrono::seconds{5})
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(QSizePolicy sp)
char *toString(const T &value)
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)
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)
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(lhs,rhs,order)
(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(测试类)
QTEST_GUILESS_MAIN(测试类)
QTEST_MAIN(测试类)
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 类用于模拟触摸事件序列。更多

ThrowOnFailDisabler

ThrowOnFailEnabler

抛开滑动消除器

抛锚消除器

类型文档

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需要软件模拟的故障

请注意,WalltimeNanosecondsBytesAllocated 仅通过setBenchmarkResult() 提供,QTest 框架无法自动提供这些指标的结果。

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

enum QTest::TestFailMode

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

常量说明
QTest::Abort1终止测试的执行。当出现问题检查后继续执行测试没有意义时,使用该模式。
QTest::Continue2在问题检查后继续执行测试。

另请参阅 QEXPECT_FAIL().

功能文档

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::QTouchEventSequencetouchEvent()。

const char *QTest::currentAppName()

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

const char *QTest::currentDataTag()

返回当前测试数据的名称。如果测试没有分配任何 testdata,函数将返回nullptr

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

这适用于测试失败或跳过的情况。为真时,测试函数应提前返回。尤其是QTRY_* 宏和测试事件循环,如果在测试函数期间执行(但不包括其清理()),则应提前终止其循环。测试调用了使用该模块宏的辅助函数后,可以使用该函数来测试是否提前返回。

此函数在 Qt 6.5 中引入。

另请参阅 QTest::currentTestFailed()。

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

对符合messagePattern 的每个警告,将测试失败附加到测试日志中。

添加失败后,测试函数将继续执行。要终止测试,可以检查currentTestFailed() 并在true 时提前返回。

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

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

voidFileTest::loadFiles() {QTest::failOnWarning(QRegularExpression("^Failed to load"));// 每种模式都会导致测试失败:    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()

该函数重载了 failOnWarning()。

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

此函数在 Qt 6.8 中引入。

另请参阅 failOnWarning()。

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

该函数重载了 failOnWarning()。

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

此函数在 Qt 6.3 中引入。

另请参阅 failOnWarning().

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

忽略由qDebug(),qInfo() 或qWarning() 创建的信息。如果message 与相应的type 一起输出,则会从测试日志中删除。如果测试结束后没有输出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)

模拟在widget 上点击key 和可选的modifier 。如果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)

这是一个重载函数。

使用可选的modifierwidget 上模拟点击key 。如果delay 大于 0,测试将等待delay 毫秒后再点击按键。

举例说明:

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

上面的示例模拟了在myWidget 上点击a ,没有任何键盘修饰符,测试也没有延迟。

另请参阅 QTest::keyClicks() 。

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

这是一个重载函数。

使用可选的modifierwindow 上模拟点击key 。如果delay 大于 0,测试将等待delay 毫秒后再点击按键。

示例

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

上面的第一个示例模拟在myWindow 上点击escape 键,没有任何键盘修饰符,也没有延迟。第二个示例模拟在测试延迟 200 毫秒后点击myWindow 上的shift-escape

另请参阅 QTest::keyClicks().

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

这是一个重载函数。

使用可选的modifierwindow 上模拟点击key 。如果delay 大于 0,测试将等待delay 毫秒后再点击按键。

举例说明:

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

上面的示例模拟了在myWindow 上点击a ,没有任何键盘修饰符,测试也没有延迟。

另请参阅 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)

通过给定的key 和相关的actionwidget 发送 Qt XML 按键事件。可选择指定键盘modifier ,以及发送事件前的测试时间delay (以毫秒为单位)。

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

这是一个重载函数。

通过给定的按键ascii 和关联的actionwidget 发送 Qt XML 按键事件。可选择指定键盘modifier ,以及发送事件前的测试时间delay (以毫秒为单位)。

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

这是一个重载函数。

通过给定的key 和关联的actionwindow 发送 Qt XML 按键事件。可选择指定键盘modifier ,以及发送事件前的测试时间delay (以毫秒为单位)。

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

这是一个重载函数。

通过给定的按键ascii 和关联的actionwindow 发送 Qt XML 按键事件。可选择指定键盘modifier ,以及发送事件前的测试时间delay (以毫秒为单位)。

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

模拟在widget 上按key ,可选择按modifier 。如果delay 大于 0,测试将等待delay 毫秒后再按键。

注意: 在某一时刻,应使用keyRelease() 释放按键。

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

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

这是一个重载函数。

模拟在widget 上按下key 和可选的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)

这是一个重载函数。

模拟在window 上按下key 和可选的modifier 。如果delay 大于 0,测试将等待delay 毫秒后再按键。

注意: 在某一时刻,应使用keyRelease() 释放按键。

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

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

这是一个重载函数。

模拟在window 上按下key 和可选的modifier 。如果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 上通过可选的modifier 释放key 。如果delay 大于 0,测试将等待delay 毫秒后再释放密钥。

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

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

这是一个重载函数。

模拟在widget 上通过可选的modifier 释放key 。如果delay 大于 0,测试将等待delay 毫秒后再释放密钥。

另请参阅 QTest::keyClick() 。

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

这是一个重载函数。

模拟在window 上通过可选的modifier 释放key 。如果delay 大于 0,测试将等待delay 毫秒后才释放密钥。

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

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

这是一个重载函数。

模拟在window 上通过可选的modifier 释放key 。如果delay 大于 0,测试将等待delay 毫秒后再释放密钥。

另请参阅 QTest::keyClick() 。

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

这是一个重载函数。

模拟将keySequence 键入widget

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

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

这是一个重载函数。

模拟将keySequence 键入window

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

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

模拟使用可选的modifierwidget 上点击鼠标button 。点击的位置由pos 定义;默认位置是 widget 的中心。如果指定了delay ,测试将在按下和松开按钮前等待指定的毫秒数。

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

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

这是一个重载函数。

模拟点击鼠标button ,可在window 上选择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 定义;默认位置是 widget 的中心。如果指定了delay ,测试将在每次按下和松开前等待指定的毫秒数。

另请参阅 QTest::mouseClick() 。

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

这是一个重载函数。

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

另请参阅 QTest::mouseClick() 。

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

将鼠标指针移动到widget 。如果未指定pos ,鼠标指针将移动到 widget 的中心。如果给出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 上通过可选的modifier 按鼠标button 。位置由pos 定义;默认位置是 widget 的中心。如果指定了delay ,测试将在按下之前等待指定的毫秒数。

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

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

这是一个重载函数。

模拟按下鼠标button ,可在window 上选择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 上通过可选的modifier 释放鼠标button 。释放的位置由pos 定义;默认位置是 widget 的中心。如果指定了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)

这是一个重载函数。

模拟释放鼠标button ,在window 上使用可选的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() ,也会执行。详情请参阅创建测试

可选择提供命令行参数argcargv 。有关可识别参数的列表,请阅读Qt Test 命令行参数

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

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

如果没有测试失败,该函数将返回 0;如果一个或多个测试失败,或出现未处理的异常,该函数将返回 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**) 相同,但使用的是argumentsQStringList ,而不是char** 列表。

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

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

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

返回提取数据的临时目录,如果出错则返回空值。

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

在当前二进制文件的中央测试用例注册表中注册具有入口函数entryFunction 的测试name

运行不带参数的批量测试二进制文件时,将列出name 。使用name 的 argv[1] 运行测试二进制文件时,将调用entryFunction

此函数在 Qt 6.5 中引入。

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

msecs睡眠,阻塞测试的执行。

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

msecs 必须大于 0ms。

注意: 从 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 秒。

此函数在 Qt 6.7 中引入。

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

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(std::chrono::seconds{5}))

等待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));

上面的代码将等待对象就绪,等待时间最长为 3 秒。

此函数在 Qt 6.7 中引入。

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

这是一个重载函数。

等待timeout 毫秒或predicate 返回 true。

这相当于调用

qWaitFor(predicate, QDeadlineTimer(timeout));

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

如果widgettimeout 毫秒内激活,则返回true 。否则返回false

该方法适用于调用QWidget::show() 并依赖窗口小部件实际处于活动状态(即可见和有焦点)才继续进行的测试。

注: 如果其他窗口阻止widget 成为活动状态,该方法将超时并返回false

注: 由于焦点是一个排他性属性,widget 可能会随时将焦点移到另一个窗口,甚至在该方法返回true 后也是如此。

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

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

如果windowtimeout 毫秒内激活,则返回true 。否则返回false

该方法适用于调用QWindow::show() 并依赖窗口实际处于活动状态(即可见且有焦点)才能继续的测试。

注: 如果其他窗口阻止window 成为活动窗口,该方法将超时并返回false

注: 由于焦点是一个排他性属性,window 可能会随时将其焦点移到另一个窗口,即使在该方法返回true 后也是如此。

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

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

如果widgettimeout 毫秒内曝光,则返回true 。否则返回false

该方法适用于调用QWidget::show() 并依赖窗口小部件实际可见才继续进行的测试。

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

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

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

如果windowtimeout 毫秒内曝光,则返回true 。否则返回false

该方法适用于调用QWindow::show() 并依赖窗口实际可见才继续的测试。

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

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

[since 6.7] bool QTest::qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout = std::chrono::seconds{5})

如果widgettimeout 中的焦点窗口,则返回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 = std::chrono::seconds{5})

如果windowtimeout 中的焦点窗口,则返回true 。否则返回false

该方法适用于调用QWindow::show() 并依赖窗口有焦点(如接收键盘事件)才能继续的测试。

注: 如果其他窗口阻止window 成为焦点,该方法将超时并返回false

注: 由于焦点是一个排他性属性,window 可能会随时将焦点移到另一个窗口,即使在该方法返回true 后也是如此。

此函数在 Qt 6.7 中引入。

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

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

将此测试功能的基准结果设置为result

如果要报告基准结果而不使用 QBENCHMARK 宏,请使用此函数。使用metric 指定Qt Test 应如何解释结果。

结果的上下文将是测试函数名称和来自 _data 函数的任何数据标记。该函数在每个测试函数中只能调用一次,后续调用将替换之前报告的结果。

请注意,命令行参数 -iterations 对不含 QBENCHMARK 宏的测试函数没有影响。

[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 的指针,该字符串以空格分隔的十六进制字符序列表示。如果输入内容过长,会被截断。截断会在返回字符串的末尾用省略号表示。调用者拥有返回指针的所有权,必须确保随后将其传递给操作符 delete[]。

length 是字符串的长度 。ba

char *toString(QSizePolicy sp)

这是一个重载函数。

返回尺寸策略的文本表示sp

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

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

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

注意: 从 Qt 5.5 开始,您最好在类型的命名空间中提供 toString() 函数,而不是专门使用此模板。如果您的代码需要继续使用 Qt 5.4 或更早版本的 QTestLib,则需要继续使用专用化。

注意: toString() 的调用者必须使用delete[] 删除返回的数据。您的实现应返回用new[]qstrdup() 创建的字符串。最简单的方法是创建QByteArrayQString ,然后调用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):

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

另请参见 QCOMPARE()。

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 的字符串。

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

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 值。如果actualexpected 相匹配,则继续执行。如果不匹配,则在测试日志中记录失败,测试函数返回,不再尝试任何后续检查。

始终尊重 QCOMPARE() 的参数语义。传给它的第一个参数应始终是被测代码产生的实际值,而第二个参数应始终是预期值。当值不匹配时,QCOMPARE() 会用实际值和预期值标签打印出来。如果参数顺序对调,调试失败的测试时就会出现混乱,而且期望值为零的测试可能会因四舍五入错误而失败。

如果比较失败,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() 宏对输入表达式lhsrhs 应用三向比较运算符<=> ,并检查结果是否为order 。如果为真,则继续执行。如果不是,则在测试日志中记录失败,测试函数返回,不再尝试任何后续检查。该宏仅接受 Qt:: 和 std:: 排序类型作为order 参数,否则会断言。

注意: order 可以是 Qt::排序类型,即使decltype(lhs <=> rhs) 是 std 排序类型。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); 类似,但在失败时会打印格式化的错误信息,报告computedbaseline 参数表达式和值。

注意: 该宏只能在测试框架调用的测试函数中使用。

对于您自己的类,您可以重载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); 类似,但在失败时会打印格式化的错误信息,报告computedbaseline 参数表达式和值。

注意: 该宏只能在测试框架调用的测试函数中使用。

对于您自己的类,您可以重载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); 类似,但在失败时会打印格式化的错误信息,报告computedbaseline 参数表达式和值。

注意: 该宏只能在测试框架调用的测试函数中使用。

对于您自己的类,您可以重载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); 大体相似,但在失败时会打印格式化的错误信息,报告computedbaseline 参数表达式和值。

注意: 该宏只能在测试框架调用的测试函数中使用。

对于您自己的类,您可以重载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); 类似,但在失败时会打印格式化的错误信息,报告computedbaseline 参数表达式和值。

注意: 该宏只能在测试框架调用的测试函数中使用。

对于您自己的类,您可以重载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); 类似,但在失败时会打印格式化的错误信息,报告computedbaseline 参数表达式和值。

注意: 该宏只能在测试框架调用的测试函数中使用。

对于您自己的类,您可以重载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)

获取宏在堆栈中创建了一个名为name 的局部变量,其类型为typenametype 必须与测试数据表中的一列匹配。如果断言失败,测试将中止。

假设测试有以下数据:

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;
}

测试数据有两个元素,一个是名为aStringQString ,另一个是名为expected 的整数。要在实际测试中获取这两个值,需要将 和 作为堆栈中的变量:

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

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

aString 和 是堆栈上的变量,使用当前测试数据初始化。expected

注意: 该宏只能在测试框架调用的测试函数中使用。测试函数必须有一个 _data 函数。

QFETCH_GLOBAL(type, name)

该宏从全局数据表中的一行获取名为name 的变量,其类型为typenametype 必须与全局数据表中的一列匹配。如果断言失败,测试将中止。

假设测试有以下数据:

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() 也会为每一行提供一个本地语言。因此,在运行该测试时,将使用后者的 locale 和前者的数字的每种组合。因此,在全局表中有四行,本地表中有三行的情况下,测试函数将运行 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 引用的 testdata 文件的QString ,如果找不到 testdata 文件,则返回空的QString

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

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

如果命名的文件/目录不存在于上述任何位置,测试日志都会打印警告。

例如,在此代码中

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

testdata 文件将被解析为第一个存在的文件:

  • /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

这样,无论测试是否已安装,也无论测试的构建树是否等于测试的源代码树,测试都能找到它的 testdata。

注意: 要可靠地从源代码目录检测测试数据,必须使用 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(),或只设置一行,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)

TestClass 中执行所有测试的 main() 函数。

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

注意: 在默认启用键盘导航的平台上,如果定义了QT_WIDGETS_LIB ,则此宏将强制禁用键盘导航。这样做是为了在编写自动测试时简化按键事件的使用。如果要编写使用键盘导航的测试用例,应在测试用例的initTestCase()init() 函数中调用QApplication::setNavigationMode() 来启用键盘导航。

示例:

QTEST_MAIN(TestQString)

另请参阅 QTEST_APPLESS_MAIN(),QTEST_GUILESS_MAIN(),QTest::qExec() 和QApplication::setNavigationMode().

QTRY_COMPARE(actual, expected)

通过调用QTRY_COMPARE_WITH_TIMEOUT() 执行actualexpected 值的比较,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

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

[since 6.4] QTRY_COMPARE_EQ(computed, baseline)

通过调用QTRY_COMPARE_EQ_WITH_TIMEOUT 执行computedbaseline 值的比较,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

此宏在 Qt 6.4 中引入。

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

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

该宏与QCOMPARE_EQ() 类似,但会重复执行computedbaseline 值的比较,直到比较返回truetimeout (以毫秒为单位)。每次比较之间都会处理事件。如果超时,测试日志中将记录失败,测试将不再继续执行。

自 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 执行computedbaseline 值的比较,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

此宏在 Qt 6.4 中引入。

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

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

该宏与QCOMPARE_GE() 类似,但会重复执行computedbaseline 值的比较,直到比较返回truetimeout (以毫秒为单位)。每次比较之间都会处理事件。如果超时,测试日志中将记录失败,测试将不再继续执行。

自 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 执行computedbaseline 值的比较,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

此宏在 Qt 6.4 中引入。

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

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

该宏与QCOMPARE_GT() 类似,但会重复执行computedbaseline 值的比较,直到比较返回truetimeout (以毫秒为单位)。每次比较之间都会处理事件。如果超时,测试日志中将记录失败,测试将不再继续执行。

自 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 执行computedbaseline 值的比较,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

此宏在 Qt 6.4 中引入。

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

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

该宏与QCOMPARE_LE() 类似,但会重复执行computedbaseline 值的比较,直到比较返回truetimeout (以毫秒为单位)。每次比较之间都会处理事件。如果超时,测试日志中将记录失败,测试将不再继续执行。

自 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 执行computedbaseline 值的比较,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

此宏在 Qt 6.4 中引入。

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

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

该宏与QCOMPARE_LT() 类似,但会重复执行computedbaseline 值的比较,直到比较返回truetimeout (以毫秒为单位)。每次比较之间都会处理事件。如果超时,测试日志中将记录失败,测试将不再继续执行。

自 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 执行computedbaseline 值的比较,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

此宏在 Qt 6.4 中引入。

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

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

该宏与QCOMPARE_NE() 类似,但会重复执行computedbaseline 值的比较,直到比较返回truetimeout (以毫秒为单位)。每次比较之间都会处理事件。如果超时,测试日志中将记录失败,测试将不再继续执行。

自 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() 类似,但会重复执行actualexpected 值的比较,直到两个值相等或达到timeout (毫秒)。每次比较之间都会处理事件。如果超时,测试日志中将记录失败,测试将不再继续执行。

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

注意: 该宏只能在测试框架调用的测试函数中使用。

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

QTRY_VERIFY2(condition, message)

通过调用QTRY_VERIFY2_WITH_TIMEOUT() 检查condition ,超时 5 秒。如果condition 仍然为假,则输出messagemessage 是一个纯 C 语言字符串。

示例

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

注意: 该宏只能在测试框架调用的测试函数中使用。

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

QTRY_VERIFY(condition)

通过调用QTRY_VERIFY_WITH_TIMEOUT() 检查condition ,超时 5 秒。

注意: 此宏只能在测试框架调用的测试函数中使用。

另请参阅 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() 类似,不同之处在于当condition 在指定的timeout (毫秒)后仍为 false 时,它会输出一个冗长的messagemessage 是一个纯 C 语言字符串。

自 Qt XML 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 为假时,它会报告messagemessage 是一个纯 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 中引入。

© 2025 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.