J'ai récemment été convaincu d'utiliser CMake pour compiler mes projets C++, et j'aimerais maintenant commencer à écrire des tests unitaires pour mon code. J'ai décidé d'utiliser l'utilitaire Google Test pour m'aider dans cette tâche, mais j'ai besoin d'aide pour commencer.
Toute la journée, j'ai lu différents guides, parmi lesquels le L'abécédaire , un introduction chez IBM et quelques questions sur le SO ( ici y ici ) ainsi que d'autres sources dont j'ai perdu la trace. Je sais qu'il y a beaucoup de choses à faire, mais j'ai toujours des difficultés.
J'essaie actuellement de mettre en place le test le plus basique, pour confirmer que j'ai bien compilé/installé gtest et qu'il ne fonctionne pas. Le seul fichier source (testgtest.cpp) est tiré presque exactement de cette réponse précédente :
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
et mon fichier CMakeLists.txt associé est le suivant :
cmake_minimum_required(VERSION 2.6)
project(basic_test)
# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})
# Add test cpp file
add_executable(runUnitTests
testgtest.cpp
)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})
add_test(
NAME runUnitTests
COMMAND runUnitTests
)
Notez que j'ai choisi de faire un lien avec gtest_main au lieu de fournir le main à la fin du fichier cpp, car je pense que cela me permettra d'étendre plus facilement les tests à plusieurs fichiers.
Lors de la construction du fichier .sln généré (dans Visual C++ 2010 Express), j'obtiens malheureusement une longue liste d'erreurs de la forme suivante
2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)
ce qui signifie, je pense, que je ne réussis pas à lier les bibliothèques gtest. Je me suis assuré que lors de l'édition de liens avec les bibliothèques de débogage, j'ai essayé de construire en mode débogage.
EDIT
Après avoir creusé un peu plus, je pense que mon problème est lié au type de bibliothèque dans laquelle je construis gtest. Lorsque je compile gtest avec CMake, si BUILD_SHARED_LIBS
n'est pas coché, et si j'associe mon programme à ces fichiers .lib, j'obtiens les erreurs mentionnées ci-dessus. Cependant, si l'option BUILD_SHARED_LIBS
est coché, je produis un ensemble de fichiers .lib et .dll. Lors de l'édition de liens avec ces fichiers .lib, le programme se compile, mais lorsqu'il est exécuté, il se plaint de ne pas trouver gtest.dll.
Quelles sont les différences entre un SHARED
et un pas SHARED
et si je choisis de ne pas partager, pourquoi cela ne fonctionne-t-il pas ? Est-ce qu'il y a une option dans le CMakeLists.txt pour mon projet que j'ai manqué ?
4 votes
Vous pouvez éviter d'inclure les sources GTest dans les vôtres en utilisant
ExternalProject_Add
plutôt queadd_subdirectory
. Voir cette réponse pour plus de détails.0 votes
Pourquoi avons-nous accès à ${gtest_SOURCE_DIR} dans l'exemple de solution ci-dessus ? Comment/où cette variable est-elle déclarée ?
0 votes
Oh c'est déclaré dans gtest-1.6.0/CMakeLists.txt : "project(gtest CXX C)" qui rend les variables gtest_SOURCE_DIR et gtest_BINARY_DIR disponibles.
2 votes
Qu'est-ce que
enable_testing()
faire ?0 votes
Au lieu de répondre dans l'edit, mettre la solution dans une réponse, et l'accepter
2 votes
@updogliu : Il active ctest et la cible 'test' (ou 'RUN_TESTS'). Elle joue avec la commande cmake add_test().