3

我想在一个 monorepo 中使用测试框架Catch2,其中将有许多组件,每个组件都有自己的测试。我想使用 CMake 来定义所有构建目标。

Catch2提供了一种简单的方法来生成一个通用main()函数,该函数将运行链接到应用程序的所有测试。源文件(我称之为test_main.cpp)就是这两行:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

我想test_main.cpp在我的源代码树中只有一个副本,并从每个包含测试的组件目录中引用它(最终将有数百个目录)。

如果我复制了 CMake,我可以看到如何设置 CMake 以使其工作,test_main.cpp以便在每个带有测试的目录中都存在冗余副本,但我还没有弄清楚如何只有一个副本。有没有我忽略的简单技巧?

4

1 回答 1

2

尝试通过以下方式将 Catch2 集成为 CMake接口库:

将单个头文件添加catch.hpptest_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的包括 Catch2 add_subdirectory

add_subdirectory(Catch2)

然后,您可以通过以下方式在项目中的任何位置设置测试可执行文件:

add_executable(
    project_tests EXCLUDE_FROM_ALL
    test_case1.cpp
    test_case2.cpp
    ...
)

target_link_libraries(project_tests catch)

因为test_main.cppcatch作为接口源文件添加,所以将作为测试可执行文件的一部分进行编译。

于 2018-03-16T08:17:56.027 回答