我想在monorepo中使用测试框架Catch2,其中将有许多组件,每个组件都有自己的测试。我想使用CMake来定义所有构建目标。
Catch2 provides a simple means生成一个公共main()
函数,该函数将运行链接到应用程序的所有测试。源文件(我称之为test_main.cpp
)只是这两行:
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
我想在源代码树中只有test_main.cpp
的一个副本,并从每个具有测试的组件目录(最终将是数百个目录的顺序)中引用它。 / p>
如果我复制了test_main.cpp
,我可以看到如何设置CMake工作,以便每个目录中都有一个冗余副本进行测试,但我还没弄明白如何只有一个副本。是否有一个我忽略的简单技巧?
答案 0 :(得分:1)
尝试以下列方式将Catch2集成为CMake interface library:
将单个标题文件catch.hpp
和test_main.cpp
添加到他们自己的目录(例如Catch2
)以及以下CMakeLists.txt
:
add_library(catch INTERFACE)
target_include_directories(catch INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
target_sources(catch INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/test_main.cpp")
最外面的CMakeLists.txt
包含带有add_subdirectory
的Catch2:
add_subdirectory(Catch2)
然后,您可以通过以下方式在项目中的任何位置设置测试可执行文件:
add_executable(
project_tests EXCLUDE_FROM_ALL
test_case1.cpp
test_case2.cpp
...
)
target_link_libraries(project_tests catch)
由于test_main.cpp
已作为接口源文件添加到catch
,因此它将作为测试可执行文件的一部分进行编译。