Интеграция 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
,
РЕДАКТИРОВАТЬ: В качестве альтернативы, вы можете сделать так, чтобы cmake загружал Catch с git во время сборки, следуя этим инструкциям с github Catch. Это требует зависимости от GIT, хотя.