第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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。