que utilizan una variante de la respuesta de richq. En el nivel superior CMakeLists.txt
, añado un objetivo de encargo, build_and_test
, para crear 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 sub-proyecto CMakeLists.txt
archivos bajo test/
, agrego cada ejecutable de prueba como una dependencia del 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, sólo tengo que make build_and_test
en lugar de make test
(o make all test
), y tiene la ventaja de tan sólo la construcción de 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 fuera de árbol (y compilación cruzada) llamando al cmake
y luego al make
, y traduce 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 permitir que utilice ctest -V
, que muestra la salida de prueba Google, mientras que las pruebas se ejecutan:
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
respuesta perfecta, gracias :) – claf
así que supongo que el objetivo de "hacer la prueba" permanecerá sin uso, ya que parece que hay que elegir un nombre de destino diferente ine el comando add_custom_target? – claf
Sí. La única diferencia entre "make test" y "make check" es que el primero muestra "Running tests ..." primero y no comprueba ninguna dependencia de compilación. – richq