Qt Quick Test
Einführung
Qt Quick Test ist ein Unit-Test-Framework für QML-Anwendungen. Testfälle werden als JavaScript-Funktionen innerhalb eines TestCase -Typs geschrieben:
import QtQuick 2.3 import QtTest 1.0 TestCase { name: "MathTests" function test_math() { compare(2 + 2, 4, "2 + 2 = 4") } function test_fail() { compare(2 + 2, 5, "2 + 2 = 5") } }
Funktionen, deren Namen mit test_
beginnen, werden als auszuführende Testfälle behandelt. Weitere Informationen zum Schreiben von Testfällen finden Sie in der Dokumentation zu den Typen TestCase und SignalSpy.
Hinweis: Es gibt keine Binärkompatibilitätsgarantie für das Modul Qt Quick Test. Das bedeutet, dass eine Anwendung, die Qt Quick Test verwendet, garantiert nur mit der Qt-Version funktioniert, für die sie entwickelt wurde. Die Quellcode-Kompatibilität ist jedoch gewährleistet.
Verwendung des Moduls
QML-API
Die QML-Typen in Qt Quick Test sind über den QtTest
-Import verfügbar. Um die Typen zu verwenden, fügen Sie die folgende Importanweisung in Ihre .qml-Datei ein:
import QtTest
C++ API
Die Verwendung von C++ API erfordert das Linken gegen die Modulbibliothek, entweder direkt oder über andere Abhängigkeiten. Mehrere Build-Tools haben spezielle Unterstützung für diese Aufgabe, einschließlich CMake und qmake.
Bauen mit CMake
Verwenden Sie den Befehl find_package()
, um die benötigten Modulkomponenten im Qt6-Paket zu finden:
find_package(Qt6 REQUIRED COMPONENTS QuickTest) target_link_libraries(mytarget PRIVATE Qt6::QuickTest)
Siehe auch die Übersicht Bauen mit CMake.
Bauen mit qmake
Es gibt zwei Möglichkeiten, gegen die entsprechende C++-Bibliothek zu linken. Wenn Ihr Testprojekt eine QML TestCase verwendet, sollten Sie bereits die folgende Zeile in Ihrer Projektdatei haben:
CONFIG += qmltestcase
Dadurch wird der Test mit der C++-Bibliothek QtQuickTest verknüpft.
Wenn Sie ein reines C++-Testprojekt haben, können Sie die folgende Zeile zu Ihrer Projektdatei hinzufügen:
QT += qmltest
Tests ausführen
Die Testfälle werden von einem C++-Kabelbaum gestartet, der aus folgendem Code besteht:
#include <QtQuickTest> QUICK_TEST_MAIN(example)
Wobei "example" der Bezeichner ist, der zur eindeutigen Identifizierung dieses Testsatzes verwendet wird.
Konfigurieren Sie Ihre CMakeLists.txt-Datei und erstellen Sie Ihr Projekt mit Ihrem bevorzugten Generator.
cmake_minimum_required(VERSION 3.2) project(tst_example LANGUAGES CXX) enable_testing() find_package(Qt6 REQUIRED COMPONENTS QuickTest Qml) #[[The test harness scans the specified source directory recursively for "tst_*.qml" files. By default, it looks in the current directory, which is usually where the executable is. This command makes it look in the project's source directory instead.]] add_definitions(-DQUICK_TEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}") qt_standard_project_setup(REQUIRES 6.6) add_executable(tst_example tst_example.cpp) add_test(NAME tst_example COMMAND tst_example) target_link_libraries(tst_example PRIVATE Qt6::QuickTest Qt6::Qml )
Fügen Sie CONFIG += qmltestcase
zu Ihrer Projektdatei hinzu:
TEMPLATE = app TARGET = tst_example CONFIG += warn_on qmltestcase SOURCES += tst_example.cpp
Wenn IMPORTPATH
in Ihrer .pro-Datei angegeben ist, wird jeder zu IMPORTPATH
hinzugefügte Importpfad als Befehlszeilenargument übergeben, wenn der Test mit "make check" ausgeführt wird:
IMPORTPATH += $$PWD/../imports/my_module1 $$PWD/../imports/my_module2
Das Test-Harness durchsucht das angegebene Quellverzeichnis rekursiv nach "tst_*.qml"-Dateien. Wenn QUICK_TEST_SOURCE_DIR
nicht definiert ist, wird das aktuelle Verzeichnis durchsucht, wenn das Kabelbaumprogramm ausgeführt wird. Andere *.qml-Dateien können für zusätzliche QML-Komponenten erscheinen, die vom Test verwendet werden.
Die Befehlszeilenoption -input
kann zur Laufzeit gesetzt werden, um Testfälle aus einem anderen Verzeichnis auszuführen. Dies kann erforderlich sein, um Tests auf einem Zielgerät auszuführen, bei dem der Name des kompilierten Verzeichnisses auf einen Host verweist. Zum Beispiel:
tst_example -input /mnt/SDCard/qmltests
Es ist auch möglich, eine einzelne Datei mit der Option -input
auszuführen. Ein Beispiel:
tst_example -input data/test.qml
tst_example -input <full_path>/test.qml
Hinweis: Die Angabe des vollständigen Pfads zur qml-Testdatei ist z. B. für Shadow-Builds erforderlich.
Wenn Ihr Testfall QML-Importe benötigt, können Sie diese als -import
Optionen in die Befehlszeile des Testprogramms einfügen.
Die Befehlszeilenoption -functions
gibt eine Liste der aktuellen Testfunktionen zurück. Es ist möglich, eine einzelne Testfunktion auszuführen, indem man den Namen der Testfunktion als Argument angibt. Zum Beispiel:
tst_example Test_Name::function1
Die Befehlszeilenoption -help
gibt alle verfügbaren Optionen zurück.
tst_example -help
Hinweis: Wenn Sie einen Qt Quick Testfall ausführen, wird immer ein Fenster auf dem Bildschirm angezeigt, auch wenn der Testcode keine Quick UI enthält. Um dies zu vermeiden, führen Sie die Testdatei mit -platform offscreen
aus.
Ausführen von C++ vor QML-Tests
Um C++ Code auszuführen, bevor einer der QML-Tests ausgeführt wird, kann das QUICK_TEST_MAIN_WITH_SETUP Makro verwendet werden. Dies kann unter anderem für das Setzen von Kontexteigenschaften auf der QML-Engine nützlich sein.
Das Makro ist identisch mit QUICK_TEST_MAIN
, mit der Ausnahme, dass es ein zusätzliches Typ-Argument benötigt. Das Testframework ruft Slots und aufrufbare Funktionen mit den folgenden Namen auf:
Name | Zweck | Seit |
---|---|---|
void applicationAvailable() | Wird direkt nach der Instanziierung des QApplication-Objekts aufgerufen. Verwenden Sie diese Funktion, um Einstellungen vorzunehmen, die keine QQmlEngine Instanz erfordern. | Qt 5.12 |
void qmlEngineAvailable(QQmlEngine *) | Wird aufgerufen, wenn die QML-Engine verfügbar ist. Alle import paths, plugin paths und extra file selectors werden zu diesem Zeitpunkt auf der Engine eingestellt worden sein. Diese Funktion wird einmal für jede QML-Testdatei aufgerufen, so dass alle Argumente nur für diesen Test gelten. Das bedeutet zum Beispiel, dass jede QML-Testdatei ihre eigene QML-Engine hat. Diese Funktion kann u. a. zur Registrierung von QML-Typen und add import paths verwendet werden. | Qt 5.11 |
void cleanupTestCase() | Wird direkt nach Beendigung der Testausführung aufgerufen. Verwenden Sie diese Funktion, um aufzuräumen, bevor alles zerstört wird. | Qt 5.12 |
Das folgende Beispiel zeigt, wie das Makro verwendet werden kann, um Kontexteigenschaften der QML-Engine zu setzen:
// src_qmltest_qquicktest.cpp #include <QtQuickTest> #include <QQmlEngine> #include <QQmlContext> #include <QGuiApplication> class Setup : public QObject { Q_OBJECT public: Setup() {} public slots: void applicationAvailable() { // Initialization that only requires the QGuiApplication object to be available } void qmlEngineAvailable(QQmlEngine *engine) { // Initialization requiring the QQmlEngine to be constructed engine->rootContext()->setContextProperty("myContextProperty", QVariant(true)); } void cleanupTestCase() { // Implement custom resource cleanup } }; QUICK_TEST_MAIN_WITH_SETUP(mytest, Setup) #include "src_qmltest_qquicktest.moc"
Das Include .moc
basiert auf dem Dateinamen der Datei .cpp
. Im obigen Beispiel heißt die Datei .cpp
beispielsweise src_qmltest_qquicktest.cpp
. Hätte die Datei den Namen MyTest.cpp
, würde das Include lauten:
#include "MyTest.moc"
Referenz
Lizenzen
Qt Quick Tests ist unter kommerziellen Lizenzen von The Qt Company erhältlich. Darüber hinaus ist es unter freien Softwarelizenzen erhältlich. Seit Qt 5.4 sind diese Lizenzen für freie Software die GNU Lesser General Public License, Version 3, oder die GNU General Public License, Version 2. Siehe Qt-Lizenzierung für weitere Details.
© 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.