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 vous aider, mais j'ai besoin d'aide pour démarrer.
Toute la journée, j'ai lu divers guides et exemples dont le Primer , une introduction chez IBM et quelques questions sur SO ( ici et ici ) ainsi que d'autres sources dont j'ai perdu la trace. Je me rends compte qu'il y en a beaucoup là-bas, mais d'une manière ou d'une autre, j'ai encore des difficultés.
J'essaie actuellement d'implémenter le test le plus basique, pour confirmer que j'ai compilé / installé gtest correctement et que cela 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 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 créer un lien avec gtest_main au lieu de fournir le principal à la fin du fichier cpp car je pense que cela me permettra de faire évoluer les tests plus facilement vers 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 du formulaire
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, je pense, signifie que je ne parviens pas à établir une liaison avec les bibliothèques gtest. Je me suis assuré que lors de la liaison avec les bibliothèques de débogage, j'ai ensuite essayé de construire en mode débogage.
ÉDITER
Après avoir creusé davantage, je pense que mon problème est lié au type de bibliothèque dans laquelle je construis gtest. Lors de la construction de gtest avec CMake, si elle BUILD_SHARED_LIBS
n'est pas cochée, et que je lie mon programme à ces fichiers .lib, j'obtiens les erreurs mentionnées ci-dessus. Cependant, si BUILD_SHARED_LIBS
est coché, je produis un ensemble de fichiers .lib et .dll. Lors de la liaison avec ces fichiers .lib, le programme se compile, mais lors de l'exécution se plaint qu'il ne peut pas trouver gtest.dll.
Quelles sont les différences entre une bibliothèque SHARED
et une SHARED
bibliothèque not , et si je choisis non partagé, pourquoi cela ne fonctionne-t-il pas? Y a-t-il une option dans le CMakeLists.txt pour mon projet qui me manque?
enable_testing()
-on?
ExternalProject_Add
plutôt queadd_subdirectory
. Voir cette réponse pour plus de détails.