Используя CMake, как мне получить подробный вывод из CTest? - PullRequest
85 голосов
/ 19 апреля 2011

Я использую 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 ]

73 голосов
/ 22 апреля 2011

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

env CTEST_OUTPUT_ON_FAILURE=1 make check

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

29 голосов
/ 15 июля 2016

Вы можете позвонить ctest напрямую, после создания и создания вашего проекта.

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

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

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

      CTEST_CUSTOM_POST_TEST ("cat Testing / Temporary / LastTest.log")

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

снова запустите make test и получите прибыль!

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

20 голосов
/ 05 апреля 2013

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

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
15 голосов
/ 10 февраля 2015

make check CTEST_OUTPUT_ON_FAILURE=TRUE

13 голосов
/ 23 февраля 2018

Существует очень простое решение (которое по некоторым причинам трудно найти с помощью поиска Google):

ctest --output-on-failure

Если вы используете CMake с функцией открытия папки Visual Studio, вы можете добавить

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

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

10 голосов
/ 29 июня 2015

Мой подход - это комбинация ответов от , от zbyszek и от tarc .Я использую переменную ${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
    )

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

6 голосов
/ 09 мая 2016

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

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
5 голосов
/ 11 сентября 2018

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

make test ARGS="-V"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...