98 votes

CMake & CTest: make test ne construit pas de tests

J'essaie CTest dans CMake afin d'exécuter automatiquement certains de mes tests en utilisant la cible make test . Le problème est que CMake ne "comprend" pas que le test que je suis prêt à exécuter doit être construit car il fait partie du projet.

Je cherche donc un moyen de spécifier explicitement cette dépendance.

90voto

richq Points 29694

C’est sans doute un bogue dans CMake que cela ne fonctionne pas immédiatement. Une solution de contournement consiste à effectuer les opérations suivantes:

 add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
                  DEPENDS ExeName)
 

Ensuite, vous pouvez exécuter make check et il va compiler et exécuter le test. Si vous avez plusieurs tests, vous devrez alors utiliser DEPENDS exe1 exe2 exe3 ... dans la ligne ci-dessus.

57voto

Iakov Points 121

Il y a en fait un moyen d'utiliser "make test". Vous devez définir la construction de l'exécutable de test comme l'un des tests, puis ajouter des dépendances entre les tests. C'est:

 ADD_TEST(ctest_build_test_code "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target test_code)
ADD_TEST(ctest_run_test_code test_code)
SET_TESTS_PROPERTIES ( ctest_run_test_code PROPERTIES DEPENDS ctest_build_test_code)
 

14voto

Trevor Robinson Points 3657

J'utilise une variante de richq de réponse. Dans le premier niveau, CMakeLists.txt,- je ajouter une cible personnalisée, build_and_test, pour la construction et l'exécution de 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érentes sous-projet CMakeLists.txt fichiers en vertu de l' test/,- je ajouter chaque test exécutables comme une dépendance de l' 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 d' make build_and_test au lieu de make test (ou make all test), et il a l'avantage de seul bâtiment le code de test (et ses dépendances). C'est une honte je ne peux pas utiliser le nom de la cible test. Dans mon cas, c'est pas si mal parce que j'ai un script de niveau supérieur qui n'hors de l'arbre de debug et release (et cross-compilé), construit en appelant cmake puis make, et il traduit test en build_and_test.

De toute évidence, la GTest choses n'est pas nécessaire. Je viens de passer à utiliser/comme Google Test, et je voulais partager un exemple complet de l'utiliser avec CMake/CTest. À mon humble avis, cette approche a aussi l'avantage de me permettre d'utiliser ctest -V, ce qui montre le Google Test de sortie, tandis que l'exécution des tests:

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

6voto

Samuel Points 36

Si vous essayez d'émuler make check , vous pouvez trouver cette entrée de wiki utile:

http://www.cmake.org/Wiki/CMakeEmulateMakeCheck

Je viens de vérifier que cela fait ce qu'il dit avec succès (CMake 2.8.10).

-4voto

holmescn Points 80

Toutes les réponses ci-dessus sont parfaits. Mais en réalité, CMake utilisation CTest que ses outils de test, de sorte que la méthode standard (je pense que c'est) pour faire la mission est:

enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)

Ensuite, exécutez cmake et faire construire les objectifs. Après cela, vous pouvez soit exécuter make test, ou tout simplement courir

ctest

vous obtiendrez le résultat. C'est testé sous CMake 2.8 .

Vérifiez les détails au: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X