Pet*_*rNL 4 c++ unit-testing cmake
我想问一下您在单元测试应用程序中获取经过测试的源的经验。以下结构
NiceLib
|-src
|- MyNiceClass.h
|- MyNiceClass.cpp
|- CMakeLists.txt
|-test
|- tester_MyNiceClass.cpp
|- main.cpp
|- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
在 src 中编译了一个库。在测试中,构建了一个测试可执行文件。在测试应用程序中实现 MyNiceClass.cpp 的最佳实践是什么。目前我知道两个选项。选项一是链接到测试可执行文件中的库。test\CMakeLists.txt 看起来像:
enable_testing()
include_directories(../src/)
add_executable(tester_NiceLib
main.cpp
tester_MyNiceClass.cpp
)
add_test(NicLibTest tester_NiceLib)
target_link_libraries(tester_NiceLib NiceLib)
Run Code Online (Sandbox Code Playgroud)
第二种解决方案是:
enable_testing()
include_directories(../src/)
add_executable(tester_NiceLib
main.cpp
tester_MyNiceClass.cpp
../src/MyNiceClass.h
../src/MyNiceClass.cpp
)
add_test(NicLibTest tester_NiceLib)
Run Code Online (Sandbox Code Playgroud)
您的经验是什么?您有任何最佳实践或其他解决方案吗?
您的经验是什么?您有任何最佳实践或其他解决方案吗?
我使用这两种变体(成功),但哪一种最适合取决于具体情况。如果您只需要一个类,但您的库包含大量其他内容,那么这可能是一种矫枉过正。没有通用的“最佳解决方案”。
我个人建议您简单地选择最适合您需求的东西。以后在两者之间切换都没有问题。
但是,最好不要将纯源文件集成到测试中,因为它们必须多次编译(对于每个测试 + 生产代码)。您可以简单地包含实际的对象文件,并且只编译一次。这也为您提供了更大的灵活性和更好的 CMake 依赖管理。
因此,这是我使用的两个变体:
这与您的第一个选项相同。
构建库:
add_library(dependencies-lib Src1.cpp Src2.cpp)
Run Code Online (Sandbox Code Playgroud)
测试链接:
# create test target ...
add_executable(exampletest SomeTests.cpp)
target_link_libraries(exampletest dependencies-lib)
Run Code Online (Sandbox Code Playgroud)
这几乎与选项 1相同,但您可以非常有选择性。但是,它阻止了纯源文件方法的多重编译。
构建对象库:
add_library(dependencies-lib OBJECT Src1.cpp Src2.cpp)
# ^^^^^^
Run Code Online (Sandbox Code Playgroud)
向测试添加对象:
# create test target ...
add_executable(exampletest SomeTests.cpp
$<TARGET_OBJECTS:dependencies-lib> # <-- !!
)
Run Code Online (Sandbox Code Playgroud)
如您所见,您没有将其链接为库,而是使用编译后的目标文件。即使许多其他目标需要这些,它们也只编译一次。顺便提一句。您可以轻松地将它们打包到一个普通的库/可执行文件中(例如,用于生产二进制文件/lib):
add_library(all-together-lib Source1.cpp
Source2.cpp
# ...
$<TARGET_OBJECTS:dependencies-lib>
$<TARGET_OBJECTS:dependencies-lib2>
$<TARGET_OBJECTS:dependencies-lib3>
$<TARGET_OBJECTS:dependencies-and-many-more>
# ...
# And some more source files ...
Example1.cpp
Example2.cpp
# ...
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |