第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 で再生したりすることができます。

現在のデータ関数では、2つのQTestEventList 要素を作成します。最初のリストは、'a'キーのシングルクリックで構成されます。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()関数は、関連するTestGui::testGui_data()関数で作成したテストデータの各エントリに対して1回ずつ、計2回実行されます。

まず、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を使っています:

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 *********

© 2025 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.