J'utilise une variante de la réponse de richq. Au niveau supérieur CMakeLists.txt
, j'ajoute une cible personnalisée,, build_and_test
pour créer et exécuter tous les tests:
find_package(GTest)
if (GTEST_FOUND)
enable_testing()
add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
add_subdirectory(test)
endif()
Dans les différents CMakeLists.txt
fichiers de sous-projets ci- dessous test/
, j'ajoute chaque exécutable de test en tant que dépendance de build_and_test
:
include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)
Avec cette approche, j'ai juste besoin de le faire make build_and_test
au lieu de make test
(ou make all test
), et cela a l'avantage de créer uniquement du code de test (et ses dépendances). C'est dommage que je ne puisse pas utiliser le nom de la cible test
. Dans mon cas, ce n'est pas si mal parce que j'ai un script de haut niveau qui débogue et publie hors de l'arbre (et compilé de manière croisée) en appelant cmake
et ensuite make
, et cela se traduit test
par build_and_test
.
De toute évidence, les éléments GTest ne sont pas nécessaires. Il se trouve que j'utilise / aime Google Test, et je voulais partager un exemple complet de son utilisation avec CMake / CTest. À mon humble avis, cette approche a également l'avantage de me permettre d'utiliser ctest -V
, ce qui montre la sortie de Google Test pendant que les tests s'exécutent:
1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN ] proj1.dummy
1: [ OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [ PASSED ] 1 test.
1/2 Test #1: proj1_test ....................... Passed 0.03 sec