Sur cette page

Qt Quick Test

Introduction

Qt Quick Test est un cadre de test unitaire pour les applications QML. Les cas de test sont écrits sous forme de fonctions JavaScript à l'intérieur d'un type TestCase:

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

Les fonctions dont le nom commence par test_ sont considérées comme des cas de test à exécuter. Voir la documentation des types TestCase et SignalSpy pour plus d'informations sur l'écriture des cas de test.

Note : Il n'y a pas de garantie de compatibilité binaire pour le module Qt Quick Test. Cela signifie qu'une application qui utilise Qt Quick Test n'est garantie de fonctionner qu'avec la version de Qt Test avec laquelle elle a été développée. Cependant, la compatibilité des sources est garantie.

Utilisation du module

API QML

Les types QML de Qt Quick Test sont disponibles par le biais de l'importation QtTest. Pour utiliser les types, ajoutez l'instruction d'importation suivante à votre fichier .qml :

import QtTest

API C++

L'utilisation du site C++ API nécessite l'établissement d'un lien avec la bibliothèque de modules, soit directement, soit par l'intermédiaire d'autres dépendances. Plusieurs outils de construction disposent d'un support dédié à cet effet, notamment CMake et qmake.

Construction avec CMake

Utilisez la commande find_package() pour localiser les composants des modules nécessaires dans le paquetage Qt6 :

find_package(Qt6 REQUIRED COMPONENTS QuickTest)
target_link_libraries(mytarget PRIVATE Qt6::QuickTest)

Voir aussi l'aperçu de la construction avec CMake.

Construire avec qmake

Il y a deux façons d'établir un lien avec la bibliothèque C++ correspondante. Si votre projet de test utilise un QML TestCase, vous devriez déjà avoir la ligne suivante dans votre fichier de projet :

CONFIG += qmltestcase

Le test sera alors lié à la bibliothèque C++ QtQuickTest.

Si vous avez un projet de test C++ uniquement, vous pouvez ajouter la ligne suivante à votre fichier de projet :

QT += qmltest

Exécution des tests

Les cas de test sont lancés par un harnais C++ composé du code suivant :

#include <QtQuickTest>
QUICK_TEST_MAIN(example)

Où "exemple" est l'identifiant à utiliser pour identifier de manière unique cet ensemble de tests.

Configurez votre fichier CMakeLists.txt et construisez votre projet en utilisant votre générateur préféré.

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
)

Ajoutez CONFIG += qmltestcase à votre fichier de projet :

TEMPLATE = app
TARGET = tst_example
CONFIG += warn_on qmltestcase
SOURCES += tst_example.cpp

Si IMPORTPATH est spécifié dans votre fichier .pro, chaque chemin d'importation ajouté à IMPORTPATH sera transmis en tant qu'argument de ligne de commande lorsque le test est exécuté à l'aide de "make check" :

IMPORTPATH += $$PWD/../imports/my_module1 $$PWD/../imports/my_module2

Le test harness recherche récursivement les fichiers "tst_*.qml" dans le répertoire source spécifié. Si QUICK_TEST_SOURCE_DIR n'est pas défini, le répertoire courant sera analysé lors de l'exécution du harnais. D'autres fichiers *.qml peuvent apparaître pour les composants QML auxiliaires utilisés par le test.

L'option de ligne de commande -input peut être définie au moment de l'exécution pour exécuter les cas de test à partir d'un répertoire différent. Cela peut être nécessaire pour exécuter des tests sur un dispositif cible où le nom du répertoire compilé fait référence à un hôte. C'est le cas par exemple :

tst_example -input /mnt/SDCard/qmltests

Il est également possible d'exécuter un seul fichier à l'aide de l'option -input. Par exemple, il est également possible d'exécuter un seul fichier à l'aide de l'option :

tst_example -input data/test.qml
tst_example -input <full_path>/test.qml

Remarque : la spécification du chemin complet du fichier de test qml est par exemple nécessaire pour les "shadow builds".

Si votre scénario de test nécessite des importations QML, vous pouvez les ajouter en tant qu'options -import à la ligne de commande du programme de test.

L'option de ligne de commande -functions renvoie une liste des fonctions de test en cours. Il est possible d'exécuter une seule fonction de test en utilisant le nom de la fonction de test comme argument. Par exemple, l'option de ligne de commande

tst_example Test_Name::function1

L'option de ligne de commande -help renvoie toutes les options disponibles.

tst_example -help

Note : L'exécution d'un cas de test Qt Quick affichera toujours une fenêtre à l'écran, même si le code de test n'implique pas d'interface utilisateur rapide. Pour éviter cela, exécutez l'exécutable de test avec -platform offscreen.

Exécution du code C++ avant les tests QML

La macro QUICK_TEST_MAIN_WITH_SETUP peut être utilisée pour exécuter du code C++ avant l'exécution d'un test QML. Cela peut s'avérer utile pour définir les propriétés du contexte sur le moteur QML, entre autres choses.

La macro est identique à QUICK_TEST_MAIN, sauf qu'elle prend un argument de type supplémentaire. Le cadre de test appellera les slots et les fonctions invocables avec les noms suivants :

NomObjectifDepuis
void applicationAvailable()Appelée juste après l'instanciation de l'objet QApplication. Utilisez cette fonction pour effectuer une configuration qui ne nécessite pas d'instance QQmlEngine.Qt 5.12
void qmlEngineAvailable(QQmlEngine *)Appelée lorsque le moteur QML est disponible. Tous les import paths, plugin paths, et extra file selectors auront été définis sur le moteur à ce moment-là.

Cette fonction est appelée une fois pour chaque fichier de test QML, de sorte que tous les arguments sont uniques pour ce test. Par exemple, cela signifie que chaque fichier de test QML aura son propre moteur QML.

Cette fonction peut être utilisée pour enregistrer les types QML et add import paths, entre autres choses.

Qt 5.11
void cleanupTestCase()Appelée juste après la fin de l'exécution du test. Utilisez cette fonction pour faire le ménage avant que tout ne commence à être détruit.Qt 5.12

L'exemple suivant montre comment la macro peut être utilisée pour définir les propriétés du contexte sur le moteur QML :

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

L'inclusion .moc est basée sur le nom du fichier .cpp. Par exemple, dans l'exemple ci-dessus, le fichier .cpp est nommé src_qmltest_qquicktest.cpp. Si le fichier s'appelait MyTest.cpp, l'inclusion serait :

#include "MyTest.moc"

Référence

Licences

Qt Quick Qt Test est disponible sous licence commerciale auprès de The Qt Company. En outre, il est disponible sous des licences de logiciel libre. Depuis Qt 5.4, ces licences de logiciel libre sont la GNU Lesser General Public License, version 3, ou la GNU General Public License, version 2. Voir Qt Licensing pour plus de détails.

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