CMake y CTest: la prueba de prueba no genera pruebas

Estoy probando CTest en CMake para ejecutar automáticamente algunas de mis pruebas usando make test target. El problema es que CMake no “entiende” que la prueba que estoy dispuesto a ejecutar tiene que ser construida ya que es parte del proyecto.

Así que estoy buscando una forma de especificar explícitamente esta dependencia.

Es discutible un error en CMake (rastreado anteriormente aquí ) que esto no funciona de la caja. Una solución alternativa es hacer lo siguiente:

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

Luego puede ejecutar make check y comstackrá y ejecutará la prueba. Si tiene varias pruebas, entonces deberá usar DEPENDS exe1 exe2 exe3 ... en la línea anterior.

En realidad, hay una forma de usar make test . Debe definir la comstackción del ejecutable de prueba como una de las pruebas y luego agregar dependencias entre las pruebas. Es decir:

 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) 

Yo uso una variante de la respuesta de richq. En el CMakeLists.txt nivel CMakeLists.txt , agrego un destino personalizado, build_and_test , para build_and_test y ejecutar todas las pruebas:

 find_package(GTest) if (GTEST_FOUND) enable_testing() add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V) add_subdirectory(test) endif() 

En los diversos subproyectos CMakeLists.txt archivos bajo test/ , agrego cada ejecutable de prueba como una dependencia 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) 

Con este enfoque, solo necesito make build_and_test lugar de make test (o make all test ), y tiene el beneficio de solo construir código de prueba (y sus dependencias). Es una pena que no pueda usar la test nombre de destino. En mi caso, no es tan malo porque tengo una secuencia de comandos de nivel superior que realiza comstackciones de depuración y liberación fuera de árbol (y comstackción cruzada) llamando a cmake y luego a make , y traduce la test en build_and_test .

Obviamente, las cosas de GTest no son necesarias. Simplemente uso / me gusta Google Test y quería compartir un ejemplo completo de su uso con CMake / CTest. En mi humilde opinión, este enfoque también tiene la ventaja de permitirme usar ctest -V , que muestra el resultado de la Prueba de Google mientras se ejecutan las pruebas:

 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 

Si está tratando de emular la make check , puede encontrar útil esta entrada en la wiki:

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

Acabo de verificar que es lo que dice con éxito (CMake 2.8.10).

Ahórrate el dolor de cabeza:

 make all test 

Funciona de manera automática y creará dependencias antes de ejecutar la prueba. Dado lo simple que es esto, casi hace que la funcionalidad de make test nativa de make test práctica porque le da la opción de ejecutar las últimas pruebas de comstackción, incluso si su código está roto.

Todas las respuestas anteriores son perfectas. Pero en realidad CMake usa CTest como sus herramientas de prueba, entonces el método estándar (creo que es) para hacer la misión es:

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

Luego ejecute cmake y make para construir los objectives. Después de eso, puedes ejecutar make test o simplemente ejecutar

 ctest 

obtendrás el resultado. Esto se prueba bajo CMake 2.8.

Consulte los detalles en: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing

Todas las respuestas son buenas, pero implican una violación de la tradición para ejecutar una prueba por comando make test . He hecho este truco:

 add_test(NAME  WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND sh -c "make ; $>") 

Esto significa que la prueba consiste en construir (opcionalmente) y ejecutar un objective ejecutable.