Как получить подробный вывод от CTest с помощью CMake?

109

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

Скрымсли
источник

Ответы:

92

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

env CTEST_OUTPUT_ON_FAILURE=1 make check

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

Richq
источник
3
У меня не работает (ctest версии 2.8.12.1). Я пробовал SET(CTEST_OUTPUT_ON_FAILURE TRUE)и SET(CTEST_OUTPUT_ON_FAILURE ON), но безрезультатно. Другие сообщения в сети подтверждают, что это не работает.
Joachim W
4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)не устанавливает переменную среды . Попробуйте это в командной строке: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
thehouse
3
make CTEST_OUTPUT_ON_FAILURE=1 testкороче и милее ИМО.
Timmmm
В пакетном файле Windows, как использовать CTEST_OUTPUT_ON_FAILURE = 1 при вызове - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral
34

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

ctest --verbose
Хота Сантос
источник
29
  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 («проверка кота / временный / LastTest.log»)

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

  1. make testснова беги и получай прибыль!

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

бедуин
источник
1
Хорошо спасибо. Я надеялся, что появится способ изменить флаги, которые вставляются в файл проекта / makefiles для ctest, но я ничего не нашел, и ваш ответ, похоже, подтверждает это. Информация об имени файла полезна!
Скрымсли
1
где-то в районе ctest 2.8.10 они сломались, используя внешние команды с аргументами в CTEST_CUSTOM_POST_TEST, см. github.com/openscad/openscad/issues/260
don bright
@don: возможно, они не проводят достаточно тестов на ctest ;-)
Joachim W
Эта проблема CMake с CTEST_CUSTOM_POST_TEST исправлена ​​в 2.8.12.
Ela782
23

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

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
только
источник
21

Есть очень простое решение (которое по каким-то причинам сложно найти через поиск Google):

ctest --output-on-failure

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

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

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

MikeMB
источник
1
Мне очень нравится ваше решение; это не многословно, кроме случаев неудачи.
AnthonyD973
19

make check CTEST_OUTPUT_ON_FAILURE=TRUE

Збышек
источник
6
Все голоса против довольно удивительны: это почти эквивалентно принятому ответу, но короче и приятнее. Также работает в тестируемом мной проекте.
zbyszek 08
2
сделать CTEST_OUTPUT_ON_FAILURE = 1 тест
Alex Punnen
11

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

make test ARGS="-V"
Пэнхэ Гэн
источник
10

Мой подход представляет собой комбинацию ответов от оны , из 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
    )

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

Фил
источник
6

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

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
Tarc
источник
0

чтобы показать результат с файлом XML, вы должны выполнить тест с помощью следующей команды

~$ ctest -T Test

и мы обнаружили результат в Testing / 1234123432 / test.xml, и другие файлы также генерируются в папке Testing.

Амируш Зегга
источник
0

ctest -VV или ctest --extra-verbose

Из документации :

Включить более подробный вывод тестов.

Тестовый вывод обычно подавляется, и отображается только сводная информация. Эта опция покажет еще больше результатов теста.

Даниэль Стракабошко
источник