警告

本节包含从C++自动转换为Python的代码片段,可能存在错误。

第四章:重放GUI事件#

如何重放GUI事件。

在本章中,我们将展示如何模拟GUI事件,以及如何存储一系列GUI事件,并在小部件上重放它们。

存储一系列事件并重放的方法与第2章中解释的方法非常相似。您只需要向测试类中添加一个数据函数即可。

class TestGui(QObject):

    Q_OBJECT
# private slots
    def testGui_data():
    def testGui():

编写数据函数#

与之前一样,测试函数相关的数据函数具有相同的名称,后缀为_data

def testGui_data(self):

    QTest.addColumn<QTestEventList>("events")
    QTest.addColumn<QString>("expected")
    list1 = QTestEventList()
    list1.addKeyClick('a')
    QTest.newRow("char") << list1 << "a"
    list2 = QTestEventList()
    list2.addKeyClick('a')
    list2.addKeyClick(Qt.Key_Backspace)
    QTest.newRow("there+back-again") << list2 << ""

首先,我们使用addColumn()函数定义表格的元素:一个GUI事件列表,以及将这些事件应用于QWidget的预期结果。请注意,第一个元素的类型是QTestEventList

QTestEventList可以被填充为可以存储为测试数据以供稍后使用或可以在任何QWidget上重放的GUI事件。

在我们当前的数据函数中,我们创建了两个QTestEventList元素。第一个列表由一个点击到“a”键组成。我们使用addKeyClick()函数将该事件添加到列表中。然后我们使用newRow()函数为数据集命名,并将事件列表和预期结果流式传输到表格中。

第二个列表包含两个键点击:一个跟随的“backspace”的“a”。我们再次使用addKeyClick()将这些事件添加到列表中,并使用newRow()将事件列表和预期结果放入具有关联命名的表格中。

重写测试函数#

我们的测试现在可以重写

def testGui(self):

    QFETCH(QTestEventList, events)
    QFETCH(QString, expected)
    lineEdit = QLineEdit()
    events.simulate(lineEdit)
    QCOMPARE(lineEdit.text(), expected)

TestGui::testGui()函数将执行两次,一次针对TestGui::testGui_data()函数中创建的测试数据中的每个条目。

首先,我们使用QFETCH()宏获取数据集的元素。 QFETCH()接受两个参数:元素的类型和元素名称。然后我们创建一个QLineEdit,并使用simulate()函数将该事件列表应用于该小部件。

最后,我们使用QCOMPARE()宏检查文本框的文本是否符合预期。

准备独立可执行文件#

与前述类似,为了将我们的测试用例制作成独立可执行文件,需要以下两条语句

QTEST_MAIN(TestGui)
from testgui.moc import *

QTEST_MAIN() 宏展开为一个简单的 main() 方法,它运行所有的测试函数;由于我们的测试类的声明和实现都在一个 .cpp 文件中,我们还需要包含生成的 moc 文件以使 Qt 的反省功能生效。

构建可执行文件#

您可以使用 CMake 或 qmake 来构建测试用例的可执行文件。

使用 CMake 构建#

在您的 CMakeLists.txt 文件中配置您的构建设置

<Code snippet "/data/qt5-full-670/6.7.0/Src/qtbase/tutorial4/CMakeLists.txt" not found>

接下来,从命令行运行 cmake 或使用位于 Qt-prefix/<version>/<platform>/bin/qt-cmake 的便捷脚本 qt-cmake

<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja

然后,运行您首选的生成工具构建可执行文件。这里,我们使用 Ninja

ninja

使用 qmake 构建#

在您的 .pro 文件中配置您的构建设置

<Code snippet "/data/qt5-full-670/6.7.0/Src/qtbase/tutorial4/tutorial4.pro" not found>

接下来,运行 qmake,最后运行 make 来构建您的可执行文件

qmake
make

运行可执行文件#

运行生成的可执行文件应该提供以下输出

********* Start testing of TestGui *********
Config: Using QtTest library %VERSION%, Qt %VERSION%
PASS   : TestGui::initTestCase()
PASS   : TestGui::testGui(char)
PASS   : TestGui::testGui(there+back-again)
PASS   : TestGui::cleanupTestCase()
Totals: 4 passed, 0 failed, 0 skipped, 0 blacklisted, 18ms
********* Finished testing of TestGui *********