QtTest回放GUI事件

GrayCatYa發表於2020-12-29

第四章:回放GUI事件

如何回放GUI事件。

在本章中,我們將展示如何模擬GUI事件,以及如何儲存一系列GUI事件以及在小部件上重放它們。

儲存一系列事件並回放它們的方法與第2章中解釋的方法非常相似。你所需要做的就是新增一個資料函式到你的測試類:

// testgui.cpp
#include <QtWidgets>
#include <QtTest/QtTest>

class TestGui : public QObject
{
    Q_OBJECT

private slots:
    void testGui_data();
    void testGui();

};

void TestGui::testGui_data()
{
    QTest::addColumn<QTestEventList>("events");
    QTest::addColumn<QString>("expected");

    QTestEventList list1;
    list1.addKeyClick('a');
    QTest::newRow("char") << list1 << "a";

    QTestEventList list2;
    list2.addKeyClick('a');
    list2.addKeyClick(Qt::Key_Backspace);
    QTest::newRow("there and back again") << list2 << "";
}

void TestGui::testGui()
{
    QFETCH(QTestEventList, events);
    QFETCH(QString, expected);

    QLineEdit lineEdit;

    events.simulate(&lineEdit);

    QCOMPARE(lineEdit.text(), expected);
}

QTEST_MAIN(TestGui)
#include "testgui.moc"

寫入資料函式

與前面一樣,測試函式的關聯資料函式具有相同的名稱,後面加上_data。

void TestGui::testGui_data()
{
    QTest::addColumn<QTestEventList>("events");
    QTest::addColumn<QString>("expected");

    QTestEventList list1;
    list1.addKeyClick('a');
    QTest::newRow("char") << list1 << "a";

    QTestEventList list2;
    list2.addKeyClick('a');
    list2.addKeyClick(Qt::Key_Backspace);
    QTest::newRow("there and back again") << list2 << "";
}

首先,我們使用QTest::addColumn()函式定義表的元素:GUI事件列表,以及在QWidget上應用事件列表的預期結果。注意,第一個元素的型別是QTestEventList。

QTestEventList可以用GUI事件填充,這些事件可以儲存為測試資料供以後使用,也可以在任何QWidget上回放。

在當前的資料函式中,我們建立了兩個QTestEventList元素。第一個列表包含對“a”鍵的單擊。我們使用QTestEventList::addKeyClick()函式將事件新增到列表中。然後使用QTest::newRow()函式為資料集提供一個名稱,並將事件列表和預期結果流到表中。

第二個列表由兩個按鍵組成:一個“a”和後面的“退格”。同樣,我們使用QTestEventList::addKeyClick()將事件新增到列表中,使用QTest::newRow()將事件列表和預期結果放入具有關聯名稱的表中。

重寫測試函式

我們的測試現在可以重寫:

void TestGui::testGui()
{
    QFETCH(QTestEventList, events);
    QFETCH(QString, expected);

    QLineEdit lineEdit;

    events.simulate(&lineEdit);

    QCOMPARE(lineEdit.text(), expected);
}

TestGui:: TestGui()函式將執行兩次,一次針對我們在關聯的TestGui::testGui_data()函式中建立的測試資料中的每個條目。

首先,我們使用QFETCH()巨集獲取資料集的兩個元素。QFETCH()接受兩個引數:元素的資料型別和元素名稱。然後,我們建立一個QLineEdit,並使用QTestEventList::simulate()函式在小部件上應用事件列表。

最後,我們使用QCOMPARE()巨集檢查行編輯的文字是否符合預期。

QTEST_MAIN(TestGui)
#include "testgui.moc"

QTEST_MAIN()巨集擴充套件為一個簡單的main()方法,該方法執行所有測試函式。注意,如果我們的測試類的宣告和實現都在.cpp檔案中,我們還需要包括生成的moc檔案,以使Qt的自省工作。

相關文章