enable_testing() activates testing support. add_test(NAME name COMMAND cmd) registers a test that CMake/CTest will run. Tests are commands; their exit code determines pass (0) or fail (non-zero).
Basic setup:
cmake_minimum_required(VERSION 3.20) project(MyApp) enable_testing() add_executable(test_app test.cpp) add_test(NAME MyTest COMMAND test_app)
Running tests:
cmake --build . --target test # or ctest ctest -V # verbose: show output ctest -R pattern # run matching tests ctest -j 4 # run 4 tests in parallel
Multiple tests:
enable_testing() add_executable(test_math test_math.cpp) add_test(NAME MathTest COMMAND test_math) add_executable(test_string test_string.cpp) add_test(NAME StringTest COMMAND test_string)
Test with framework (example: Google Test / gtest):
find_package(GTest REQUIRED) add_executable(test_app test.cpp) target_link_libraries(test_app PRIVATE GTest::gtest GTest::gtest_main) add_test(NAME GoogleTests COMMAND test_app)
Test properties:
add_test(NAME MyTest COMMAND test_app) set_tests_properties(MyTest PROPERTIES TIMEOUT 10 # timeout after 10 seconds DEPENDS OtherTest # run after OtherTest LABELS unit # label for filtering ) ctest -L unit # run tests labeled "unit"
Working directory:
add_test(NAME FileTest COMMAND test_app WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/test_data)
Conditional tests:
if(BUILD_TESTING) enable_testing() add_executable(test_app test.cpp) add_test(NAME MyTest COMMAND test_app) endif()
Then build with:
cmake -DBUILD_TESTING=ON ..
Tests typically live in a tests/ or test/ subdirectory:
# CMakeLists.txt add_subdirectory(tests) # tests/CMakeLists.txt enable_testing() add_executable(test_unit unit.cpp) add_test(NAME UnitTests COMMAND test_unit)
Testing is essential for catching regressions. Enable it early and run tests frequently. CMake integrates with CTest (test runner) and CPack (installer), so test results can be submitted to a dashboard.