CTest с несколькими командами
Я строю некоторые тесты, используя CTest. Обычно я могу настроить тест по простой строке:
ADD_TEST(Test_Name executable args)
Тем не менее, я столкнулся с проблемой, у меня есть несколько тестов, которые требуют запуска двух команд для того, чтобы он работал, есть ли способ, которым я могу запустить две программы в одном тесте, или я должен создать новый тест для каждого?
Спасибо.
1 ответ
add_test
Команда принимает только один исполняемый файл, но вы можете запустить любой исполняемый файл, который действительно является скриптом. Чтобы сделать это кроссплатформенным способом, напишите скрипт на самом CMake. CMake имеет -P
опция для запуска произвольных кусков языка сценариев CMake при запуске make
или же make test
, а не во время генерации Makefile.
К сожалению, вы не можете передать аргументы в такой сценарий. Но вы можете установить переменные в значения, что так же хорошо.
Этот скрипт вы можете назвать runtests.cmake
, он запускает команды CMD1 и CMD2 и проверяет каждую на ненулевой код возврата, возвращаясь из самого CMake с ошибкой, если это произойдет:
macro(EXEC_CHECK CMD)
execute_process(COMMAND ${CMD} RESULT_VARIABLE CMD_RESULT)
if(CMD_RESULT)
message(FATAL_ERROR "Error running ${CMD}")
endif()
endmacro()
exec_check(${CMD1})
exec_check(${CMD2})
... а затем добавьте свои тестовые примеры следующим образом:
add_executable(test1 test1.c)
add_executable(test2 test2.c)
add_test(NAME test
COMMAND ${CMAKE_COMMAND}
-DCMD1=$<TARGET_FILE:test1>
-DCMD2=$<TARGET_FILE:test2>
-P ${CMAKE_CURRENT_SOURCE_DIR}/runtests.cmake)
$<TARGET_FILE:test1>
расширяется до полного пути к исполняемому файлу во время создания файла сборки. Когда ты бежишь make test
или эквивалентно, это запустит "cmake -P runtests.cmake", устанавливая переменные CMD1 и CMD2 в соответствующие тестовые программы. Затем скрипт выполнит две ваши программы по очереди. Если любая из тестовых программ не пройдена, весь тест не пройден. Если вам нужно увидеть результаты теста, вы можете запустить make test ARGS=-V
Есть простой, хотя и не кроссплатформенный способ добиться этого.
В Linux вы можете использовать bash для выполнения нескольких команд:
add_test(
NAME
TestName
COMMAND
bash -c "COMMAND1 ; \
COMMAND2 ; \
${CMAKE_CURRENT_BINARY_DIR}/testExecutable"
)