如何使用带有 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.cpp
和 CMakeLists.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 到静态库。
我有一个项目(有 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.cpp
和 CMakeLists.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 到静态库。