Не найдено никаких тестов при использовании gtest с помощью cmake/ctest

У меня есть проект со следующей структурой:

linalg
├── build
├── CMakeLists.txt
├── docs
│   └── Doxyfile
├── include
│   └── linalg
│       └── vector3.hpp
├── src
│   ├── CMakeLists.txt
│   └── linalg
│       └── vector3.cpp
└── test
    ├── CMakeLists.txt
    └── linalg
        └── test_vector3.cpp

Файл test_vector3.cpp является файлом gtest unit test, который предоставляет два простых теста. Верхний уровень CMakeLists.txt просто устанавливает входящие и добавляет подкаталоги src и test:

cmake_minimum_required(VERSION 2.8)

project(linalg)

include_directories(include)
add_subdirectory(src)
add_subdirectory(test)

Файл src/CMakeLists.txt компилирует vector3.cpp в статическую библиотеку:

cmake_minimum_required(VERSION 2.8)

add_library(linalg linalg/vector3.cpp)

Файл test/CMakeLists.txt основан на примере, представленном в /usr/share/cmake -2.8/Modules/FindGTest.cmake:

cmake_minimum_required(VERSION 2.8)

enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

add_executable(test_vector3 linalg/test_vector3.cpp)
target_link_libraries(test_vector3 linalg ${GTEST_BOTH_LIBRARIES} pthread)

add_test(test_vector3 test_vector3)

Затем я запускаю следующее:

cd build
cmake ..
make

Я получаю библиотеку liblinalg.a, скомпилированную правильно для сборки /src, и я получаю исполняемый файл test_vector3, скомпилированный правильно для сборки/тестирования. Я могу запустить исполняемый файл test_vector3, и я получаю вывод от googletest, говорящий, что все тесты прошли, но если я запустил make test, я не получаю никакого вывода, и если я запустил ctest .., я получаю сообщение с сообщением:

Test project /home/ryan/GitHub/linalg/build
No tests were found!!!

Есть ли что-то, что мне не хватает? Или я просто неправильно понял, как ctest работает с gtest?

Ответ 1

Суть проблемы в том, что enable_testing должен быть вызван с вашего CMakeLists.txt на верхнем уровне в этом случае. Добавляя include(CTest) на ваш CMakeLists.txt верхнего уровня, вы должны это исправить.

Это позволит вам удалить вызов enable_testing в test/CMakeLists.txt, поскольку подмодуль CTest вызывает внутри себя enable_testing.

Ответ 2

Просто обновите это.

cmake в версии 3.9 добавила поддержку интеграции GoogleTest с CTest.

Итак, теперь вы можете заставить CTest очистить все тестовые макросы в тестовом исполняемом файле, а не только весь исполняемый файл.

Пример здесь: https://gist.github.com/johnb003/65982fdc7a1274fdb023b0c68664ebe4