Kapitel 4: Wiedergabe von GUI-Ereignissen

In diesem Kapitel wird gezeigt, wie man ein GUI-Ereignis simuliert und wie man eine Reihe von GUI-Ereignissen speichert und sie auf einem Widget wiedergibt.

Der Ansatz, eine Reihe von Ereignissen zu speichern und wiederzugeben, ist dem in Kapitel 2 erläuterten Ansatz sehr ähnlich. Alles, was Sie tun müssen, ist, eine Datenfunktion zu Ihrer Testklasse hinzuzufügen:

class TestGui: public QObject
{
    Q_OBJECT

private slots:
    void testGui_data();
    void testGui();
};

Schreiben der Datenfunktion

Wie zuvor trägt die zugehörige Datenfunktion einer Testfunktion denselben Namen, angehängt an _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 << "";
}

Zunächst definieren wir die Elemente der Tabelle mit Hilfe der Funktion QTest::addColumn(): Eine Liste von GUI-Ereignissen und das erwartete Ergebnis der Anwendung der Liste von Ereignissen auf eine QWidget. Beachten Sie, dass der Typ des ersten Elements QTestEventList ist.

Ein QTestEventList kann mit GUI-Ereignissen gefüllt werden, die als Testdaten für eine spätere Verwendung gespeichert oder auf einem beliebigen QWidget wiedergegeben werden können.

In unserer aktuellen Datenfunktion erstellen wir zwei QTestEventList Elemente. Die erste Liste besteht aus einem einzelnen Klick auf die Taste "a". Wir fügen das Ereignis mit der Funktion QTestEventList::addKeyClick() in die Liste ein. Anschließend geben wir dem Datensatz mit der Funktion QTest::newRow() einen Namen und übertragen die Ereignisliste und das erwartete Ergebnis in die Tabelle.

Die zweite Liste besteht aus zwei Tastenklicks: ein "a" mit einem anschließenden "Backspace". Auch hier verwenden wir die Funktion QTestEventList::addKeyClick(), um die Ereignisse zur Liste hinzuzufügen, und QTest::newRow(), um die Ereignisliste und das erwartete Ergebnis in die Tabelle mit einem zugehörigen Namen zu übertragen.

Umschreiben der Testfunktion

Unser Test kann nun umgeschrieben werden:

void TestGui::testGui()
{
    QFETCH(QTestEventList, events);
    QFETCH(QString, expected);

    QLineEdit lineEdit;

    events.simulate(&lineEdit);

    QCOMPARE(lineEdit.text(), expected);
}

Die Funktion TestGui::testGui() wird zweimal ausgeführt, einmal für jeden Eintrag in den Testdaten, die wir mit der zugehörigen Funktion TestGui::testGui_data() erstellt haben.

Zunächst werden die beiden Elemente des Datensatzes mit dem Makro QFETCH() abgerufen. QFETCH() nimmt zwei Argumente entgegen: den Datentyp des Elements und den Namen des Elements. Dann erstellen wir ein QLineEdit und wenden die Liste der Ereignisse mit der Funktion QTestEventList::simulate() auf dieses Widget an.

Schließlich verwenden wir das Makro QCOMPARE(), um zu prüfen, ob der Text der Zeilenbearbeitung wie erwartet ist.

Vorbereiten der eigenständigen ausführbaren Datei

Um unseren Testfall in eine eigenständige ausführbare Datei zu verwandeln, sind die folgenden zwei Zeilen erforderlich:

QTEST_MAIN(TestGui)
#include "testgui.moc"

Das QTEST_MAIN()-Makro wird zu einer einfachen main()-Methode, die alle Testfunktionen ausführt, und da sich sowohl die Deklaration als auch die Implementierung unserer Testklasse in einer .cpp-Datei befinden, müssen wir auch die generierte moc-Datei einschließen, damit die Introspektion von Qt funktioniert.

Erstellen der ausführbaren Datei

Sie können die ausführbare Datei des Testfalls mit CMake oder qmake erstellen.

Bauen mit CMake

Konfigurieren Sie Ihre Build-Einstellungen in Ihrer CMakeLists.txt-Datei:

# 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})

Führen Sie dann von der Befehlszeile aus entweder cmake aus oder verwenden Sie das Skript qt-cmake, das sich in Qt-prefix/<version>/<platform>/bin/qt-cmake befindet:

<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja

Führen Sie dann Ihr bevorzugtes Generatorwerkzeug aus, um die ausführbare Datei zu erstellen. Hier verwenden wir Ninja:

ninja

Bauen mit qmake

Konfigurieren Sie Ihre Build-Einstellungen in Ihrer .pro Datei:

QT += widgets testlib

SOURCES = testgui.cpp

# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial4
INSTALLS += target

Führen Sie dann qmake und schließlich make aus, um Ihre ausführbare Datei zu erstellen:

qmake
make

Ausführen der ausführbaren Datei

Wenn Sie die resultierende ausführbare Datei ausführen, sollten Sie die folgende Ausgabe erhalten:

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