示例:
// main.cpp
#include <QTest>
#include "TestQString.h"
QTEST_MAIN(TestQString);
// TestQString.h
#ifndef TESTQSTRING_H
#define TESTQSTRING_H
#include <QObject>
class TestQString : public QObject
{
Q_OBJECT
public:
TestQString();
~TestQString();
private slots:
void toLower();
void toLower_data();
void toUpper();
void toTestUI();
void toTestUI_data();
};
#endif // TESTQSTRING_H
// TestQString.cpp
#include "TestQString.h"
#include <QtTest/QtTest>
#include <QtWidgets/QtWidgets>
TestQString::TestQString() : QObject()
{
}
TestQString::~TestQString()
{
}
void TestQString::toUpper()
{
QString str = "test";
QVERIFY(str.toUpper() == "TEST");
QVERIFY(str.toUpper() == "test");
QVERIFY(str.toUpper() == "Test");
}
void TestQString::toLower()
{
QFETCH(QString, string);
QFETCH(QString, result);
QVERIFY(string.toLower() == result);
}
void TestQString::toLower_data()
{
QTest::addColumn<QString>("string");
QTest::addColumn<QString>("result");
QTest::newRow("allLower") << "test" << "test";
QTest::newRow("mixed") << "Test" << "Test";
QTest::newRow("allUpper") << "TEST" << "test";
}
void TestQString::toTestUI()
{
QFETCH(QTestEventList, events);
QFETCH(QString, result);
QLineEdit oLineEdit;
events.simulate(&oLineEdit);
QVERIFY(oLineEdit.text() == result);
}
void TestQString::toTestUI_data()
{
QTest::addColumn<QTestEventList>("events");
QTest::addColumn<QString>("result");
QTestEventList list1;
list1.addKeyClick('a');
QTest::newRow("input a") << list1 << "a";
QTestEventList list2;
list2.addKeyClick('a');
list2.addKeyClick(Qt::Key_Backspace);
QTest::newRow("input a and backspace") << list2 << "";
}
- QTest的每個測試用例都是一個slot
- 槽函數XXX_data(),表示對一組數據進行測試
- Qt提供的比較宏(QVERIFY、QCOMPARE),驗證失敗會return,後續代碼不會執行
- 使用QEXPECT_FAIL("", "", Continue),緊鄰的比較宏失敗(隻影響後續第一個,但不管第一個的結果),後續代碼仍會執行
- 啓動測試用例的執行函數,不指定命令行參數,則會把測試結果輸出到控制檯
- 測試用例中模擬事件,則需要在預處理器定義中包含QT_WIDGETS_LIB、QT_GUI_LIB
- 模擬事件,可以使用QTest的接口,也可以直接使用qApp->notify()
- 模擬事件時,需要明確哪個控件處理該事件,例QTabWidget的鼠標點擊頁籤,真正的消息處理對象是QTabBar
- 測試用例中,不能彈出模態窗體,否則會阻塞後續代碼