第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イベントを格納できます。
現在のデータ関数では、2つのQTestEventList 要素を作成します。最初のリストは、「a」キーを1回クリックするイベントで構成されています。QTestEventList::addKeyClick()関数を使用して、このイベントをリストに追加します。次に、QTest::newRow()関数を使用してデータセットに名前を付け、イベントリストと期待される結果をテーブルにストリーム入力します。
2つ目のリストは、2回のキー入力(「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() 関数は 2 回実行されます。これは、関連する TestGui::testGui_data() 関数で作成したテストデータの各エントリに対して 1 回ずつ実行されるためです。
まず、QFETCH() マクロを使用して、データセットの 2 つの要素を取得します。QFETCH() には、要素のデータ型と要素名の 2 つの引数が渡されます。次に、QLineEdit を作成し、QTestEventList::simulate() 関数を使用して、そのウィジェットにイベントのリストを適用します。
最後に、QCOMPARE() マクロを使用して、ラインエディットのテキストが期待どおりかどうかを確認します。
スタンドアロン実行ファイルの準備
以前と同様に、テストケースをスタンドアロンの実行可能ファイルにするには、次の2行が必要です:
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.