第 4 章:重放 GUI 事件
在本章中,我们将演示如何模拟一个 GUI 事件,以及如何存储一系列 GUI 事件并在控件上重放它们。
存储一系列事件并重放的方法与第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 可以填充GUI事件,这些事件既可作为测试数据存储以备后用,也可在任何QWidget 上重放。
在当前的数据函数中,我们创建了两个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()函数将事件列表应用到该控件上。
最后,我们使用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 *********© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.