Тесты

Для написания тестов мы используем фреймворк GTest.

Тесты хранятся в отдельной директории:

. 
└── math-eigen / 
├── include 
├── src 
├── tests/                # директория с тестами (отдельный проект)
| ├── CMakeLists.txt      # CMakeLists для тестов
| ├── test1.cc            # файл с тестами
| ├── test2.cc            # файл с тестами
└── CMakeLists.txt

Рассмотрим на примере библиотеки math:

CMakeLists.txt основонго проекта:

option(MATH_TESTS "Enable integration tests" OFF) # опция включения тестов
...
if(MATH_TESTS)
  enable_testing()
  add_subdirectory(tests) # добавление директории с тестами 
endif()
...
unset(MATH_TESTS CACHE)
...

CMakeLists.txt директории tests

find_package(GTest REQUIRED) 
 
file(GLOB TEST_SOURCES "*.cc") # группировка всех файлов *.сс в директории
 
add_executable(${PROJECT_NAME}-test) # создание таргета(имя исполняемого файла)
set_target_properties(${PROJECT_NAME}-test PROPERTIES # установка стандарта
  CXX_STANDARD 20
  CXX_STANDARD_REQUIRED ON
  CXX_EXTENSIONS OFF
)
 
target_sources(${PROJECT_NAME}-test PRIVATE ${TEST_SOURCES}) # задание исходников
 
target_link_libraries(${PROJECT_NAME}-test 
  PRIVATE
  GTest::Main # библиотека gtest
  ${PROJECT_NAME} # библиотека, которую тестируем
)
# на windows частичное копирование библиотек для исполняемого файла
if(WIN32)
  add_custom_command(TARGET ${PROJECT_NAME}-test
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}-test> $<TARGET_FILE_DIR:${PROJECT_NAME}-test>
    COMMAND_EXPAND_LISTS
  )
 
  # copy lib${PROJECT_NAME}.dll folder with ${PROJECT_NAME}-test.exe
  if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    message(STATUS "copying ${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.dll to ${CMAKE_CURRENT_BINARY_DIR}/lib${PROJECT_NAME}.dll")
    add_custom_command(TARGET ${PROJECT_NAME}-test
      POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.dll" "${CMAKE_CURRENT_BINARY_DIR}/lib${PROJECT_NAME}.dll"
      COMMAND_EXPAND_LISTS
    )
  endif()
endif()