Используя 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?
Ответы
Ответ 1
Вы можете установить переменную окружения CTEST_OUTPUT_ON_FAILURE
, которая будет отображать любые выходные данные тестовой программы в случае сбоя теста. Один из способов сделать это, используя Makefiles и командную строку, будет следующим:
env CTEST_OUTPUT_ON_FAILURE=1 make check
В этом вопросе и ответе Qaru показано, как устанавливать переменные среды в Visual Studio.
Ответ 2
Вы можете называть ctest
напрямую, после комкования и создания вашего проекта.
ctest --verbose
Ответ 3
-
Вы можете проверить подпапку Testing/Temporary
. Он автоматически создается после запуска make-теста. Эта папка содержит два файла: LastTest.log
и LastTestsFailed.log
. LastTest.log
содержит желаемый результат для тестов на запуск. LastTestFailed.log
содержит имена неудачных тестов. Поэтому вы можете проверить их вручную после выполнения make test
.
-
Второй способ - заставить ctest показывать содержимое файлов журнала после запуска тестов:
-
поместите в build dir (из которого вы запустите make test
) файл CTestCustom.ctest(вы можете сделать это с помощью команды configure file, например) со следующим содержимым
CTEST_CUSTOM_POST_TEST ( "cat Testing/Temporary/LastTest.log" )
Вместо cat вы можете использовать любую команду Windows cmd, которая делает подобные вещи.
- снова запустите
make test
и получите прибыль!
Дополнительная информация о настройке ctest вы можете найти здесь. Просто перейдите к разделу "Настройка cmake".
Удачи!
Ответ 4
Мне пришлось добавить "контрольную" цель самостоятельно. "делать тесты" по какой-то причине ничего не делает. Итак, что я сделал (как было предложено где-то в stackoverflow) - я добавил эту цель вручную. Чтобы получить подробный вывод, я просто написал его как:
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
Ответ 5
make check CTEST_OUTPUT_ON_FAILURE=TRUE
Ответ 6
Существует очень простое решение (которое по некоторым причинам трудно найти с помощью поиска Google):
ctest --output-on-failure
Если вы используете CMake с функцией открытия папки Visual Studio, вы можете добавить
"ctestCommandArgs": "--output-on-failure"
настройка вашей конфигурации сборки.
Ответ 7
Мой подход представляет собой комбинацию ответов от ony, от 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.)
Ответ 8
Это делает вывод теста более подробным:
make test ARGS="-V"
Ответ 9
Для людей, использующих Visual Studio, здесь другая вариация (взлома) на тему:
cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
Ответ 10
чтобы показать результат с XML файлом, вы должны выполнить тест с помощью следующей команды
~$ ctest -T Test
и мы нашли результат в Testing/1234123432/test.xml
и другие файлы тоже генерируются в папке тестирования