Usando CMake, ¿cómo obtengo una salida detallada de CTest?

109

Estoy usando CMake para construir mi proyecto. He agregado un binario de prueba unitaria que utiliza el marco de prueba unitario Boost. Este binario contiene todas las pruebas unitarias. He agregado ese binario para que lo ejecute CTest:

ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)

Pero el resultado de la compilación en Visual Studio solo muestra el resultado de ejecutar CTest:

      Start 1: UnitTests
  1/1 Test #1: UnitTests ................***Failed    0.05 sec

  0% tests passed, 1 tests failed out of 1

Esto no es muy útil, porque no puedo ver qué prueba falló. Si ejecuto ctest manualmente desde la línea de comando --verbose, obtengo el resultado de una prueba unitaria de Boost que dice lo que realmente falló:

1: Test command: tftest.exe
1: Test timeout computed to be: 9.99988e+006
1: Running 4 test cases...
1: test-main.cpp(20): error in "sanity_check3": check 1 == 2 failed
1:
1: *** 1 failure detected in test suite "Master Test Suite"
1/1 Test #1: UnitTests ................***Failed    0.00 sec

Entonces, ¿qué necesito cambiar en CMakeLists.txt para que CTest se ejecute --verboseen todo momento? ¿Existe una mejor manera de usar las pruebas unitarias de Boost con CMake / CTest?

Skrymsli
fuente

Respuestas:

92

Puede establecer la variable de entorno CTEST_OUTPUT_ON_FAILURE, que le mostrará cualquier resultado del programa de prueba cuando la prueba falle. Una forma de hacer esto al usar Makefiles y la línea de comando sería la siguiente:

env CTEST_OUTPUT_ON_FAILURE=1 make check

Esta pregunta y respuesta de Stack Overflow muestra cómo establecer variables de entorno en Visual Studio.

richq
fuente
3
No me funciona (ctest versión 2.8.12.1). Lo intenté SET(CTEST_OUTPUT_ON_FAILURE TRUE)y SET(CTEST_OUTPUT_ON_FAILURE ON), pero no tuvo ningún efecto. Otros informes en la web corroboran que esto está roto.
Joachim W
4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)no establece una variable de entorno . Pruebe esto en la línea de comandos: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
thehouse
3
make CTEST_OUTPUT_ON_FAILURE=1 testes más corto y agradable en mi opinión.
Timmmm
En el archivo por lotes de Windows, cómo usar CTEST_OUTPUT_ON_FAILURE = 1 mientras se llama - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral
34

Puede llamar ctestdirectamente, después de hacer cmaking y realizar su proyecto.

ctest --verbose
Jota Santos
fuente
29
  1. Puede consultar la Testing/Temporarysubcarpeta. Se crea automáticamente después de ejecutar make test. Esta carpeta contiene dos archivos: LastTest.logy LastTestsFailed.log. LastTest.logcontiene la salida deseada para ejecutar pruebas. LastTestFailed.logcontiene nombres de pruebas fallidas. Para que pueda verificarlos manualmente después de ejecutar make test.

  2. La segunda forma es hacer que ctest le muestre el contenido de los archivos de registro después de ejecutar las pruebas:

    1. colocar en el directorio de compilación (desde el cual se ejecuta make test) el archivo CTestCustom.ctest (puede hacerlo con el comando configure file , por ejemplo) con los siguientes contenidos

      CTEST_CUSTOM_POST_TEST ("Prueba de gato / Temporal / Última prueba.log")

En lugar de cat, puede usar cualquier comando cmd de Windows que haga cosas similares.

  1. ¡Corre de make testnuevo y obtén ganancias!

Puede encontrar información adicional sobre cómo personalizar ctest aquí . Simplemente pase a la sección "Personalización de cmake". ¡Buena suerte!

