Я використовую варіант відповіді richq. На верхньому рівні CMakeLists.txt
я додаю власну ціль build_and_test
, для побудови та запуску всіх тестів:
find_package(GTest)
if (GTEST_FOUND)
enable_testing()
add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
add_subdirectory(test)
endif()
У різні CMakeLists.txt
файли підпроектів під test/
, я додаю кожен тестовий виконуваний файл як залежність build_and_test
:
include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)
При такому підході мені просто потрібно make build_and_test
замість make test
(або make all test
), і він має перевагу лише у побудові тестового коду (та його залежностей). Шкода, що я не можу використовувати цільове ім’я test
. У моєму випадку це не так погано, тому що у мене є скрипт верхнього рівня, який виконує налагодження поза деревом і випускає (і перехресно компілюється) збірки, викликаючи cmake
та потім make
, і це перекладається test
в build_and_test
.
Очевидно, що речі GTest не потрібні. Я випадково використовую / подобається Google Test, і я хочу поділитися повним прикладом його використання з CMake / CTest. IMHO, цей підхід також має перевагу, що дозволяє мені використовувати ctest -V
, що показує результати випробувань Google під час запуску тестів:
1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN ] proj1.dummy
1: [ OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [ PASSED ] 1 test.
1/2 Test #1: proj1_test ....................... Passed 0.03 sec