Auf dieser Seite

Qt Quick Test

Einleitung

Qt Quick Test ist ein Unit-Test-Framework für QML-Anwendungen. Testfälle werden als JavaScript-Funktionen innerhalb eines Objekts vom Typ „ TestCase “ 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: Für das Modul „ Qt Quick Test “besteht keine Garantie für binäre Kompatibilität. Das bedeutet, dass eine Anwendung, die „ Qt Quick Test “ verwendet, nur mit der Qt-Version funktioniert, für die sie entwickelt wurde. Die Quellkompatibilität ist jedoch gewährleistet.

Verwendung des Moduls

QML-API

Die QML-Typen in „ Qt Quick Test “ sind über den Import „ QtTest “ 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 die Verknüpfung mit der Modulbibliothek, entweder direkt oder über andere Abhängigkeiten. Mehrere Build-Tools bieten hierfür spezielle Unterstützung, darunter CMake und qmake.

Erstellen 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 „Erstellen mit CMake “.

Erstellen mit qmake

Es gibt zwei Möglichkeiten, die entsprechende C++-Bibliothek einzubinden. Wenn Ihr Testprojekt eine QML- TestCase verwendet, sollte die folgende Zeile bereits in Ihrer Projektdatei enthalten sein:

CONFIG += qmltestcase

Dadurch wird der Test mit der C++- QtQuickTest -Bibliothek 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

Testfälle werden von einem C++-Harness gestartet, der aus dem folgenden Code besteht:

#include <QtQuickTest>
QUICK_TEST_MAIN(example)

Dabei ist „example“ die Kennung, mit der diese Testreihe eindeutig identifiziert 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

Der Test-Harness durchsucht das angegebene Quellverzeichnis rekursiv nach „tst_*.qml“-Dateien. Ist „ QUICK_TEST_SOURCE_DIR “ nicht definiert, wird beim Ausführen des Harness das aktuelle Verzeichnis durchsucht. Für zusätzliche QML-Komponenten, die vom Test verwendet werden, können weitere *.qml-Dateien vorhanden sein.

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 sich der kompilierte Verzeichnisname auf einen Host bezieht. Zum Beispiel:

tst_example -input /mnt/SDCard/qmltests

Es ist auch möglich, eine einzelne Datei mit der Option „ -input “ auszuführen. 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 beispielsweise für Shadow-Builds erforderlich.

Wenn Ihr Testfall QML-Importe benötigt, können Sie diese als „ -import “-Optionen zur Befehlszeile des Testprogramms hinzufü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: Beim Ausführen eines „ Qt Quick “-Testfalls 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 Testausführungsdatei mit „ -platform offscreen “ aus.

Ausführung von C++ vor QML-Tests

Um C++-Code auszuführen, bevor QML-Tests gestartet werden, kann das Makro „ QUICK_TEST_MAIN_WITH_SETUP “ verwendet werden. Dies kann unter anderem nützlich sein, um Kontexteigenschaften in der QML-Engine festzulegen.

Das Makro ist identisch mit „ QUICK_TEST_MAIN “, nimmt jedoch ein zusätzliches Typargument entgegen. Das Test-Framework ruft Slots und aufrufbare Funktionen mit den folgenden Namen auf:

NameZweckSeit
void applicationAvailable()Wird unmittelbar nach der Instanziierung des `QApplication`-Objekts aufgerufen. Verwenden Sie diese Funktion, um Vorbereitungen durchzuführen, für die keine ` QQmlEngine `-Instanz erforderlich ist.Qt 5.12
void qmlEngineAvailable(QQmlEngine *)Wird aufgerufen, sobald die QML-Engine verfügbar ist. Zu diesem Zeitpunkt sind alle Parameter ` import paths`, ` plugin paths` und ` extra file selectors ` bereits für die Engine festgelegt.

Diese Funktion wird für jede QML-Testdatei einmal aufgerufen, sodass alle Argumente für diesen Test spezifisch sind. Das bedeutet beispielsweise, dass jede QML-Testdatei über eine eigene QML-Engine verfügt.

Diese Funktion kann unter anderem dazu verwendet werden, QML-Typen und „ add import paths “ zu registrieren.

Qt 5.11
void cleanupTestCase()Wird unmittelbar nach Abschluss der Testausführung aufgerufen. Verwenden Sie diese Funktion, um Aufräumarbeiten durchzuführen, bevor mit der Freigabe von Ressourcen begonnen wird.Qt 5.12

Das folgende Beispiel veranschaulicht, wie das Makro verwendet werden kann, um Kontexteigenschaften in der QML-Engine festzulegen:

// 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"

Die Einbindung von „ .moc “ basiert auf dem Dateinamen der Datei „ .cpp “. Im obigen Beispiel heißt die Datei „ .cpp “ beispielsweise „ src_qmltest_qquicktest.cpp “. Hieße die Datei „ MyTest.cpp “, würde die Einbindung wie folgt lauten:

#include "MyTest.moc"

Referenz

Lizenzen

Qt Quick „Qt Test“ ist unter kommerziellen Lizenzen von The Qt Company erhältlich. Darüber hinaus ist es unter freien Softwarelizenzen verfügbar. Seit Qt 5.4 sind diese freien Softwarelizenzen die GNU Lesser General Public License, Version 3, oder die GNU General Public License, Version 2. Weitere Details finden Sie unter Qt-Lizenzierung.

© 2026 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.