How to pass command-line arguments in CTest at runtime

I’ve figured out a way to do it (using the Fundamental theorem of software engineering). It’s not as simple as I’d like, but here it is.

First, create a file ${CMAKE_SOURCE_DIR}/cmake/RunTests.cmake with the content

if(NOT DEFINED ENV{TESTS_ARGUMENTS})
    set(ENV{TESTS_ARGUMENTS} "--default-arguments")
endif()
execute_process(COMMAND ${TEST_EXECUTABLE} $ENV{TESTS_ARGUMENTS} RESULT_VARIABLE result)
if(NOT "${result}" STREQUAL "0")
    message(FATAL_ERROR "Test failed with return value '${result}'")
endif()

Then, when you add the test, use

add_test(
    NAME MyTest
    COMMAND ${CMAKE_COMMAND} -DTEST_EXECUTABLE=$<TARGET_FILE:MyTest> -P ${CMAKE_SOURCE_DIR}/cmake/RunTests.cmake
)

Finally, you can run the test with custom arguments using

cmake -E env TESTS_ARGUMENTS="--custom-arguments" ctest

Note that if you use bash, you can simplify this to

TESTS_ARGUMENTS="--custom-arguments" ctest

There are some problems with this approach, e.g. it ignores the WILL_FAIL property of the tests. Of course I wish it could be as simple as calling ctest -- --custom-arguments, but, as the Stones said, You can’t always get what you want.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)