如何使用带有 qt 和 trompeloeil 的 catch2 创建用于创建测试可执行文件的模板?

How to create a template for creating a test executable using catch2 with qt and trompeloeil?

我有一个项目(有 main.cpp 和一些 header。是的,它是一个 Catch2 测试项目,如本 blog 中所述)。它编译并运行。

我的问题是:除非我添加更多源文件(我的测试用例),否则这个项目没有任何用处。 这些源文件使用项目中的一个 header 并引入一些其他依赖项(我要测试的库)。

简单的解决方案是复制此项目,添加所需的文件,然后我们就完成了。

有没有更好的方法?目前使用 qmake 我在 catch.pri 文件中定义了项目。通过将其包含在一个项目中,我拥有了 qt 和 catch2 设置的所有内容,并且只需要通过修改 SOURCES-Variable 和要测试的代码的依赖项来定义带有测试用例的文件。

将此映射到 CMake 让我提出问题:

首先:当我包含一行时:

add_executable(tests main.cpp ${SOURCES})

我可以在后面的行中定义 SOURCES 吗?

第二个也是更重要的一点:这样做是个好主意吗?

Is there a better way?

不,这通常是做事的方式。使用 .pri 文件包含任何库/子项目。当然,您可以将子项目设为 git-子模块。

Can I define SOURCES in a later line?

简答:否

示例:

假设我们有一个包含单个文件 a.cppCMakeLists.txt 的小项目,如下所示:

cmake_minimum_required(VERSION 3.12)
project(testing)
add_executable(testing ${sources})
#defining ${sources} later
set(sources a.cpp)

如果您尝试构建它,将导致错误:

No SOURCES given to target: testing

我假设您想将 sources 变量的定义分离到一个单独的文件中。在那种情况下,我们可以解决这个问题如下。假设我们有一个目录结构如下:

src/
|--lib/
|--tests/
|---- CMakeLists.txt
CMakeLists.txt
main.cpp

我们的 cmake 文件将与以前相同,但有这些额外的更改 before add_executable:

add_subdirectory(tests)

tests/ 内的 CMakeLists.txt 文件中,您可以定义 ${SOURCES} 变量:

set(SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/test.cpp
    PARENT_SCOPE
)

注意这里需要PARENT_SCOPE才能让这个SOURCES变量对父目录可见,在我们的例子中是src/

现在在我们的主 CMakeLists.txt 中我们可以使用这个变量:

add_executable(tests ${SOURCES})

Second and more important: Is it a good idea to do it this way?

视情况而定。如果您有一个简单的单目录项目,则没有必要。如果你有多个目录,那么当然,每个目录都应该有自己的 CMake 文件来定义它自己的变量。 CMake 文件是代码,它们应该被视为代码,这意味着它们应该是干净的、模块化的和可读的。

Can I define SOURCES in a later line?

是的,但不是您完成的方式。您可以使用一些来源或 no 个来源定义您的可执行目标 tests,但您始终可以稍后使用 target_sources 命令附加更多来源。

add_executable(tests main.cpp)

...

# Later in the CMake file (or in another CMake file added via 'add_subdirectory').
target_sources(tests PRIVATE
    MyTestClass1.cpp
    MyTestClass2.cpp
    ...
)

您稍后可以使用 target_compile_options 类似地向此 tests 目标添加编译标志,并使用 target_link_libraries 添加对 link 至 tests 的依赖项。

将 test_template 定义为静态库并没有错,它提供了 main.cpp.

通过这种方式,我将测试定义为新的可执行文件,带有测试文件、库依赖项等等,而且只需要 link 到静态库。