C++ CMake:如何为每个测试重用相同的test_main.cpp
我想在monorepo中使用测试框架,其中有许多组件,每个组件都有自己的测试。我想使用CMake来定义所有构建目标 Catch2生成一个通用的C++ CMake:如何为每个测试重用相同的test_main.cpp,c++,cmake,catch-unit-test,C++,Cmake,Catch Unit Test,我想在monorepo中使用测试框架,其中有许多组件,每个组件都有自己的测试。我想使用CMake来定义所有构建目标 Catch2生成一个通用的main()函数,该函数将运行链接到应用程序中的所有测试。源文件(我称之为test\u main.cpp)就是这两行: #define CATCH_CONFIG_MAIN #include "catch.hpp" 我希望在我的源代码树中只有一份test\u main.cpp,并从每个有测试的组件目录中引用它(最终将有数百个目录) 如果我复制了test\u
main()
函数,该函数将运行链接到应用程序中的所有测试。源文件(我称之为test\u main.cpp
)就是这两行:
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
我希望在我的源代码树中只有一份test\u main.cpp
,并从每个有测试的组件目录中引用它(最终将有数百个目录)
如果我复制了
test\u main.cpp
,这样每个目录中都有一个测试的冗余副本,那么我可以看到如何设置CMake来工作,但我还没有弄清楚如何只拥有一个副本。有一个简单的技巧我忽略了吗?尝试以以下方式将Catch2集成为CMake:
add_executable(
project_tests EXCLUDE_FROM_ALL
test_case1.cpp
test_case2.cpp
...
)
target_link_libraries(project_tests catch)
将单个头文件catch.hpp
和test\u main.cpp
与以下CMakeLists.txt
一起添加到它们自己的目录中(例如Catch2
):
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")
然后,您可以通过以下方式在项目中的任何位置设置测试可执行文件:
add_executable(
project_tests EXCLUDE_FROM_ALL
test_case1.cpp
test_case2.cpp
...
)
target_link_libraries(project_tests catch)
由于
test\u main.cpp
已作为接口源文件添加到catch
,因此它将作为测试可执行文件的一部分进行编译。。我将检查catch的逻辑,以找出它在哪里查找测试源。由于它们都是纯C代码(即Catch似乎只有在编译之后才会生效),我想这就像在项目中添加另一个编译单元一样简单。您是否尝试过将test\u main.cpp
添加到每个add\u executable
行中?您可能需要文件的完整路径,但类似于${PROJECT\u SOURCE\u DIR}/test\u main.cpp
(假设您的项目顶层有test\u main.cpp
)的东西应该可以工作。这看起来不错。我会给它尝试和批准的答案后,我已经验证了它的工作。谢谢。事实上,我们不需要复制catch.hpp并将其放入带有test_main.cpp的目录中,我们只需将test_main.cpp放在文件夹中,然后编写CMakeLists.txt,如:``添加库(catch test_main.cpp)目标链接库(catch PUBLIC Catch2::Catch2)```