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

本書に含まれる文書の著作権はそれぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。