QTest 命名空间
The QTest 命名空间包含与 Qt 测试相关的所有函数和声明。 更多...
头文件 | #include <QTest> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Test) target_link_libraries(mytarget PRIVATE Qt6::Test) |
qmake | QT += testlib |
类
类型
枚举 | KeyAction { 按压, 释放, 点击, 快捷键 } |
枚举 | MouseAction { 鼠标按下, 鼠标释放, 鼠标点击, 鼠标双击, 鼠标移动 } |
枚举 | QBenchmarkMetric { 每秒帧数, 每秒位数, 每秒字节数, 实时时间毫秒, 实时时间纳秒, …, 模拟故障 } |
枚举 | TestFailMode { 中断, 继续 } |
函数
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.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(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 | keyClick(QWidget *widget, 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, QWindow *窗口, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyEvent(QTest::KeyAction action, QWindow *窗口, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyEvent(QTest::KeyAction action, QWidget *widget, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyPress(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier =Qt::NoModifier, int 延时 = -1) |
void | keyPress(QWindow *窗口, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyPress(QWindow *窗口, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyPress(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyRelease(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyRelease(QWindow *窗口, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyRelease(QWindow *窗口, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keyRelease(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int 延时 = -1) |
void | keySequence(QWindow *窗口, const QKeySequence &keySequence) |
void | keySequence(QWidget *widget, const QKeySequence &keySequence) |
void | mouseClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -1) |
void | mouseClick(QWindow *窗口, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -1) |
void | mouseDClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -1) |
void | mouseDClick(QWindow *窗口, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -1) |
void | mouseMove(QWidget *widget, QPoint pos = QPoint(), int 延时 = -1) |
void | mouseMove(QWindow *窗口, QPoint pos = QPoint(), int 延时 = -1) |
void | mousePress(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -1) |
void | mousePress(QWindow *窗口, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -1) |
void | mouseRelease(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -1) |
void | mouseRelease(QWindow *窗口, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int 延时 = -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) |
(自6.7版本起) void | qSleep(std::chrono::milliseconds msecs) |
void | qSleep(int ms) |
(自6.7版本起) void | qWait(std::chrono::milliseconds msecs) |
void | qWait(int msecs) |
(自6.7版本起) bool | qWaitFor(Functor predicate, QDeadlineTimer deadline = QDeadlineTimer(std::chrono::seconds{5})) |
bool | qWaitFor(Functor predicate, int timeout) |
bool | qWaitForWindowActive(QWindow *window, int timeout = 5000) |
bool | qWaitForWindowActive(QWidget *widget, int timeout = 5000) |
bool | qWaitForWindowExposed(QWindow *window, int timeout = 5000) |
bool | qWaitForWindowExposed(QWidget *widget, int timeout = 5000) |
(自6.7版本起) bool | qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout = std::chrono::seconds{5}) |
(自6.7版本起) bool | qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout = std::chrono::seconds{5}) |
void | setBenchmarkResult(qreal result, QTest::QBenchmarkMetric metric) |
char * | toHexRepresentation(const char *ba, qsizetype length) |
char * | toString(const T &value) |
char * | toString(const std::pair<T1, T2> &pair) |
(自6.5版本起) char * | toString(const QKeySequence &ks) |
char * | toString(QSizePolicy::Policy p) |
char * | toString(QSizePolicy::ControlTypes cts) |
char * | toString(QSizePolicy::ControlType ct) |
char * | toString(QSizePolicy sp) |
char * | toString(const std::tuple<Types...> &tuple) |
char * | toString(const QStringView &string) |
char * | toString(const QString &string) |
char * | toString(const QLatin1StringView &string) |
char * | toString(const QByteArray &ba) |
char * | toString(const QTime &time) |
char * | toString(const QDate &date) |
char * | toString(const QDateTime &dateTime) |
char * | toString(const QCborError &c) |
char * | toString(const QChar &character) |
char * | toString(const QPoint &point) |
char * | toString(const QSize &size) |
char * | toString(const QRect &rectangle) |
char * | toString(const QPointF &point) |
char * | toString(const QSizeF &size) |
char * | toString(const QRectF &rectangle) |
char * | toString(const QUrl &url) |
char * | toString(const QUuid &uuid) |
char * | toString(const QVariant &variant) |
char * | toString(std::nullptr_t) |
char * | toString(const QVector2D &v) |
char * | toString(const QVector3D &v) |
char * | toString(const QVector4D &v) |
QTest::QTouchEventWidgetSequence | touchEvent(QWidget *widget, QPointingDevice *device, bool autoCommit = true) |
QTest::QTouchEventSequence | touchEvent(QWindow *window, QPointingDevice *device, bool autoCommit = true) |
宏
QBENCHMARK | |
QBENCHMARK_ONCE | |
QCOMPARE(actual, expected) | |
(自6.4版本起) | QCOMPARE_EQ(computed, baseline) |
(自6.4版本起) | QCOMPARE_GE(computed, baseline) |
(自6.4版本起) | QCOMPARE_GT(computed, baseline) |
(自6.4版本起) | QCOMPARE_LE(computed, baseline) |
(自6.4版本起) | QCOMPARE_LT(computed, baseline) |
(自6.4版本起) | QCOMPARE_NE(computed, baseline) |
QEXPECT_FAIL(dataIndex, comment, mode) | |
QFAIL(message) | |
QFETCH(type, name) | |
QFETCH_GLOBAL(type, name) | |
QFINDTESTDATA(filename) | |
QSKIP(description) | |
QTEST(actual, testElement) | |
QTEST_APPLESS_MAIN(TestClass) | |
QTEST_GUILESS_MAIN(TestClass) | |
QTEST_MAIN(TestClass) | |
QTRY_COMPARE(actual, expected) | |
(自6.4版本起) | QTRY_COMPARE_EQ(computed, baseline) |
(自6.4版本起) | QTRY_COMPARE_EQ_WITH_TIMEOUT(computed, baseline, timeout) |
(自6.4版本起) | QTRY_COMPARE_GE(computed, baseline) |
(自6.4版本起) | QTRY_COMPARE_GE_WITH_TIMEOUT(computed, baseline, timeout) |
(自6.4版本起) | QTRY_COMPARE_GT(computed, baseline) |
(自6.4版本起) | QTRY_COMPARE_GT_WITH_TIMEOUT(computed, baseline, timeout) |
(自6.4版本起) | QTRY_COMPARE_LE(computed, baseline) |
(自6.4版本起) | QTRY_COMPARE_LE_WITH_TIMEOUT(computed, baseline, timeout) |
(自6.4版本起) | QTRY_COMPARE_LT(computed, baseline) |
(自6.4版本起) | QTRY_COMPARE_LT_WITH_TIMEOUT(computed, baseline, timeout) |
(自6.4版本起) | QTRY_COMPARE_NE(computed, baseline) |
(自6.4版本起) | QTRY_COMPARE_NE_WITH_TIMEOUT(computed, baseline, timeout) |
QTRY_COMPARE_WITH_TIMEOUT(actual, expected, timeout) | |
QTRY_VERIFY2(condition, message) | |
QTRY_VERIFY(condition) | |
QTRY_VERIFY2_WITH_TIMEOUT(condition, message, timeout) | |
QTRY_VERIFY_WITH_TIMEOUT(condition, timeout) | |
QVERIFY2(condition, message) | |
QVERIFY(condition) | |
(自6.3版本起) | QVERIFY_THROWS_EXCEPTION(exceptiontype, ...) |
(自6.3版本起) | QVERIFY_THROWS_NO_EXCEPTION(...) |
详细说明
有关如何编写单元测试的信息,请参阅Qt Test概述。
类型文档
enum QTest::KeyAction
此枚举描述了按键处理的可能操作。
常量 | 值 | 说明 |
---|---|---|
QTest::Press | 0 | 按键被按下。 |
QTest::Release | 1 | 按键被释放。 |
QTest::Click | 2 | 键被点击(按下并释放)。 |
QTest::Shortcut | 3 | 快捷键被激活。此值在Qt 5.6中被添加。 |
枚举 QTest::MouseAction
此枚举描述了鼠标处理的可能操作。
常量 | 值 | 说明 |
---|---|---|
QTest::MousePress | 0 | 鼠标按钮被按下。 |
QTest::MouseRelease | 1 | 鼠标按钮被释放。 |
QTest::MouseClick | 2 | 鼠标按钮被点击(按下并释放)。 |
QTest::MouseDClick | 3 | 鼠标按钮被双击(按下并释放两次)。 |
QTest::MouseMove | 4 | 鼠标指针已经移动。 |
枚举 QTest::QBenchmarkMetric
此枚举列出了所有可进行基准测试的内容。
常量 | 值 | 说明 |
---|---|---|
QTest::FramesPerSecond | 0 | 每秒帧率 |
QTest::BitsPerSecond | 1 | 每秒比特数 |
QTest::BytesPerSecond | 2 | 每秒字节数 |
QTest::WalltimeMilliseconds | 3 | 毫秒时钟时间 |
QTest::WalltimeNanoseconds | 7 | 纳秒时钟时间 |
QTest::BytesAllocated | 8 | 字节内存使用量 |
QTest::Events | 6 | 事件计数 |
QTest::CPUTicks | 4 | CPU时间 |
QTest::CPUMigrations | 9 | CPU之间的进程迁移 |
QTest::CPUCycles | 10 | CPU周期 |
QTest::RefCPUCycles | 30 | 参考CPU周期 |
QTest::BusCycles | 11 | 总线周期 |
QTest::StalledCycles | 12 | 停滞周期 |
QTest::InstructionReads | 5 | 指令读取 |
QTest::Instructions | 13 | 执行的指令 |
QTest::BranchInstructions | 14 | 分支类型指令 |
QTest::BranchMisses | 15 | 被错误预测的分支指令 |
QTest::CacheReferences | 16 | 任何类型的缓存访问 |
QTest::CacheMisses | 20 | 任何类型的缓存未命中 |
QTest::CacheReads | 17 | 缓存读取 / 加载 |
QTest::CacheReadMisses | 21 | 缓存读取 / 加载未命中 |
QTest::CacheWrites | 18 | 缓存写入 / 存储 |
QTest::CacheWriteMisses | 22 | 缓存写入 / 存储未命中 |
QTest::CachePrefetches | 19 | 缓存预取 |
QTest::CachePrefetchMisses | 23 | 缓存预取未命中 |
QTest::ContextSwitches | 24 | 上下文切换 |
QTest::PageFaults | 25 | 任何类型的页面错误 |
QTest::MinorPage Faults | 26 | 次要页面错误 |
QTest::MajorPageFaults | 27 | 主要页面错误 |
QTest::AlignmentFaults | 28 | 由于对齐错误引起的错误 |
QTest::EmulationFaults | 29 | 需要软件模拟的错误 |
注意,WalltimeNanoseconds
和BytesAllocated
仅可通过setBenchmarkResult()使用,并且这些指标的值不能由QTest框架自动提供。
另请参阅QTest::benchmarkMetricName()和QTest::benchmarkMetricUnit()。
枚举 QTest::TestFailMode
此枚举描述了处理已知将失败检查的模式,如通过QVERIFY()或QCOMPARE()宏。无论检查成功还是失败,该模式都会应用。
常量 | 值 | 说明 |
---|---|---|
QTest::Abort | 1 | 终止测试的执行。当在问题检查后没有进一步执行测试的意义时,请使用此模式。 |
QTest::Continue | 2 | 在问题检查后继续测试的执行。 |
另请参阅QEXPECT_FAIL()。
函数文档
模板 <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;
要将自定义类型添加到测试数据中,必须通过 QMetaType 使用 Q_DECLARE_METATYPE() 进行注册。
注意:此函数只能作为测试框架调用的测试数据处理函数的一部分来使用。
有关更详细的示例,请参阅 数据驱动测试。
另请参阅:QTest::newRow(),QFETCH() 和 QMetaType。
QTestData &QTest::addRow(const char *format, ...)
将新行追加到当前测试数据。
该函数的参数传递给 qsnprintf() 进行格式化,格式化根据 format 进行。有关注意事项和限制,请参阅 qvsnprintf() 文档。
测试输出将使用此格式化生成的名称来识别使用此测试数据进行的测试运行。
返回一个 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
。
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(); } }
[自 6.5]
bool QTest::currentTestResolved()
如果当前测试函数失败或跳过,则返回 true。
如果在测试过程中失败或执行跳过,则适用。当它为 true 时,测试函数应提前返回。特别是,在测试函数中执行 QTRY_*
宏和测试事件循环时,它们会提前终止循环。(但不是它的清理函数)。在测试调用使用此模块宏的辅助函数之后,它可以使用此函数来测试是否提前返回。
此函数是在 Qt 6.5 中引入的。
[自 6.3]
void QTest::failOnWarning(const QRegularExpression &messagePattern)
对于每个匹配 messagePattern 的警告,将测试失败附加到测试日志中。
当添加失败时,测试函数将继续执行。要代替中断测试,您可以检查 currentTestFailed() 并在其为 true 时提前返回。
对于每个警告,第一个匹配的模板将导致失败,其余的模板将被忽略。
每个测试函数结束时清除所有模板。
void FileTest::loadFiles() { QTest::failOnWarning(QRegularExpression("^Failed to load")); // Each of these will cause a test failure: qWarning() << "Failed to load image"; qWarning() << "Failed to load video"; }
要使引发特定警告的每个测试失败,请在此函数的 init() 中传递合适的正则表达式。
void FileTest::init() { QTest::failOnWarning(QRegularExpression(".?")); }
注意:ignoreMessage() 覆盖了此函数,所以匹配了 ignoreMessage()
和 failOnWarning()
两种情况的任何警告都将被忽略。
此函数是在 Qt 6.3 中引入的。
另请参阅QTEST_FATAL_FAIL。
[自 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() 创建的消息。如果输出了具有相应 type 的 message,则它将从测试日志中移除。如果测试结束且 message 未输出,则将测试失败附加到测试日志。
注意:调用此函数将仅忽略一条消息。如果您想忽略的消息输出两次,您也需要调用 ignoreMessage() 两次。
示例
QDir dir; QTest::ignoreMessage(QtWarningMsg, "QDir::mkdir: Empty or null file name(s)"); dir.mkdir("");
上述示例测试了使用无效的文件名调用QDir::mkdir()时,是否输出正确的警告。
void QTest::ignoreMessage(QtMsgType type, const QRegularExpression &messagePattern)
这是一个重载函数。
忽略由 qDebug()、qInfo() 或 qWarning() 创建的消息。如果匹配相应 type 和 messagePattern 的消息被输出,则将从测试日志中删除。如果测试完成但消息未被输出,则测试日志中将附加一个测试失败。
注意:调用此函数将仅忽略一条消息。如果您想忽略的消息输出两次,您也需要调用 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(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在 window 上单击 key,可选地使用 modifier。如果 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)
这是一个重载函数。
模拟在 window 上单击 key,可选地使用 modifier。如果 delay 大于 0,测试将在单击按键之前等待 delay 毫秒。
示例
QWidget myWindow; QTest::keyClick(&myWindow, Qt::Key_Tab);
上述示例模拟在无任何键盘修改符和无延迟的情况下,在 myWindow
上单击 a
。
另请参阅QTest::keyClicks。
void QTest::keyClick(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在 widget 上单击 key,可选地使用 modifier。如果 delay 大于 0,测试将在单击按键之前等待 delay 毫秒。
示例
QTest::keyClick(myWidget, 'a');
上述示例模拟在无任何键盘修改符和无延迟的情况下,在 myWidget
上单击 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)
向widget发送一个带有给定key和关联action的Qt按键事件。可选地,可以指定键盘modifier以及发送事件前测试的延迟delay(以毫秒为单位)。
void QTest::keyEvent(QTest::KeyAction action, QWindow *window, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
向window发送一个带有给定键ascii和关联action的Qt按键事件。可选地,可以指定键盘modifier以及发送事件前测试的延迟delay(以毫秒为单位)。
void QTest::keyEvent(QTest::KeyAction action, QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
向window发送一个带有给定key和关联action的Qt按键事件。可选地,可以指定键盘modifier以及发送事件前测试的延迟delay(以毫秒为单位)。
void QTest::keyEvent(QTest::KeyAction action, QWidget *widget, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
向widget发送一个带有给定键ascii和关联action的Qt按键事件。可选地,可以指定键盘modifier以及发送事件前测试的延迟delay(以毫秒为单位)。
void QTest::keyPress(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
模拟在小部件上按下一个可选项的修饰键。如果延迟大于0,则测试将在按下键之前等待延迟毫秒。
注意:在某个时候,您应该使用keyRelease()释放键。
另请参阅QTest::keyRelease()和QTest::keyClick()。
void QTest::keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在一个窗口上按下一个带可选项的修饰键。如果延迟大于0,则测试将在按下键之前等待延迟毫秒。
注意:在某个时候,您应该使用keyRelease()释放键。
另请参阅QTest::keyRelease()和QTest::keyClick()。
void QTest::keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在一个窗口上按下一个带可选项的修饰键。如果延迟大于0,则测试将在按下键之前等待延迟毫秒。
注意:在某个时候,您应该使用keyRelease()释放键。
另请参阅QTest::keyRelease()和QTest::keyClick()。
void QTest::keyPress(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在小部件上按下一个可选项的修饰键。如果延迟大于0,则测试将在按下键之前等待延迟毫秒。
注意:在某个时候,您应该使用keyRelease()释放键。
另请参阅QTest::keyRelease()和QTest::keyClick()。
void QTest::keyRelease(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
模拟在小部件上释放一个带可选项的修饰键。如果延迟大于0,则测试将在释放键之前等待延迟毫秒。
另请参阅QTest::keyPress()和QTest::keyClick()。
void QTest::keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在一个窗口上释放一个带可选项的修饰键。如果延迟大于0,则测试将在释放键之前等待延迟毫秒。
另请参阅QTest::keyClick。
void QTest::keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在一个窗口上释放一个带可选项的修饰键。如果延迟大于0,则测试将在释放键之前等待延迟毫秒。
另请参阅QTest::keyPress()和QTest::keyClick()。
void QTest::keyRelease(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
这是一个重载函数。
模拟在小部件上释放一个带可选项的修饰键。如果延迟大于0,则测试将在释放键之前等待延迟毫秒。
另请参阅QTest::keyClick。
void QTest::keySequence(QWindow *window, const QKeySequence &keySequence)
这是一个重载函数。
模拟在窗口中输入keySequence。
另请参阅QTest::keyClick()和QTest::keyClicks()。
void QTest::keySequence(QWidget *widget, const QKeySequence &keySequence)
这是一个重载函数。
模拟在 widget 中输入 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 定义;默认位置是 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)
这是一个重载函数。
模拟在 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 定义;默认位置是 widget 的中心。如果指定了 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,鼠标指针将移动到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)
这是一个重载函数。
模拟在window上按下带有可选stateKey修饰符的鼠标button。位置由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 ms),这可以通过命令行参数覆盖。
注意:如果您想通过发送单独的事件来测试双击,请指定鼠标释放事件的短延迟,比默认值要大。按、释放、再次按和释放的总延迟必须小于 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)
这是一个重载函数。
模拟在一个窗口上释放一个鼠标按钮,可选的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 测试命令行参数。
以下示例将运行MyTestObject中的所有测试:
MyTestObject test1; QTest::qExec(&test1);
如果没有测试失败,则此函数返回0;如果有一个或多个测试失败,或者出现未处理的异常,则返回其他值。(跳过的测试不影响返回值。)
对于独立测试应用程序,可以使用便利宏QTEST_MAIN()来声明一个解析命令行参数并执行测试的main()函数,从而避免显式调用此函数。
此函数的返回值也是使用QTEST_MAIN()宏时测试应用程序的退出代码。
对于独立测试应用程序,此函数不应调用多次,因为将测试输出记录到文件和执行单个测试函数的命令行选项将不会正确执行。
注意:此函数是非重入的,一次只能运行一个测试。使用qExec()执行的测试不能通过qExec()再次运行另一个测试,并且不允许线程同时调用qExec()。
如果您是通过对main()
中的参数进行处理来创建参数,而不是从main()
的参数中获取它们,那么使用QTest::qExec(QObject *, const QStringList &)可能更有兴趣,因为它具有Unicode安全性。
另请参阅QTEST_MAIN()、QTEST_GUILESS_MAIN()和QTEST_APPLESS_MAIN()。
int QTest::qExec(QObject *testObject, const QStringList &arguments)
这是一个重载函数。
其行为与qExec(QObject *, int, char**)相同,但它接收一个QStringList参数列表arguments而不是一个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必须大于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]
模板 <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));
上述代码将等待对象准备好,最多等待三秒。
此函数是在Qt 6.7中引入的。
模板 <typename Functor> bool QTest::qWaitFor(Functor predicate, int timeout)
这是一个重载函数。
等待 timeout 毫秒或直到 predicate 返回 true。
这等于调用
qWaitFor(predicate, QDeadlineTimer(timeout));
bool QTest::qWaitForWindowActive(QWindow *window, int timeout = 5000)
如果在 timeout 毫秒内 window 激活,则返回 true
。否则返回 false
。
此方法在测试中非常有用,这些测试调用 QWindow::show() 并依赖于窗口在继续之前实际上是活动的(即可见并且拥有焦点)。
注意:如果有另一个窗口阻止 window 激活,则方法将超时并返回 false
。
注意:由于焦点是专有属性,window 可能在任何时候失去焦点 - 即使方法返回 true
之后。
另请参阅:qWaitForWindowExposed,qWaitForWindowFocused 和 QWindow::isActive。
bool QTest::qWaitForWindowActive(QWidget *widget, int timeout = 5000)
如果在 timeout 毫秒内 widget 激活,则返回 true
。否则返回 false
。
此方法在测试中非常有用,这些测试调用 QWidget::show() 并依赖于控件在继续之前实际上是活动的(即可见并且拥有焦点)。
注意:如果有另一个窗口阻止 widget 激活,则方法将超时并返回 false
。
注意:由于焦点是专有属性,widget 可能在任何时候失去焦点 - 即使方法返回 true
之后。
另请参阅:qWaitForWindowExposed 和 QWidget::isActiveWindow。
bool QTest::qWaitForWindowExposed(QWindow *window, int timeout = 5000)
如果在 timeout 毫秒内 window 暴露,则返回 true
。否则返回 false
。
该方法在调用QWindow::show()并进行操作的测试中非常有用,这些测试依赖于在继续之前窗口实际上是可见的。
注意:即使窗口被映射到屏幕上,如果客户端区域不可见(例如,因为它完全被其他窗口覆盖),也可能不被视为已暴露。在这种情况下,该方法将超时并返回false
。
另请参阅qWaitForWindowActive()和QWindow::isExposed。
bool QTest::qWaitForWindowExposed(QWidget *widget, int timeout = 5000)
如果在timeout
毫秒内widget暴露,则返回true
。否则返回false
。
该方法在调用QWidget::show()并依赖于在继续之前小部件实际上是可见的测试中非常有用。
注意:即使窗口被映射到屏幕上,如果客户端区域不可见(例如,因为它完全被其他窗口覆盖),也可能不被视为已暴露。在这种情况下,该方法将超时并返回false
。
另请参阅qWaitForWindowActive()、QWidget::isVisible()和QWindow::isExposed。
[since 6.7]
bool QTest::qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout = std::chrono::seconds{5})
如果窗口在timeout
时间内是焦点窗口,则返回true
。否则返回false
。
该方法在调用QWindow::show()并依赖于在继续之前窗口拥有焦点(例如,接收键盘事件)的测试中非常有用。
注意:如果其他窗口阻止窗口获得焦点,则该方法将超时并返回false
。
注意:由于焦点是专有属性,window 可能在任何时候失去焦点 - 即使方法返回 true
之后。
此函数是在Qt 6.7中引入的。
另请参阅qWaitForWindowExposed()、qWaitForWindowActive()和QGuiApplication::focusWindow。
[since 6.7]
bool QTest::qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout = std::chrono::seconds{5})
如果小部件在timeout
时间内是焦点窗口,则返回true
。否则返回false
。
该方法在调用QWidget::show()并依赖于在继续之前小部件拥有焦点(例如,接收键盘事件)的测试中非常有用。
注意:如果其他窗口阻止窗口获得焦点,则该方法将超时并返回false
。
注意:由于焦点是专有属性,widget 可能在任何时候失去焦点 - 即使方法返回 true
之后。
此函数是在Qt 6.7中引入的。
另请参阅qWaitForWindowExposed()、qWaitForWindowActive()和QGuiApplication::focusWindow。
void QTest::setBenchmarkResult(qreal result, QTest::QBenchmarkMetric metric)
将此测试函数的基准结果设置为result
。
如果您想通过不使用QBENCHMARK宏来报告基准结果,请使用此函数。使用metric指定Qt Test如何解释结果。
结果上下文将是测试函数名称和任何从_data函数中获取的标签。此函数在每个测试函数中只能调用一次,后续调用将替换先前的报告结果。
请注意,没有“-iterations”命令行参数会对接收QBENCHMARK宏的测试函数没有影响。
char *QTest::toHexRepresentation(const char *ba, qsizetype length)
返回一个指向字符串的指针,该字符串是将字符串 ba 表示为空格分隔的十六进制字符序列。如果输入被认为太长,则对其进行截断。截断可用末尾的省略号表示。调用者拥有返回指针的所有权,必须确保稍后将其传递给 operator delete[]。
length 是字符串 ba 的长度。
template <typename T> char *QTest::toString(const T &value)
返回 value 的文本表示。此函数由 QCMPARE() 用于在测试失败时输出详细信息。
您可以为您的测试添加此函数的特殊化或重载,以启用详尽输出。
注意:从 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
实例的比较失败时,QCMPARE() 将调用此函数以将 MyPoint
的内容输出到测试日志。
相同的示例,但使用重载(Qt ≥ 5.5)
namespace { char *toString(const MyPoint &point) { return QTest::toString("MyPoint(" + QByteArray::number(point.x()) + ", " + QByteArray::number(point.y()) + ')'); } }
另请参阅:QCOMPARE()。
template <typename T1, typename T2> char *QTest::toString(const std::pair<T1, T2> &pair)
这是一个重载函数。
返回 pair 的文本表示。
[自 6.5 起支持]
char *QTest::toString(const QKeySequence &ks)
这是一个重载函数。
返回键序列 ks 的文本表示。
此函数是在 Qt 6.5 中引入的。
char *QTest::toString(QSizePolicy::Policy p)
这是一个重载函数。
返回策略 p 的文本表示。
char *QTest::toString(QSizePolicy::ControlTypes cts)
这是一个重载函数。
返回控制类型 cts 的文本表示。
char *QTest::toString(QSizePolicy::ControlType ct)
这是一个重载函数。
返回控制类型 ct 的文本表示。
char *QTest::toString(QSizePolicy sp)
这是一个重载函数。
返回大小策略的文本表示形式 sp。
template <typename... Types> char *QTest::toString(const std::tuple<Types...> &tuple)
这是一个重载函数。
返回给定 tuple 的文本表示形式。
char *QTest::toString(const QStringView &string)
这是一个重载函数。
返回给定 string 的文本表示形式。
char *QTest::toString(const QString &string)
这是一个重载函数。
返回给定 string 的文本表示形式。
char *QTest::toString(const QLatin1StringView &string)
这是一个重载函数。
返回给定 string 的文本表示形式。
char *QTest::toString(const QByteArray &ba)
这是一个重载函数。
返回字节数组 ba 的文本表示形式。
另请参阅 QTest::toHexRepresentation。
char *QTest::toString(const QTime &time)
这是一个重载函数。
返回给定 time 的文本表示形式。
char *QTest::toString(const QDate &date)
这是一个重载函数。
返回给定 date 的文本表示形式。
char *QTest::toString(const QDateTime &dateTime)
这是一个重载函数。
返回由 dateTime 指定的时间和日期的文本表示形式。
char *QTest::toString(const QCborError &c)
这是一个重载函数。
返回给定 CBOR 错误 c 的文本表示形式。
char *QTest::toString(const QChar &character)
这是一个重载函数。
返回给定 character 的文本表示形式。
char *QTest::toString(const QPoint &point)
这是一个重载函数。
返回给定 point 的文本表示形式。
char *QTest::toString(const QSize &size)
这是一个重载函数。
返回给定 size 的文本表示形式。
char *QTest::toString(const QRect &rectangle)
这是一个重载函数。
返回给定 rectangle 的文本表示形式。
char *QTest::toString(const QPointF &point)
这是一个重载函数。
返回给定 point 的文本表示形式。
char *QTest::toString(const QSizeF &size)
这是一个重载函数。
返回给定 size 的文本表示形式。
char *QTest::toString(const QRectF &rectangle)
这是一个重载函数。
返回给定 rectangle 的文本表示形式。
char *QTest::toString(const QUrl &)
这是一个重载函数。
返回给定 url 的文本表示形式。
char *QTest::toString(const QUuid &uuid)
这是一个重载函数。
返回给定 uuid 的文本表示形式。
char *QTest::toString(const QVariant &variant)
这是一个重载函数。
返回给定 variant 的文本表示形式。
char *QTest::toString(std::nullptr_t)
这是一个重载函数。
返回包含 nullptr
的字符串。
char *QTest::toString(const QVector2D &v)
这是一个重载函数。
返回2D向量 v 的文本表示形式。
char *QTest::toString(const QVector3D &v)
这是一个重载函数。
返回3D向量 v 的文本表示形式。
char *QTest::toString(const QVector4D &v)
这是一个重载函数。
返回4D向量 v 的文本表示形式。
QTest::QTouchEventWidgetSequence QTest::touchEvent(QWidget *widgit, 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() 来创建一个用于此功能的测试触摸设备。
宏文档
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)
The QCOMPARE() 宏通过使用等于运算符比较一个 实际 值和一个 期望 值。如果 实际 和 期望 相匹配,则执行继续。如果不匹配,则记录测试日志中的失败,并且测试函数返回而不尝试任何后续检查。
始终要尊重 QCOMPARE() 的参数语义。传递给它的第一个参数应该是代码中所生产的确切值,而第二个参数应该是期望的值。当值不匹配时,QCOMPARE() 会使用标签 实际 和 期望 打印它们。如果参数顺序颠倒,则调试失败的测试可能会令人困惑,并可能导致零值测试因舍入误差而失败。
QCOMPARE() 试图在比较失败时输出值的实际内容,以便可以从测试日志中看到为什么比较失败。
示例
当比较浮点类型 (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()
或 plain delete
)释放它。
参见QVERIFY ()、QTRY_COMPARE ()、QTest::toString ()、QEXPECT_FAIL ()、QCOMPARE_EQ ()、QCOMPARE_NE ()、QCOMPARE_LT ()、QCOMPARE_LE ()、QCOMPARE_GT () 和 QCOMPARE_GE ()。
[since 6.4]
QCOMPARE_EQ(computed, baseline)
The QCOMPARE_EQ() 宏检查 computed 是否与 baseline 使用相等运算符相等。如果是真,则执行继续。如果不是,则记录测试日志中的失败,测试函数返回而不尝试任何后续检查。
这通常类似于调用QVERIFY(computed == baseline);
,但在失败的情况下会打印格式化的错误信息,报告computed和baseline参数表达式和值。
注意:此宏只能用于由测试框架调用的测试函数中。
对于您自己的类,您可以通过重载 QTest::toString() 来格式化值,以便将其输出到测试日志中。
此宏是在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()。
[自 6.4 以来]
QCOMPARE_NE(computed, baseline)
The 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)
The 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(类型, 名称)
此宏从一个全局数据表中的行获取名为 名称 的变量,类型为 类型。名称和类型必须与全局数据表中的某一列相匹配。这是可断言的,如果断言失败,测试将终止。
假设测试如下数据
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(文件名)
返回一个指向 文件名 所指的是测试数据文件的 QString,如果测试数据文件找不到,则返回一个空的 QString。
此宏允许测试从外部文件加载数据,而无需在测试中硬编码绝对文件名或使用可能出错的相对路径。
返回的路径将是以下列表中第一个解析为现有文件或目录的路径
- 文件名 相对于 QCoreApplication::applicationDirPath()(只有在创建了一个 QCoreApplication 或 QApplication 对象时才有效)。
- 文件名 相对于测试的标准安装目录(在 QLibraryInfo::TestsPath 后附加小写的测试用例名称)。
- 文件名 相对于包含来源文件的目录,其中 QFINDTESTDATA 被调用。
如果这些位置中的任何一个位置上不存在指定的文件/目录,则在测试日志中打印警告。
例如,在以下代码中
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(描述)
如果从测试函数调用,QSKIP() 宏将停止测试执行而不会将失败添加到测试日志中。您可以用它来跳过在当前配置下不合理的测试。例如,如果所需的字体在测试系统中未安装,字体渲染测试可能会调用 QSKIP()。
文本 描述 将附加到测试日志中,应包含解释为什么测试无法执行的原因。
如果测试是数据驱动的,测试函数中每个 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(实际, 测试元素)
QTEST() 是 QCOMPARE() 的便利宏,它将值 实际 与测试数据的元素 测试元素 进行比较。如果没有这样的元素,则测试会进行断言。
除了这一点外,QTEST() 的行为与 QCOMPARE() 完全相同。
除了编写
您还可以编写
QTEST(QString("hello").toUpper(), "myString");
另请参阅:QCOMPARE()。
QTEST_APPLESS_MAIN(TestClass)
实现一个main()函数,执行类TestClass中的所有测试。
类似于QTEST_MAIN,但不实例化QApplication对象。使用此宏进行非常简单的独立非GUI测试。
另请参阅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
,则该宏将强制禁用它。这是为了简化编写自动化测试时按键事件的用法。如果想要编写使用键盘导航的测试用例,应通过调用QApplication::setNavigationMode()在测试用例的initTestCase()
或init()
函数中启用。
示例
QTEST_MAIN(TestQString)
另请参阅QTEST_APPLESS_MAIN、QTEST_GUILESS_MAIN、QTest::qExec和QApplication::setNavigationMode。
QTRY_COMPARE(实际, 预期)
通过以五秒的超时时间调用QTRY_COMPARE_WITH_TIMEOUT,执行对实际和预期值的比较。
注意:此宏只能用于由测试框架调用的测试函数中。
另请参阅QTRY_COMPARE_WITH_TIMEOUT、QCOMPARE、QVERIFY、QTRY_VERIFY和QEXPECT_FAIL。
[自6.4起]
QTRY_COMPARE_EQ(计算的, 基线)
通过调用QTRY_COMPARE_EQ_WITH_TIMEOUT并设置五秒超时,执行对计算的和基线值的比较。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_EQ和QTRY_COMPARE_EQ_WITH_TIMEOUT。
[自 6.4 开始]
QTRY_COMPARE_EQ_WITH_TIMEOUT(计算结果, 基线值, 超时时间)
此宏类似于 QCOMPARE_EQ(),但会重复比较 计算结果 和 基线值,直到比较返回 true
或达到 超时时间(以毫秒为单位)。在每次比较之间,将处理事件。如果达到超时时间,将在测试日志中记录失败,并且测试将不会继续执行。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_EQ() 和 QTRY_COMPARE_EQ()。
[自 6.4 开始]
QTRY_COMPARE_GE(计算结果, 基线值)
通过调用 QTRY_COMPARE_GE_WITH_TIMEOUT 并设置超时时间为五秒钟来比较 计算结果 和 基线值。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_GE() 和 QTRY_COMPARE_GE_WITH_TIMEOUT()。
[自 6.4 开始]
QTRY_COMPARE_GE_WITH_TIMEOUT(计算结果, 基线值, 超时时间)
此宏类似于 QCOMPARE_GE(),但会重复比较 计算结果 和 基线值,直到比较返回 true
或达到 超时时间(以毫秒为单位)。在每次比较之间,将处理事件。如果达到超时时间,将在测试日志中记录失败,并且测试将不会继续执行。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_GE() 和 QTRY_COMPARE_GE()。
[自 6.4 开始]
QTRY_COMPARE_GT(计算结果, 基线值)
通过调用 QTRY_COMPARE_GT_WITH_TIMEOUT 并设置超时时间为五秒钟来比较 计算结果 和 基线值。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_GT() 和 QTRY_COMPARE_GT_WITH_TIMEOUT()。
[自 6.4 开始]
QTRY_COMPARE_GT_WITH_TIMEOUT(计算结果, 基线值, 超时时间)
此宏类似于 QCOMPARE_GT(),但会重复比较 计算结果 和 基线值,直到比较返回 true
或达到 超时时间(以毫秒为单位)。在每次比较之间,将处理事件。如果达到超时时间,将在测试日志中记录失败,并且测试将不会继续执行。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_GT() 和 QTRY_COMPARE_GT()。
[自 6.4 开始]
QTRY_COMPARE_LE(计算结果, 基线值)
通过调用 QTRY_COMPARE_LE_WITH_TIMEOUT 并设置超时时间为五秒钟来比较 计算结果 和 基线值。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_LE() 和 QTRY_COMPARE_LE_WITH_TIMEOUT()。
[自 6.4 开始]
QTRY_COMPARE_LE_WITH_TIMEOUT(计算结果, 基线值, 超时时间)
此宏与QCOMPARE_LE()类似,但会反复比较计算值和基线值,直到比较返回true
或达到超时时间(以毫秒为单位)。每次比较之间,会处理事件。如果达到超时时间,测试日志中会记录失败,并且不会进一步执行测试。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_LE()和QTRY_COMPARE_LE。
[自6.4以来]
QTRY_COMPARE_LT(计算, 基线)
通过调用QTRY_COMPARE_LT_WITH_TIMEOUT并设置超时为五秒来比较计算和基线值。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_LT()和QTRY_COMPARE_LT_WITH_TIMEOUT。
[自6.4以来]
QTRY_COMPARE_LT_WITH_TIMEOUT(计算, 基线, 超时)
此宏与QCOMPARE_LT()类似,但会反复比较计算值和基线值,直到比较返回true
或达到超时时间(以毫秒为单位)。每次比较之间,会处理事件。如果达到超时时间,测试日志中会记录失败,并且不会进一步执行测试。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_LT()和QTRY_COMPARE_LT。
[自6.4以来]
QTRY_COMPARE_NE(计算, 基线)
通过调用QTRY_COMPARE_NE_WITH_TIMEOUT并设置超时为五秒来比较计算和基线值。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_NE()和QTRY_COMPARE_NE_WITH_TIMEOUT。
[自6.4以来]
QTRY_COMPARE_NE_WITH_TIMEOUT(计算, 基线, 超时)
此宏与QCOMPARE_NE()类似,但会反复比较计算值和基线值,直到比较返回true
或达到超时时间(以毫秒为单位)。每次比较之间,会处理事件。如果达到超时时间,测试日志中会记录失败,并且不会进一步执行测试。
注意:此宏只能用于由测试框架调用的测试函数中。
此宏是在Qt 6.4中引入的。
另请参阅QCOMPARE_NE()和QTRY_COMPARE_NE。
QTRY_COMPARE_WITH_TIMEOUT(实际, 期望, 超时)
QTRY_COMPARE_WITH_TIMEOUT()宏与QCOMPARE()类似,但会反复比较实际和期望值,直到两个值相等或达到超时时间(以毫秒为单位)。每次比较之间,会处理事件。如果达到超时时间,测试日志中会记录失败,并且不会进一步执行测试。
注意:此宏只能用于由测试框架调用的测试函数中。
另请参阅QTRY_COMPARE,QCOMPARE,QVERIFY,QTRY_VERIFY和QEXPECT_FAIL。
QTRY_VERIFY2(条件, 消息)
通过调用带五秒超时的QTRY_VERIFY2_WITH_TIMEOUT()来检查条件。如果此时条件仍然为假,将输出消息。此消息是一个纯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(条件)
通过调用带五秒超时的QTRY_VERIFY_WITH_TIMEOUT()来检查条件。
注意:此宏只能用于由测试框架调用的测试函数中。
另请参阅QTRY_VERIFY_WITH_TIMEOUT()、QTRY_VERIFY2()、QVERIFY()、QCOMPARE()、QTRY_COMPARE()和QEXPECT_FAIL()。
QTRY_VERIFY2_WITH_TIMEOUT(条件, 消息, 超时)
QTRY_VERIFY2_WITH_TIMEOUT宏类似于QTRY_VERIFY_WITH_TIMEOUT(),但是在指定的超时(毫秒)后,如果条件仍然为假,将输出详尽的消息。此消息是一个纯C字符串。
示例
QTRY_VERIFY2_WITH_TIMEOUT(list.size() > 2, QByteArray::number(list.size()).constData(), 10000);
注意:此宏只能用于由测试框架调用的测试函数中。
另请参阅QTRY_VERIFY()、QTRY_VERIFY_WITH_TIMEOUT()、QVERIFY()、QCOMPARE()、QTRY_COMPARE()和QEXPECT_FAIL()。
QTRY_VERIFY_WITH_TIMEOUT(条件, 超时)
QTRY_VERIFY_WITH_TIMEOUT()宏类似于QVERIFY(),但是会重复检查条件,直到条件变为真或达到超时(毫秒)。每次评估之间,会处理事件。如果达到超时,将在测试日志中记录失败,并且测试将不再执行。
注意:此宏只能用于由测试框架调用的测试函数中。
另请参阅QTRY WARRANT()、QTRY_VERIFY2_WITH_TIMEOUT()、QVERIFY()、QCOMPARE()、QTRY_COMPARE()和QEXPECT_FAIL()。
QVERIFY2(条件, 消息)
QVERIFY2()宏的行为与QVERIFY()完全相同,只是当条件为假时报告一个消息。此消息是一个纯C字符串。
此消息也可以从调用生成纯C字符串的函数中获取,例如将qPrintable()应用于QString,该字符串可以按其通常的方式构造,包括使用.args()
格式化一些数据。
示例
QVERIFY2(QFileInfo("file.txt").exists(), "file.txt does not exist.");
例如,如果您有一个文件对象并正在测试其open()
函数,您可能编写一个如下所示的测试语句
bool opened = file.open(QIODevice::WriteOnly); QVERIFY(opened);
如果此测试失败,它将无法提供关于文件为何无法打开的线索
失败!: tst_QFile::open_write() 'opened'返回FALSE。(空格)
如果您可以构造更详细的错误消息,您可以使用QVERIFY2()
将消息和测试条件一起传递,以在失败时提供更详细的消息
QVERIFY2(file.open(QIODevice::WriteOnly), qPrintable(QString("open %1: %2") .arg(file.fileName()).arg(file.errorString())));
如果此分支正在Qt CI系统中进行测试,则上述详细失败消息将被插入到发布到代码审查系统的摘要中
失败!: tst_QFile::open_write() 'opened'返回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(条件)
QVERIFY() 宏用于检查 条件 是否为真。如果条件为真,则执行继续。如果不为真,会在测试日志中记录失败,并且不会执行后续测试。
当向测试失败报告添加额外信息实际且有价值时,可以使用 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()。
[自6.3版本起]
QVERIFY_THROWS_EXCEPTION(异常类型, ...)
QVERIFY_THROWS_EXCEPTION 宏执行变长参数表达式中给出的表达式,并期望从该表达式中捕获抛出的异常。
有以下几种可能的结果
- 如果表达式抛出的异常与 异常类型 相同或继承自 异常类型,则执行将继续。
- 否则,如果表达式没有抛出异常,或者抛出的异常从
std::exception
继承,则会在测试日志中记录失败,并且宏提前返回(从封装函数返回)。 - 如果抛出的异常既不是从
std::exception
继承也不是从 异常类型 继承,则会在测试日志中记录失败,并且重新抛出异常。这避免了例如 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 中引入的。
[自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 中引入的。
© 2024 Qt公司有限公司。本文档中包含的文档贡献版权属于各自所有者。本提供的文档是根据自由软件基金会的出版物,以GNU自由文档许可协议版本1.3许可的。Qt及其相应标识是Qt公司在芬兰以及/或全球其他国家的商标。所有其他商标产权均属于各自所有者。