一、描述
QTest 命名空间包含与 Qt 单元测试相关的所有函数和声明。
二、类型成员
1、enum QTest::KeyAction:此枚举描述了按键的可能操作。
- Press:按键被按下。
- Release:按键被释放。
- Click:按键被单击(按下并释放)。
- Shortcut:按键的快捷方式被激活。
2、enum QTest::MouseAction:此枚举描述了鼠标的可能操作。
- MousePress:按下鼠标按钮。
- MouseRelease:释放鼠标按钮。
- MouseClick:单击鼠标按钮(按下并释放)。
- MouseDClick:双击鼠标按钮(按下并释放两次)。
- MouseMove:鼠标指针已移动。
3、enum QTest::TestFailMode:此枚举描述了检查到错误后的处理模式,例如通过 QVERIFY() 或 QCOMPARE() 宏,这是已知的失败。
- Abort:中止测试的执行。如果检查到问题后继续执行测试没有意义时可使用此模式。
- Continue:在检查发现问题后继续执行测试。
三、部分成员函数
1、template <typename T> void addColumn(const char *name, T *dummy = 0)
2、QTestData & addRow(const char *format, ...)
QTestData & newRow(const char *dataTag)
3、const char * currentAppName()
4、const char * currentDataTag()
5、bool currentTestFailed()
6、const char * currentTestFunction()
7、void failOnWarning(const QRegularExpression &messagePattern)
void failOnWarning(const char *message)
8、void ignoreMessage(QtMsgType type, const char *message)
void ignoreMessage(QtMsgType type, const QRegularExpression &messagePattern)
9、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)
QTest::keyClick(myWidget, Qt::Key_Escape);
QTest::keyClick(myWidget, Qt::Key_Escape, Qt::ShiftModifier, 200);
上面的第一个示例模拟了在没有任何键盘修饰符且没有延迟的情况下单击 myWidget 上的退出键。 第二个示例模拟在测试延迟 200 毫秒后单击 myWidget 上的 shift-escape。
#include <QApplication>
#include <QDebug>
#include <QTest>
#include <QPushButton>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
auto btn = new QPushButton("按钮",&w);
btn->connect(btn,&QPushButton::clicked,[]{
qDebug()<<"按钮按下";
});
btn->setDefault(true);
QTimer timer;
timer.connect(&timer,&QTimer::timeout,[btn]{
QTest::keyClick(btn, Qt::Key_Space);
});
timer.start(1000);
w.resize(300,300);
w.show();
return a.exec();
}
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)
QTest::keyClick(myWidget, 'a');
10、void keyClicks(QWidget *widget, const QString &sequence, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1)
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug()<<QChar(event->key());
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QTimer timer;
timer.connect(&timer,&QTimer::timeout,[&]
{
QTest::keyClicks(&w, "hello world!");
});
timer.start(1000);
w.resize(300,300);
w.show();
return a.exec();
}
11、void keyEvent(QTest::KeyAction action, QWidget *widget, 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 keyEvent(QTest::KeyAction action, QWindow *window, 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)
Widget w;
QTimer timer;
timer.connect(&timer,&QTimer::timeout,[&]
{
QTest::keyEvent(QTest::Press,&w,Qt::Key_Space);
});
timer.start(1000);
12、void keyPress(QWidget *widget, 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 keyPress(QWindow *window, 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)
13、void keyRelease(QWidget *widget, 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 keyRelease(QWindow *window, 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)
14、void keySequence(QWidget *widget, const QKeySequence &keySequence)
void keySequence(QWindow *window, const QKeySequence &keySequence)
15、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)
16、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)
17、void mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay = -1)
void mouseMove(QWindow *window, QPoint pos = QPoint(), int delay = -1)
18、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)
19、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)
20、int qExec(QObject *testObject, int argc = 0, char **argv = nullptr)
int qExec(QObject *testObject, const QStringList &arguments)
21、QSharedPointer<QTemporaryDir> qExtractTestData(const QString &dirName)
22、void qSleep(int ms)
23、void qWait(int ms)
24、template <typename Functor> bool qWaitFor(Functor predicate, int timeout = 5000)
MyObject obj;
obj.startup();
QTest::qWaitFor([&]() {
return obj.isReady();
}, 3000);
上面的代码将等待对象准备就绪,最多三秒钟。
25、bool qWaitForWindowActive(QWindow *window, int timeout = 5000)
bool qWaitForWindowActive(QWidget *widget, int timeout = 5000)
26、bool qWaitForWindowExposed(QWindow *window, int timeout = 5000)
bool qWaitForWindowExposed(QWidget *widget, int timeout = 5000)
27、char * toHexRepresentation(const char *ba, int length)
28、template <typename T> char * toString(const T &value)
返回值的文本表示。QCOMPARE() 使用此函数在测试失败的情况下输出详细信息。
可以将此函数的特化或重载添加到您的测试中以启用详细输出。
应该在类型的命名空间中提供一个 toString() 函数,而不是专门化这个模板。
注意:toString() 的调用者必须使用 delete[] 删除返回的数据。自定义的实现应该返回一个使用 new[] 或 qstrdup() 创建的字符串。 最简单的方法是创建一个 QByteArray 或 QString 并在其上调用 QTest::toString():
namespace {
char *toString(const MyPoint &point)
{
return QTest::toString("MyPoint(" +
QByteArray::number(point.x()) + ", " +
QByteArray::number(point.y()) + ')');
}
}
此函数还有多个重载版本,略。
四、部分宏成员
1、QBENCHMARK
2、QBENCHMARK_ONCE
3、QCOMPARE(actual, expected)
4、QEXPECT_FAIL(dataIndex, comment, mode)
QEXPECT_FAIL("", "Will fix in the next release", Continue);
QCOMPARE(i, 42);
QCOMPARE(j, 43);
在上面的示例中,如果变量 i 不是 42,则会将预期失败写入测试输出。如果变量 i 是 42,则会写入意外通过。QEXPECT_FAIL() 对示例中的第二个 QCOMPARE() 语句没有影响。
5、QFAIL(message)
6、QFETCH(type, name)
假设一个测试有以下数据:
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 是堆栈上的变量,用当前测试数据初始化。
7、QFETCH_GLOBAL(type, name)
假设一个测试有以下数据:
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;
}
这里在两个地方定义了测试数据,使用 QFETCH_GLOBAL() 从全局数据表中读取区域设置,使用 QFETCH() 从本地数据表中读取数字:
void TestQLocale::roundTripInt()
{
QFETCH_GLOBAL(QLocale, locale);
QFETCH(int, number);
bool ok;
QCOMPARE(locale.toInt(locale.toString(number), &ok), number);
QVERIFY(ok);
}
8、QSKIP(description)
9、QTEST(actual, testElement)
QFETCH(QString, myString);
QCOMPARE(QString("hello").toUpper(), myString);
等同于:
QTEST(QString("hello").toUpper(), "myString");
10、QTEST_APPLESS_MAIN(TestClass)
11、QTEST_GUILESS_MAIN(TestClass)
12、QTEST_MAIN(TestClass)
13、QTRY_COMPARE(actual, expected)
14、QTRY_COMPARE_WITH_TIMEOUT(actual, expected, timeout)
15、QTRY_VERIFY2(condition, message)
16、QTRY_VERIFY(condition)
17、QTRY_VERIFY2_WITH_TIMEOUT(condition, message, timeout)
18、QTRY_VERIFY_WITH_TIMEOUT(condition, timeout)
19、QVERIFY2(condition, message)
20、QVERIFY(condition)
21、QVERIFY_THROWS_EXCEPTION(exceptiontype, ...)
22、QVERIFY_THROWS_NO_EXCEPTION(...)