2009-04-09 21 views
69

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

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

Respuesta

54

Es discutible un bug in CMake (previamente rastreados here) que esto no funciona fuera de la caja. Una solución consiste en hacer lo siguiente:

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

continuación, puede ejecutar make check y va a compilar y ejecutar la prueba. Si tiene varias pruebas, entonces deberá usar DEPENDS exe1 exe2 exe3 ... en la línea anterior.

+0

respuesta perfecta, gracias :) – claf

+1

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

+0

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

39

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) 
+11

Este es el único que aumenta y no te obliga a construir los objetivos "hacer todos" solo para ejecutar la prueba. Una posible desventaja: los detalles de los errores de compilación en los archivos binarios solo aparecen en el archivo LastTest.log generado y no en stdout/stderr –

+1

¡Buena respuesta! Sin embargo, debe agregar la configuración al objetivo de compilación. De lo contrario, no es posible ejecutar las pruebas en todas las configuraciones. add_test ( nombre "{} argv0 _BUILD $" comando "$ {} CMAKE_COMMAND" --build $ {} CMAKE_BINARY_DIR --target $ {target} "--config" "$ " ) – Daniel

+0

Esto obstruye el reportero de prueba con un montón de pruebas falsas. – Barry

-2

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

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

A continuación, ejecute cmake y hacen para construir los objetivos. Después de eso, puede ejecutar prueba de maquillaje, o simplemente correr

ctest 

que conseguirá el resultado. Esto se prueba bajo CMake 2.8.

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

+0

¡esta es la respuesta correcta! – jopasserat

+5

Downvoted porque a veces solo desea crear los objetivos necesarios para las pruebas que realmente se están ejecutando. –

+11

Esta respuesta parece no entender la pregunta: El OP ya está haciendo exactamente lo que recomienda esta respuesta: Usar CTest, 'enable_testing()', 'add_test()', etc. El problema es que tiene que emitir el comando de compilación manualmente para ejecutar pruebas.Él quiere que el objetivo 'make test' construya automáticamente los ejecutables de prueba según sea necesario. – bames53

12

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 
+0

En este ejemplo, ¿hay alguna manera de hacer una prueba para hacer lo que ctest -V hace en lugar de ctest? La salida de ctest parece muy incompleta y solo dice que hay una sola prueba. – Rajiv

5

Si usted está tratando de emular make check, se pueden encontrar este útil entrada de wiki:

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

acabo de haber comprobado que es hace lo que dice con éxito (CMake 2.8.10).

+1

Esto generará todos los ejecutables cuando ejecute 'make check'. Para las pruebas con tiempos de compilación dominantes, esto hace que 'ctest -R' sea inútil. – usr1234567

-3

Todas las respuestas son buenas, pero implican una violación de la tradición de ejecutar una prueba con el 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 la construcción (opcionalmente) y el funcionamiento de la meta ejecutable.

+14

Regla # 1: No use código de shell en cmake :-) – Igor

+5

:-D Regla # 1: No use el sistema sin sh. ¿Conoces ese sistema? – dyomas

+10

Sí, Windows es uno de estos. –

3

ahorrarse el dolor de cabeza:

make all test 

funciona fuera de la caja para mí y va a construir dependencias antes de ejecutar la prueba. Dado lo simple que es esto, casi hace que la funcionalidad nativa make test sea conveniente porque le da la opción de ejecutar las últimas pruebas de compilación incluso si su código está roto.

+1

No funciona con CDash. Tienes que llamar make all && ctest y luego el edificio no es parte de la prueba cargada. Entonces, las advertencias de compilación o los errores no son visibles. – usr1234567

+2

Tampoco funciona bien si desea una compilación paralela, ya que las dos se ejecutarán en paralelo: necesita 'make -j4 all && make test'. Y también es escamosa utilizando una herramienta de compilación que no es Make. – poolie