Использование cmake как получить подробный вывод из ctest?

Я использую CMake для создания своего проекта. Я добавил двоичный модульный тест, который использует платформу модульного тестирования boost. Этот двоичный файл содержит все модульные тесты. Я добавил, что двоичный файл для запуска CTest:

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

но вывод сборки в Visual Studio показывает только результат запуска ctest:

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

  0% tests passed, 1 tests failed out of 1

Это не очень полезно, потому что я не вижу, что тест не пройден. Если я запускаю ctest вручную из командной строки с --verbose, я получаю вывод из модульного теста boost, который рассказывает, что на самом деле не удалось:

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

Итак, что мне нужно изменить в CMakeLists.txt, чтобы ctest работал с -- verbose все время? Есть ли лучший способ использовать модульные тесты boost с cmake / ctest?

9 ответов


Вы можете установить переменную окружения CTEST_OUTPUT_ON_FAILURE, который покажет вам любой вывод из тестовой программы всякий раз, когда тест терпит неудачу. Один из способов сделать это при использовании Makefiles и командной строки будет следующим:

env CTEST_OUTPUT_ON_FAILURE=1 make check

это так вопрос и ответ показывает, как задать переменные среды в Visual Studio.


  1. вы можете проверить Testing/Temporary папку. Он автоматически создается после запуска make test. Эта папка содержит два файла: LastTest.log и LastTestsFailed.log. LastTest.log содержит желаемый вывод для запуска тестов. LastTestFailed.log содержит имена неудачных тестов. Так что вы можете проверить их вручную после выполнения make test.

  2. второй способ-получить ctest, чтобы показать вам содержимое файлов журнала после запуска тестов:

    1. место в построить dir (от которого вы бежите make test) файл CTestCustom.ctest (вы можете сделать это с помощью настроить файл команда, например) со следующим содержимым

      CTEST_CUSTOM_POST_TEST ("тестирование cat/временное/LastTest.log")

вместо cat вы можете использовать любую команду Windows cmd, которая делает подобные вещи.

  1. run make test еще раз и получить выгода!

дополнительная информация о настройке ctest вы можете найти здесь. Просто перейдите к разделу "настройка cmake". Удачи!


можно назвать ctest сразу, после cmaking и делать ваш проект.

ctest --verbose

мне пришлось добавить "проверить" цель самостоятельно. "сделать тесты" почему-то ничего не делает. Итак, что я сделал (как было предложено где - то на stackoverflow) - я добавил эту цель вручную. Чтобы получить подробный вывод, я просто написал его так:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)

make check CTEST_OUTPUT_ON_FAILURE=TRUE


мой подход представляет собой комбинацию ответов от ony, от Збышек и от КАТП. Я использую ${CMAKE_COMMAND} переменная (которая установлена в абсолютный путь к вызываемому исполняемому файлу cmake) с -E env CTEST_OUTPUT_ON_FAILURE=1 аргумент для вызова фактической команды ctest с помощью ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Чтобы помочь прояснить, что происходит, я начинаю с трех cmake -E echo команды для отображения текущего рабочего каталога и команды ctest для вызова. Вот как я зову. 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
    )

это хорошо играет с MSVC IDE, где любые тестовые ошибки отображаются как кликабельные ошибки компиляции. См. cmake-e env для документирования cmake -E портативном режиме командной строки. Я также добавляю зависимость от ALL_BUILD так что все проекты будут построены перед вызовом check цель. (В сборках Linux может потребоваться заменить ALL_BUILD С ALL; я еще не тестировал это на Linux.)


существует очень простое решение (которое по какой-то причине трудно найти через google):

ctest --output-on-failure

Если вы используете cmake с функцией открытой папки visual studio, вы можете добавить

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

настройка конфигурации сборки.


для людей, использующих Visual Studio, вот еще один вариант (hack) на тему:

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS

это делает тестовый вывод более подробным:

make test ARGS="-V"