Pregunta CMake y CTest: la prueba de prueba no genera pruebas


Estoy intentando CTest en CMake para ejecutar automáticamente algunas de mis pruebas usando make test objetivo. 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.


76
2018-04-09 09:22


origen


Respuestas:


Es discutiblemente un error en CMake (rastreado previamente 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)

Entonces puedes correr make check y compilará y ejecutará la prueba. Si tienes varias pruebas, entonces deberías usar DEPENDS exe1 exe2 exe3 ... en la línea de arriba.


58
2018-04-10 05:57



De hecho, hay una manera 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)

43
2018-05-30 21:32



Yo uso una variante de la respuesta de richq. En el nivel superior CMakeLists.txt, Agrego un objetivo personalizado, build_and_test, para construir 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 en 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 el nombre de destino test. 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 (y compilación cruzada) fuera de árbol al llamar cmake y entonces makey se traduce test dentro 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 el beneficio 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

11
2018-02-25 05:53



Si estás tratando de emular make check, puedes 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).


5
2018-03-12 16:08



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 el nativo make test funcionalidad conveniente porque le da la opción de ejecutar las últimas pruebas de compilación, incluso si su código está roto.


4
2018-04-04 08:48



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)

Entonces corre cmake y hacer para construir los objetivos. Después de eso, puedes ejecutar hacer la prueba, o simplemente corre

ctest

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

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


-2
2017-08-24 14:20



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.


-4
2018-05-20 13:25