CTest с несколькими командами

Я строю несколько тестов с помощью CTest. Обычно я могу настроить тест просто по строке:

ADD_TEST(Test_Name executable args)

Однако я столкнулся с проблемой, у меня есть несколько тестов, для которых требуется две команды для ее работы, есть ли способ запустить две программы в рамках одного теста, или мне нужно создать новый тест для каждого?

Спасибо.

Ответ 1

Команда add_test принимает только один исполняемый файл, но вы можете запустить любой исполняемый файл, который действительно является script. Чтобы сделать это кросс-платформенным способом, напишите script в самом CMake. CMake имеет параметр -P для запуска произвольных фрагментов языка сценариев CMake при запуске make или make test, а не во время генерации Makefile.

К сожалению, вы не можете передавать аргументы для такого script. Но вы можете установить переменные в значения, что так же хорошо.

Этот script вы можете вызвать 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 в соответствующие тестовые программы. После этого script выполнит ваши 2 программы в последовательности. Если одна из тестовых программ завершилась неудачей, весь тест завершился неудачно. Если вам нужно увидеть результат теста, вы можете запустить make test ARGS=-V