beduino
fuente
1
Bien gracias. Esperaba que hubiera una manera de modificar las banderas que se insertan en el proyecto / archivos MAKE para ctest, pero no encontré nada y su respuesta parece confirmarlo. ¡La información del nombre del archivo es útil!
Skrymsli
1
en algún lugar alrededor de ctest 2.8.10 se han roto usando comandos externos con argumentos en CTEST_CUSTOM_POST_TEST ver github.com/openscad/openscad/issues/260
don bright
@don: tal vez no estén ejecutando suficientes pruebas en ctest ;-)
Joachim W
Ese problema de CMake con CTEST_CUSTOM_POST_TEST se solucionó en 2.8.12.
Ela782
23

Tuve que agregar el objetivo de "verificación" por mí mismo. "hacer pruebas" no hace nada por alguna razón. Entonces, lo que hice (como se sugirió en algún lugar de stackoverflow): agregué este objetivo manualmente. Para obtener un resultado detallado, lo escribí como:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
ony
fuente
21

Existe una solución muy simple (que por alguna razón es difícil de encontrar a través de la Búsqueda de Google):

ctest --output-on-failure

Si usa CMake con la función de carpeta abierta de Visual Studio, puede agregar la

"ctestCommandArgs": "--output-on-failure"

ajuste a su configuración de compilación.

MikeMB
fuente
1
Me gusta mucho tu solución; no es prolijo excepto en caso de falla.
AnthonyD973
19

make check CTEST_OUTPUT_ON_FAILURE=TRUE

zbyszek
fuente
6
Todos los votos negativos son bastante sorprendentes: esto es casi equivalente a la respuesta aceptada, pero más breve y agradable. También funciona en el proyecto que probé.
zbyszek
2
hacer CTEST_OUTPUT_ON_FAILURE = 1 prueba
Alex Punnen
11

Esto hace que la salida de la prueba sea más detallada:

make test ARGS="-V"
Penghe Geng
fuente
10

Mi enfoque es una combinación de las respuestas de ony , de zbyszek y de tarc . Utilizo la ${CMAKE_COMMAND}variable (que se establece en la ruta absoluta al ejecutable cmake invocado) con el -E env CTEST_OUTPUT_ON_FAILURE=1argumento para invocar el comando ctest real usando ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Para ayudar a aclarar lo que está sucediendo, comienzo con tres cmake -E echocomandos para mostrar el directorio de trabajo actual y el comando ctest que se va a invocar. Así es como llamo add_custom_target.

add_custom_target(check 
        ${CMAKE_COMMAND} -E echo CWD=${CMAKE_BINARY_DIR}
        COMMAND ${CMAKE_COMMAND} -E echo CMD=${CMAKE_CTEST_COMMAND} -C $<CONFIG>
        COMMAND ${CMAKE_COMMAND} -E echo ----------------------------------
        COMMAND ${CMAKE_COMMAND} -E env CTEST_OUTPUT_ON_FAILURE=1
            ${CMAKE_CTEST_COMMAND} -C $<CONFIG>
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    DEPENDS ALL_BUILD
    )

Esto funciona bien con MSVC IDE donde los errores de prueba se muestran como errores de compilación en los que se puede hacer clic. Consulte cmake -E env para obtener documentación sobre el cmake -Emodo de herramienta de línea de comandos portátil. También agrego una dependencia ALL_BUILDpara que todos los proyectos se compilen antes de invocar el checkobjetivo. (En las compilaciones de Linux, es posible que deba reemplazarse ALL_BUILDcon ALL; aún no lo he probado en Linux).

Phil
fuente
6

Para las personas que usan Visual Studio, aquí hay otra variación (truco) del tema:

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
Tarc
fuente
0

para mostrar el resultado con archivo XML tienes que ejecutar la prueba con el siguiente comando

~$ ctest -T Test

y encontramos el resultado en Testing / 1234123432 / test.xml y otros archivos también se generan en la Carpeta de prueba

Amirouche Zeggagh
fuente
0

ctest -VV o ctest --extra-verbose

De la documentación :

Habilite una salida más detallada de las pruebas.

La salida de prueba normalmente se suprime y solo se muestra información resumida. Esta opción mostrará aún más resultados de prueba.

Daniel Stracaboško
fuente