Usando cmake ¿cómo obtengo una salida detallada de ctest?
(8)
Puede verificar la subcarpeta
Testing/Temporary
. Se crea automáticamente después de ejecutar make test. Esta carpeta contiene dos archivos:LastTest.log
yLastTestsFailed.log
.LastTest.log
contiene el resultado deseado para las pruebas de ejecución.LastTestFailed.log
contiene nombres de pruebas fallidas. Entonces puede verificarlos manualmente después de ejecutarmake test
.La segunda forma es hacer que ctest le muestre el contenido de los archivos de registro luego de ejecutar las pruebas:
colocar en el archivo build dir (desde el que ejecuta
make test
) el archivo CTestCustom.ctest (puede hacerlo con configure file command, por ejemplo) con los siguientes contenidosCTEST_CUSTOM_POST_TEST ("cat Testing / Temporary / LastTest.log")
En lugar de cat, puedes usar cualquier comando cmd de Windows que haga cosas similares.
- ejecutar
make test
nuevo y obtener ganancias!
información adicional sobre la personalización de ctest que puede encontrar here . Solo paso a la sección "Personalizar cmake". ¡Buena suerte!
Estoy usando CMake para construir mi proyecto. He agregado un binario de prueba unitaria que está utilizando el marco de prueba de la unidad de impulso. Este binario contiene todas las pruebas unitarias. He agregado ese binario para ser ejecutado por CTest:
ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)
pero el resultado de 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 con --verbose obtengo el resultado de la prueba de unidad de refuerzo que dice qué falló realmente:
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 el CMakeLists.txt para que ctest se ejecute con --verbose en todo momento? ¿Hay alguna forma mejor de usar las pruebas de la unidad impulsora con cmake / ctest?
Hay una solución muy simple (que por alguna razón es difícil de encontrar a través de google):
ctest --output-on-failure
Si usa cmake con la función de carpeta abierta de Visual Studio, puede agregar
"ctestCommandArgs": "--output-on-failure"
configurando a su configuración de construcción.
Mi enfoque es una combinación de las respuestas de ony , de zbyszek y de tarc . Uso la variable ${CMAKE_COMMAND}
(que se establece en la ruta absoluta al ejecutable cmake invocado) con el argumento -E env CTEST_OUTPUT_ON_FAILURE=1
para invocar el comando real ctest utilizando ${CMAKE_CTEST_COMMAND} -C $<CONFIG>
. Para ayudar a aclarar lo que está sucediendo, comienzo con tres comandos cmake -E echo
para mostrar el directorio de trabajo actual y el comando ctest que se 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 el IDE de MSVC donde los errores de prueba se muestran como errores de compilación seleccionables. Consulte cmake -E env para ver la documentación del modo de herramienta de línea de comando portátil cmake -E
. También agrego una dependencia en ALL_BUILD
para que todos los proyectos se construyan antes de invocar el objetivo de check
. (En las compilaciones de Linux, puede ser necesario reemplazar ALL_BUILD
con ALL
; aún no lo he probado en Linux).
Para las personas que usan Visual Studio, aquí otra variación (hack) sobre el tema:
cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
Puede establecer la variable de entorno CTEST_OUTPUT_ON_FAILURE
, que le mostrará cualquier resultado del programa de prueba cada vez que falle la prueba. Una forma de hacerlo cuando utilice Makefiles y la línea de comando sería la siguiente:
env CTEST_OUTPUT_ON_FAILURE=1 make check
Esta pregunta y respuesta de SO muestra cómo establecer variables de entorno en Visual Studio.
Puede llamar a ctest
directamente, después de hacer cmaking y hacer su proyecto.
ctest --verbose
Tuve que agregar el objetivo "verificar" solo. "hacer pruebas" no hace nada por alguna razón. Entonces, ¿qué hice? (Como sugerí en algún lugar de ): agregué este objetivo manualmente. Para obtener una salida detallada, la escribí como:
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
make check CTEST_OUTPUT_ON_FAILURE=TRUE