Интеграция Catch lib (модульное тестирование) и CTest (CMake)

Я ищу успешный пример Catch CatchLib интеграция с тестом CMake (Ctest). как я понимаю, это дополнительный скрипт cmake, который должен анализировать выход приложения? Кто-то уже написал это? наверное, поделился этим?

==================================================

обновление (решение найдено) :

Я совершил С CMake скрипт для CatchLib, для интеграции Catch с CTest. это упрощенная версия скрипта cmake Fraser99 здесь

2 ответов


интеграция Catch с CMake довольно проста, так как это библиотека только для заголовков.

вот краткое изложение того, что вам нужно сделать:

вы можете либо предположить, что источники Catch уже установлены на машине сборки, либо использовать ExternalProject для извлечения их как часть процесса построения.

в любом случае вы получите файлы заголовков Catch в некотором известном каталоге на вашей машине сборки. Я бы рекомендовал создать цель интерфейса для предоставления этой информации вашим тестовым исполняемым файлам:

add_library(Catch INTERFACE)
target_include_directories(Catch INTERFACE ${YOUR_CATCH_INCLUDE_DIR})

таким образом, Вы можете просто указать Catch как зависимость от target_link_libraries:

add_executable(my_test ${MY_TEST_SOURCES})
target_link_libraries(my_test Catch)

как обычно с CMake, например, add_test заботится о введении тестов в CTest:

enable_testing()
add_test(NAME MyAwesomeTest COMMAND my_test)

и это уже все. Запустить make test на построенном проекте для запуска тестов.

у меня есть проект на Github что это, если вам нужно увидеть полный рабочий пример.


EDIT2: в эти дни Catch2 устанавливает свой собственный модуль cmake, поэтому после установки его можно использовать в другом проекте cmake с

include(GNUInstallDirs)
find_package(Catch2 REQUIRED)

вы можете сделать свой проект CMake зависит от Catch используя find_package. Таким образом, Вы не включаете Catch себя и можете обновлять его самостоятельно. Процесс объясняется в этот рецепт, за исключением этого случая, вам не нужно иметь дело с библиотеками, так как Catch является заголовком только.

CMakeLists.txt (предполагая, что у вас есть FindCatch.с CMake на месте [см. ниже] и ваши тесты в my_tests.cpp):

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/")
find_package(Catch REQUIRED)

include_directories(${CATCH_INCLUDE_DIRS})

add_executable(my_tests my_tests.cpp)
add_test(NAME MyTests COMMAND my_tests)

пример my_tests.cpp:

#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main()
#include "catch/catch.hpp"

#include "stuff_to_test.h"

TEST_CASE("A test case")
{
  ...
}

...

вам нужно будет добавить FindCatch.с CMake модуль для вашего проекта, под cmake/Modules. Поиск в интернете для FindCatch.с CMake.

наконец, вы можете создавать и запускать тесты с помощью make test.


EDIT: в качестве альтернативы, вы можете иметь CMake скачать Catch от git во время сборки, следуя эти инструкции из GitHub улова. Однако это требует зависимости от git.