Sur cette page

Chapitre 1 : Écrire un test unitaire

Ce premier chapitre montre comment écrire un test unitaire simple et comment exécuter le cas de test en tant qu'exécutable autonome.

Écrire un test

Supposons que vous souhaitiez tester le comportement de notre classe QString. Tout d'abord, vous avez besoin d'une classe qui contient vos fonctions de test. Cette classe doit hériter de QObject:

#include <QTest>

class TestQString: public QObject
{
    Q_OBJECT
private slots:
    void toUpper();
};

Remarque : vous devez inclure l'en-tête QTest et déclarer les fonctions de test comme des slots privés afin que le framework de test les trouve et les exécute.

Vous devez ensuite implémenter la fonction de test elle-même. L'implémentation pourrait ressembler à ceci :

void TestQString::toUpper()
{
    QString str = "Hello";
    QVERIFY(str.toUpper() == "HELLO");
}

La macro QVERIFY() évalue l'expression passée en argument. Si l'expression est évaluée comme vraie, l'exécution de la fonction de test se poursuit. Dans le cas contraire, un message décrivant l'échec est ajouté au journal de test et la fonction de test cesse de s'exécuter.

Toutefois, si vous souhaitez obtenir un message plus détaillé dans le journal des tests, vous devez plutôt utiliser la macro QCOMPARE() :

void TestQString::toUpper()
{
    QString str = "Hello";
    QCOMPARE(str.toUpper(), QString("HELLO"));
}

Si les chaînes ne sont pas égales, le contenu des deux chaînes est ajouté au journal de test, ce qui permet de voir immédiatement pourquoi la comparaison a échoué.

Préparation de l'exécutable autonome

Enfin, pour faire de notre scénario de test un exécutable autonome, les deux lignes suivantes sont nécessaires :

QTEST_MAIN(TestQString)
#include "testqstring.moc"

La macro QTEST_MAIN() se développe en une simple méthode main() qui exécute toutes les fonctions de test. Notez que si la déclaration et l'implémentation de notre classe de test sont dans un fichier .cpp, nous devons également inclure le fichier moc généré pour que l'introspection de Qt Test fonctionne.

Création de l'exécutable

Vous pouvez construire l'exécutable du cas de test en utilisant CMake ou qmake.

Construire avec CMake

Configurez vos paramètres de construction dans votre fichier CMakeLists.txt :

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

cmake_minimum_required(VERSION 3.16)
project(tutorial1 LANGUAGES CXX)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)

qt_standard_project_setup()

qt_add_executable(tutorial1
    testqstring.cpp
)

set_target_properties(tutorial1 PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

target_link_libraries(tutorial1 PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Test
    Qt6::Widgets
)

install(TARGETS tutorial1
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

qt_generate_deploy_app_script(
    TARGET tutorial1
    OUTPUT_SCRIPT deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})

Ensuite, à partir de la ligne de commande, exécutez cmake ou utilisez le script de commodité qt-cmake situé dans Qt-prefix/<version>/<platform>/bin/qt-cmake:

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

Ensuite, lancez votre outil de génération préféré pour construire l'exécutable. Ici, nous utilisons Ninja :

ninja

Construire avec qmake

Configurez vos paramètres de construction dans votre fichier .pro:

QT += widgets testlib

SOURCES = testqstring.cpp

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

Ensuite, exécutez qmake, et enfin, exécutez make pour construire votre exécutable :

qmake
make

Note : Si vous utilisez Windows, remplacez make par nmake ou tout autre outil de construction que vous utilisez.

Exécution de l'exécutable

L'exécution de l'exécutable résultant devrait vous donner la sortie suivante :

********* Start testing of TestQString *********
Config: Using QtTest library %VERSION%, Qt %VERSION%
PASS   : TestQString::initTestCase()
PASS   : TestQString::toUpper()
PASS   : TestQString::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of TestQString *********

Félicitations ! Vous venez d'écrire et d'exécuter votre premier test unitaire en utilisant le framework Qt Test.

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