Comment utiliser CTest de CMake pour les tests unitaires

Comment utiliser CMake et CTest pour les tests unitaires.
CMake est un outil de génération multiplateforme qui peut générer automatiquement des Makefiles liés à la plate-forme ou des fichiers de projet Visual Studio, simplifiant ainsi le processus de génération de programmes C++. CTest est un outil de test pour CMake, qui peut exécuter automatiquement des tests unitaires, collecter les résultats des tests et générer des rapports.

Voici les étapes pour les tests unitaires avec CMake et CTest :

  • Écrivez le code de programme C++ et le code de test unitaire correspondant.
  • Ajoutez la cible de test (cible de test) et les configurations associées dans le fichier CMakeLists.txt, telles que les options de compilation du code de test, les bibliothèques de liens, etc.
  • Exécutez CMake pour générer des fichiers de projet Makefile ou Visual Studio, y compris des cibles de test.
    Exécutez un outil de génération tel que make ou Visual Studio pour compiler la cible de test.
  • Exécutez la commande ctest pour exécuter automatiquement les tests unitaires et collecter les résultats des tests.
  • CTest peut être utilisé pour générer divers rapports de test, tels que des rapports texte, des rapports XML, des rapports HTML, etc.
  • Pour l'utilisation spécifique de CTest, vous pouvez afficher les informations d'aide de la commande CTest en exécutant "ctest --help".

En général, CMake et CTest peuvent aider les programmeurs C++ à simplifier le processus de construction et de test, et fournissent divers outils pour faciliter la collecte et l'analyse des résultats des tests.
Supposons que nous ayons une fonction C++ simple qui calcule la somme de deux entiers comme suit :

int add(int a, int b) {
    
    
    return a + b;
}

Nous allons écrire un test unitaire pour tester l'exactitude de cette fonction. Créez d'abord un fichier nommé "CMakeLists.txt" dans le répertoire racine du projet et ajoutez le contenu suivant :

# 设置项目名称和版本号
project(my_project VERSION 1.0)

# 添加测试目录
add_subdirectory(tests)

Ensuite, créez un fichier nommé "CMakeLists.txt" dans le répertoire "tests" et ajoutez le contenu suivant :

# 添加测试用例
add_executable(test_add test_add.cpp)

# 链接gtest库
find_package(GTest REQUIRED)
target_link_libraries(test_add GTest::GTest GTest::Main)

# 添加测试
add_test(NAME test_add COMMAND test_add)

Parmi eux, test_add.cpp est le code de cas de test que nous avons écrit, et GTest est la bibliothèque Google Test, qui doit d'abord être installée et configurée. Le contenu de test_add.cpp est le suivant :

#include "gtest/gtest.h"

#include "../add.h"

TEST(addTest, testAdd) {
    
    
    EXPECT_EQ(add(1, 2), 3);
    EXPECT_EQ(add(0, 0), 0);
    EXPECT_EQ(add(-1, 1), 0);
}

int main(int argc, char** argv) {
    
    
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

Parmi eux, add.h est le fichier d'en-tête de fonction que nous avons écrit, qui enregistre la déclaration de la fonction add. Dans le code de test, nous utilisons la macro Google Test EXPECT_EQ pour déterminer si la valeur de retour de la fonction d'ajout est celle attendue.

Enfin, nous pouvons exécuter les commandes suivantes dans le répertoire racine du projet pour générer le Makefile et compiler les cibles de test :

mkdir build && cd build
cmake ..
make

Après avoir exécuté la commande ci-dessus, vous pouvez voir le fichier exécutable généré test_add et le rapport de test dans le répertoire de construction. Nous pouvons exécuter la commande suivante pour exécuter le test et afficher le rapport de test :

ctest

À ce moment, CTest exécutera automatiquement le test test_add et affichera les résultats du test sur le terminal. Si les tests réussissent, la sortie de CTest affichera le message "100% tests réussis". Si un test échoue, CTest affichera les détails de l'échec du test.

Ceci est un exemple simple de test unitaire utilisant CMake et CTest. Il convient de noter qu'en utilisation réelle, des ajustements et des personnalisations appropriés peuvent être nécessaires en fonction des projets et des exigences.

Après avoir exécuté CTest, les informations récapitulatives des résultats de test seront générées, y compris des informations statistiques telles que l'état d'exécution des cas de test, le taux de réussite des cas de test et la durée des cas de test. Si un scénario de test échoue, des informations d'erreur détaillées seront générées pour faciliter le débogage du code pour les utilisateurs.

Voici un exemple simple, en supposant que nous ayons un ensemble de tests nommé example, qui contient deux cas de test addTest et subTest :

$ ctest -R example
Test project /home/user/my_project/build
      Start 1: addTest
 1/2 Test #1: addTest ......................   Passed    0.01 sec
      Start 2: subTest
 2/2 Test #2: subTest ......................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.03 sec

Dans cet exemple, nous utilisons la commande ctest pour exécuter l'exemple de jeu de tests et utilisons l'option -R pour spécifier que seuls les cas de test contenant example dans le nom du test sont exécutés. Les résultats d'exécution montrent que les deux scénarios de test addTest et subTest dans le jeu de test ont réussi le test, le taux de réussite du test est de 100 % et la durée totale est de 0,03 seconde.

Si un cas de test échoue, la sortie ressemblera à ceci :

$ ctest -R example
Test project /home/user/my_project/build
      Start 1: addTest
 1/2 Test #1: addTest ......................***Failed    0.01 sec
      Start 2: subTest
 2/2 Test #2: subTest ......................   Passed    0.01 sec

50% tests passed, 1 tests failed out of 2

Total Test time (real) =   0.03 sec

The following tests FAILED:
          1 - addTest (Failed)

Dans cet exemple, le cas de test addTest dans le jeu de test échoue et imprime un message d'erreur détaillé. Le taux de réussite du test est de 50 % et il prend au total 0,03 seconde.

Guess you like

Origin blog.csdn.net/m0_49302377/article/details/130278449