dependencies - CMake y CTest: la prueba de prueba no genera pruebas
(7)
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.
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 compilación, incluso si su código está roto.
En realidad, hay una forma de usar make test
. Debe definir la compilació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)
Es discutible un error en CMake (rastreado anteriormente here ) 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 compilará y ejecutará la prueba. Si tiene varias pruebas, entonces deberá usar DEPENDS exe1 exe2 exe3 ...
en la línea anterior.
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).
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 objetivos. 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 <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")
Esto significa que la prueba consiste en construir (opcionalmente) y ejecutar un objetivo ejecutable.
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 compilaciones de depuración y liberación fuera de árbol (y compilació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