我想问一下您在单元测试应用程序中获取测试源的经验。以下结构
NiceLib
|-src
|- MyNiceClass.h
|- MyNiceClass.cpp
|- CMakeLists.txt
|-test
|- tester_MyNiceClass.cpp
|- main.cpp
|- CMakeLists.txt
在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)
第二个解决方案是:
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)
您的经验是什么?您有任何最佳实践或其他解决方案吗?
答案 0 :(得分:3)
您的经验是什么?您有任何最佳实践或其他解决方案吗?
我使用 两种变体 (成功),但 哪一种最适合取决于具体情况 。如果你只需要一个单独的课程,但是你的图书馆包含了相当多的其他内容,那么这可能是一种矫枉过正。没有一般的"最佳解决方案" 。
我个人建议您只选择最适合您需求的产品。以后在两者之间切换都没问题。
然而,更好的不将普通源文件集成到测试中,因为它们必须多次编译(对于每个测试+生产代码) 。您只需包含实际的对象文件,然后只编译一次。这也为您提供了更多的灵活性和更好的CMake依赖管理。
因此,我使用的是以下两种变体:
这与您的第一个选项相同。
构建库:
add_library(dependencies-lib Src1.cpp Src2.cpp)
链接到测试:
# create test target ...
add_executable(exampletest SomeTests.cpp)
target_link_libraries(exampletest dependencies-lib)
这与选项1 几乎相同,但您可以非常有选择性。但是,它会阻止多个编译普通源文件方法。
构建对象库:
add_library(dependencies-lib OBJECT Src1.cpp Src2.cpp)
# ^^^^^^
将对象添加到测试中:
# create test target ...
add_executable(exampletest SomeTests.cpp
$<TARGET_OBJECTS:dependencies-lib> # <-- !!
)
如您所见,您不将其作为库链接,而是使用编译的目标文件。即使许多其他目标需要这些目标,它们也仅编译一次。顺便说一句。您可以轻松地将它们打包到普通的库/可执行文件中(例如,用于生产二进制文件/ 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
# ...
)