第3章 GUIイベントのシミュレーション

Qt Test には、グラフィカル・ユーザー・インターフェースをテストするためのいくつかのメカニズムがあります。ネイティブのウィンドウシステムのイベントをシミュレートする代わりに、Qt Test は Qt の内部イベントを送信します。つまり、テストが実行されているマシンには副作用がありません。

この章では、簡単な GUI テストを書く方法を示します。

GUIテストを書く

今回は、QLineEdit クラスの動作をテストしたいとします。前回と同じように、テスト関数を含むクラスが必要です:

#include <QtWidgets>
#include <QTest>

class TestGui: public QObject
{
    Q_OBJECT

private slots:
    void testGui();

};

唯一の違いは、QTest ネームスペースに加えて、Qt GUI クラス定義も含める必要があることです。

void TestGui::testGui()
{
    QLineEdit lineEdit;

    QTest::keyClicks(&lineEdit, "hello world");

    QCOMPARE(lineEdit.text(), QString("hello world"));
}

テスト関数の実装では、まず、QLineEdit を作成します。次に、QTest::keyClicks() 関数を使用して、"hello world "を行編集で書くことをシミュレートします。

注意: キーボード・ショートカットを正しくテストするためには、ウィジェットも表示されなければなりません。

QTest::keyClicks()は、ウィジェット上で一連のキーをクリックすることをシミュレートします。オプションで、キーボード修飾子や、各キーをクリックした後のテストの遅延(ミリ秒)を指定することができます。同様に、QTest::keyClick ()、QTest::keyPress ()、QTest::keyRelease ()、QTest::mouseClick ()、QTest::mouseDClick ()、QTest::mouseMove ()、QTest::mousePress ()、QTest::mouseRelease ()関数を使用して、関連するGUIイベントをシミュレートできます。

最後に、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(tutorial3 LANGUAGES CXX)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)

qt_standard_project_setup()

qt_add_executable(tutorial3
    testgui.cpp
)

set_target_properties(tutorial3 PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

target_link_libraries(tutorial3 PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Test
    Qt6::Widgets
)

install(TARGETS tutorial3
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

qt_generate_deploy_app_script(
    TARGET tutorial3
    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/tutorial3
INSTALLS += target

次にqmake を実行し、最後にmake を実行して実行ファイルをビルドします:

qmake
make

実行ファイルの実行

出来上がった実行ファイルを実行すると、以下のような出力が得られるはずだ:

********* Start testing of TestGui *********
Config: Using QtTest library %VERSION%, Qt %VERSION%
PASS   : TestGui::initTestCase()
PASS   : TestGui::testGui()
PASS   : TestGui::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted, 20ms
********* Finished testing of TestGui **

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