QTest學習筆記

示例:

// 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 << "";
}
  1. QTest的每個測試用例都是一個slot
  2. 槽函數XXX_data(),表示對一組數據進行測試
  3. Qt提供的比較宏(QVERIFY、QCOMPARE),驗證失敗會return,後續代碼不會執行
  4. 使用QEXPECT_FAIL("", "", Continue),緊鄰的比較宏失敗(隻影響後續第一個,但不管第一個的結果),後續代碼仍會執行
  5. 啓動測試用例的執行函數,不指定命令行參數,則會把測試結果輸出到控制檯
  6. 測試用例中模擬事件,則需要在預處理器定義中包含QT_WIDGETS_LIB、QT_GUI_LIB
  7. 模擬事件,可以使用QTest的接口,也可以直接使用qApp->notify()
  8. 模擬事件時,需要明確哪個控件處理該事件,例QTabWidget的鼠標點擊頁籤,真正的消息處理對象是QTabBar
  9. 測試用例中,不能彈出模態窗體,否則會阻塞後續代碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章