Kapitel 3: GUI-Ereignisse simulieren
Qt Test bietet einige Mechanismen zum Testen grafischer Benutzeroberflächen. Anstelle der Simulation von nativen Fenstersystem-Ereignissen sendet Qt Test interne Qt-Ereignisse. Das bedeutet, dass es keine Nebeneffekte auf dem Rechner gibt, auf dem die Tests laufen.
Dieses Kapitel zeigt, wie man einen einfachen GUI-Test schreibt.
Schreiben eines GUI-Tests
Diesmal nehmen wir an, dass Sie das Verhalten unserer Klasse QLineEdit testen wollen. Wie zuvor benötigen Sie eine Klasse, die Ihre Testfunktion enthält:
#include <QtWidgets> #include <QTest> class TestGui: public QObject { Q_OBJECT private slots: void testGui(); };
Der einzige Unterschied besteht darin, dass Sie zusätzlich zum Namespace QTest auch die Klassendefinitionen von Qt GUI einbeziehen müssen.
void TestGui::testGui() { QLineEdit lineEdit; QTest::keyClicks(&lineEdit, "hello world"); QCOMPARE(lineEdit.text(), QString("hello world")); }
In der Implementierung der Testfunktion erstellen wir zunächst ein QLineEdit und simulieren dann mit der Funktion QTest::keyClicks() das Schreiben von "hello world" in der Editierzeile.
Hinweis: Das Widget muss ebenfalls angezeigt werden, um die Tastenkombinationen korrekt testen zu können.
QTest::keyClicks() simuliert das Klicken einer Reihe von Tasten auf einem Widget. Optional kann ein Tastaturmodifikator sowie eine Verzögerung (in Millisekunden) des Tests nach jedem Tastenklick angegeben werden. In ähnlicher Weise können Sie die Funktionen QTest::keyClick(), QTest::keyPress(), QTest::keyRelease(), QTest::mouseClick(), QTest::mouseDClick(), QTest::mouseMove(), QTest::mousePress() und QTest::mouseRelease() verwenden, um die entsprechenden GUI-Ereignisse zu simulieren.
Schließlich verwenden wir das Makro QCOMPARE(), um zu prüfen, ob der Text der Eingabezeile 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(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})Führen Sie dann von der Kommandozeile 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/tutorial3 INSTALLS += target
Führen Sie anschließend 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:
© 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.