I have a CMake project separated in three parts:
My question is about the 2nd part. My unit tests executables are short binary programs with a main
returning 0 on success, 1 on fail. I would like to integrate their running as part of the build.
Is it possible to use CMake to do one of those two solutions:
I'm not looking for a complete CMake script code, a simple indication on what is possible with a link to corresponding documentation would be enough.
See a similar problem and my answer here.
Mainly my recommendation is to add a POST_BUILD
step to your unit test targets that runs ctest
. If a POST_BUILD
step does fail (return code is not 0), the build will fail.
Something like:
set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_command(
TARGET ${UNIT_TEST}
COMMENT "Run tests"
POST_BUILD
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> -R "^${UNIT_TEST}$" --output-on-failures
)
This has the advantage that it runs like you would call ctest
.
The short version - without add_test()
/ ctest
- would be:
set(UNIT_TEST MyLibUnitTestTargetName)
add_custom_command(
TARGET ${UNIT_TEST}
COMMENT "Run tests"
POST_BUILD
COMMAND ${UNIT_TEST}
)
References:
add_test()
add_custom_command()
If you want your test binary to be preserved, even if tests fail, you can try something like this:
set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_target(run_unit_test ALL
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
DEPENDS ${UNIT_TEST})
This will create a target that always runs your unit tests. However, because it's a separate target failure of that command will result in build failure, but not in removing the binary produced by your original UNIT_TEST
target.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With