제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 에는 나중에 사용할 테스트 데이터로 저장하거나, 어떤 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()` 함수를 사용하여 해당 위젯에 이벤트 목록을 적용합니다.
마지막으로, QCOMPARE() 매크로를 사용하여 라인 에디트의 텍스트가 예상대로인지 확인합니다.
독립 실행 파일 준비
앞서와 마찬가지로, 테스트 케이스를 독립 실행형 프로그램으로 만들려면 다음 두 줄이 필요합니다:
QTEST_MAIN(TestGui)
#include "testgui.moc"QTEST_MAIN() 매크로는 모든 테스트 함수를 실행하는 간단한 main() 메서드로 확장되며, 테스트 클래스의 선언과 구현이 모두 .cpp 파일에 있으므로 Qt의 인트로스펙션이 작동하도록 생성된 moc 파일도 포함해야 합니다.
실행 파일 빌드
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를 사용합니다:
ninjaqmake를 사용한 빌드
.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.