第4章:重放GUI事件

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

存储一系列事件并重放的方法与第2章中解释的方法非常相似。你所要做的就是给你的测试类添加一个数据函数

class TestGui: public QObject
{
    Q_OBJECT

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

编写数据函数

和以前一样,测试函数关联的数据函数有相同的名称,后缀为_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+back-again") << list2 << "";
}

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

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

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

第二个列表由两个键击组成:一个'a'字和一个随后的'backspace'。我们再次使用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()函数在该widget上应用事件列表。

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

准备独立的可执行文件

和以前一样,为了使我们的测试用例成为一个独立的可执行文件,需要以下两行:

QTEST_MAIN(TestGui)
#include "testgui.moc"

宏 QTEST_MAIN 输出为简单的 main() 方法,该方法运行所有测试函数。由于我们的测试类声明和实现都在 .cpp 文件中,因此还需要包含生成的 moc 文件,以便 Qt 实现反射。

构建可执行文件

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

使用 CMake 构建

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

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

cmake_minimum_required(VERSION 3.16)
project(tutorial4 LANGUAGES CXX)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)

qt_standard_project_setup()

qt_add_executable(tutorial4
    testgui.cpp
)

set_target_properties(tutorial4 PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

target_link_libraries(tutorial4 PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Test
    Qt6::Widgets
)

install(TARGETS tutorial4
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

qt_generate_deploy_app_script(
    TARGET tutorial4
    OUTPUT_SCRIPT deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})

接下来,从命令行运行 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 文件中配置构建设置

QT += widgets testlib

SOURCES = testgui.cpp

# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial4
INSTALLS += target

接下来,运行 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 *********

© 2024 Qt 公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证第 1.3 版 条款许可的。Qt 和相应标志是芬兰 Qt 公司和/或在世界其他地区的商标。所有其他商标均为其各自所有者的财产。